none
言語のSQL的要素 RRS feed

  • 全般的な情報交換

  •  集合操作的要素とは、SQL言語はテーブルの集合操作言語ですが、VB.NETでいうInherits,MyBase,MyClass,Me,Overloads,Overrides,Overridable等のキーワードは、メソッド集合操作と考えられます。Inheritsでメソッドの集合を作ります。ではメソッドで何をするのかという話になりますが、データを格納するPrivateなメモリー変数を操作します。提供されているクラスが、昔でいうライブラリーです。どのように作られているのか想像しながら(おおざっぱでよいです。)考えると理解しやすいです。

    たとえば、提供されているコレクションクラスを継承するとメソッドの集合ができます。と同時にPrivateな配列的な変数も継承します。配列的とは各オブジェクトをポインターでつなぎます。3番目のオブジェクトとは3回チェイン渡りをすればよいのです。Addは1番最後につなげます。Removeは、指定されたオブジェクトをチェインから切きりはなして両どなりをつなげます。このようなPrivateな変数も継承します。あとは、キーワードでメソッドの集合を作り、このメソッドでPrivateな変数を操作して、Propertyでアクセスすればよいのです。

    手続き的要素とは、If文、Loop処理などです。つまり集合操作的要素とは、メソッド群の集合を作ることです。

    この集合の中から必要なメソッドを呼び出して操作する。こう考えるとわりと理解しやすいです。

    2015年4月22日 0:34

すべての返信

  • .NET Framework ではコレクションのクエリ操作を行うため LINQ (統合言語クエリ)が用意されてます。これは集合論を強く意識した設計になっており、結合(Join)・制限(Where)・射影(Select) 等、集合演算を行うメソッドが豊富に用意されてます。ufcpp さんの記事もかなり判りやすいと思います。

    LINQ (ufcppさん:C# によるプログラミング入門) 

    LINQ と集合操作に関しては、以下の記事も参考になるのではないでしょうか。

    集合論とかの演算をC#(LINQ)でどう書くか考えてみた。


    ぜひ 「フォーラムでご質問頂くにあたっての注意点」 もご覧ください https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?forum=announceja

    2015年4月22日 1:44
    モデレータ
  • データベースの操作はSQLでおこないますが、ここではオブジェクト指向言語の継承機能のことです。言語の習得のしずらさは、個々の文法に関しては、こつこつ勉強するしかないと思います。が、1つの方法としてある程度、文法がわかったら(私はまだです。)概念的なものから入いります。

    継承は、クラスのメンバーの集合を作ることです。そういった意味で集合操作、参照のキーワード(InheritsOverrloads,Overrides,Me,MyBase,等々)の構文が多いのです。次の特徴として、型(クラス)です。型は型をネストできます。

    他のプロシージャーにパラメーターで型を渡すことができます。FORTRANには、構造体もありません。原始型しかありません。Cの時代になって、やっと構造体が出てきました。1980年初頭だと思います。C言語の構造体は、原始型のグルーピングです。

    なぜ、アメリカ(Java,VC++,VC#,VBを産んだ国)が、これらの言語を作ったのか、アプリケーション開発が容易になると思ったからです。

    ところが、習得が難しいという弱点があります。

    2015年4月22日 6:00
  • >継承は、クラスのメンバーの集合を作ることです。

    集合というと条件に適するものを集めてくるということになりますが、継承の場合は言葉通り、全てを引き継ぎます。広い意味では集合に含まれるでしょうが、このようなケースに継承という言葉を使うのはちょっと違和感があります。ただ、多重継承が許されていれば少しは理解できますが、C#やVBでは許されていません。
    また、抽象クラスやインターフェースというものも継承できます。この場合、そもそも集めてくる実体がありません。集合というよりはメソッド等の実装の規則を提供しているものと考えられます。
    私の感覚的には継承というのは、継承先から継承元への道筋ができ、継承先と継承元が一体化するというイメージです。継承先と継承元は継承関係で結ばれており、それらは明らかに違ったもの同士です。それにも拘わらず集合という言葉を使うと、継承先と継承元が同一のレベルで集まっているようなイメージが強くなってしまうように感じられ、その点からも違和感があります。集合というよりは結合という言葉の方がまだ合っているように思います。結合という言葉も良くないと思いますが・・・

    >ところが、習得が難しいという弱点があります。

    高度な機能を使うのは確かにそのように思います。しかし、そのような機能を使わなくともプログラムを書くことはできますし、それが実用上問題ないということもあるでしょう。つまり、市販されている書籍のみの知識でも十分にプログラミングは可能だと思います。もちろん、もっと良い組み方はあるでしょう。
    例えばスキーを始めた際にボーゲンでも楽しむことができます。しかし、もっと腕を上げればウェーデルンなど速く、効率的に滑れるようになるのと同じようなものだと思います。つまり、いきなり高度なことはどの分野においても習得が難しいということなんだと思います。一度に全てを習得しなくても始められるのがプログラミング言語だと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月22日 9:00
    モデレータ
  • > 継承は、クラスのメンバーの集合を作ることです。

    汎化という意味ではサブクラスは親クラスの部分集合という捉え方も可能ですが、その理解だけではオブジェクト指向の本質を見誤る可能性が高いです。個人的には、オブジェクト指向(OOP)の本質は 「責務の分割」 にあり、集合論とはかなり離れた立ち位置に存在するものと思っています。
    また 「言語のSQL的要素」 と銘打たれて議論を立ち上げられておりますが、SQLは本来 「リレーショナルモデル」 を操作するために開発された言語であり、クラス階層をSQLに当て嵌めて理解を試みるのは、かなり無理があるといってもいいでしょう。
    だいたい集合であるなら、クラス間のメンバーの集合に対して結合や和・差等の集合演算が用意されててもよさそうなものですが、そのような機能がまったく提供されてないのを見ても押して知るべきだと思います。

    ぜひ 「フォーラムでご質問頂くにあたっての注意点」 もご覧ください https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?forum=announceja


    • 編集済み ひらぽんModerator 2015年4月23日 1:31 一部説明が不足してた部分を修正した
    2015年4月22日 9:16
    モデレータ