凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46601
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

前回の続きです。

前回はリレーション型オブジェクト指向がどのようなコードで記述されるかのイメージを提示しましたが、 肝心のオブジェクト指向らしい部分が欠けていました。今回は隠蔽と継承と多態を取り上げます。

リレーション型データ構造における継承

まずは継承からいってみましょう。前回Javaなどのclassを拡張するイメージでtableキーワードを用いていましたが、 これらtableに対してextendsキーワードによる継承を定義します。

public table T1 {
  private int val1;
}

public table T2 extends T1 {
  private int val2;
}

この場合、T2型は親であるT1型に暗黙にキャスト可能です。これはJavaと同じですね。
そして、T1に対してSELECTすることで、T1およびT2から検索することが可能となります。T2に対してのSELECTではT2だけからSELECTされます。

T1に対してSELECTした場合、戻り型はT1の配列となります。

T1[] t1array = T1.SELECT();

リレーション型データ構造における多態

次は多態(ポリモーフィズム)です。
フィールドだけではなく、インスタンスメソッドもまた継承され、T1にメソッドを定義すればT2でも利用可能です。

public class T1 {
  private int value;
  public int getValue() {
    return this.value;
  }
}

public class T2 extends T1 {
  private int exValue;
  @Override
  public int getValue() {
    return this.exValue;
  }
}

となっている場合、

T1 t1 = new T2();
int value = t1.getValue();

と記述することでオーバーライドされたT2のgetValue()が呼び出されることになります。

通常のRDBMSではSELECTなどの処理の際にレコードのデータをもとに選別することになりますが、 レコードにメソッドを持つわけですから、SELECTのWHERE句相当の部分でメソッドの戻り値による条件設定が可能となるでしょう。
その際、この多態性を利用することが出来ることになります。これが非常に面白そうな部分だと思っています。

リレーション型データ構造における隠蔽

通常のオブジェクト指向ではメソッドの属するクラスによってアクセスレベルを定義しています。
通常のRDBMSではこのアクセスレベルは定義できませんが、レコードに対してメソッドを定義できる言語を想定した場合、 同等の意味合いでアクセスレベルを定義してデータの隠蔽(カプセル化)を行うことができます。

privateであるフィールドはそのレコードに定義されたメソッド内部だけからアクセスされるような仕組みに することができるようになることでしょう。

議論を残している部分

今回はとりわけオブジェクト指向とされる部分について簡単に解説してみました。
あまり議論されていない部分としては、SELECTなどの機能性ですね。 SQLにそのまま対応する機能性を持たせればよいのか、どうなのか、よくわかっていません。
ひとつだけ本稿では、クエリー中でレコードに定義されたメソッドを利用できるようになるのではないかという点にのみ触れました。

このような機能性をもつ言語を想定できますが、有用なのか、ナンセンスなのか、 そもそも私の思い描いたリレーション構造+オブジェクト指向というものが成り立つのかどうか。
このあたりは参照実装でも用意することができると議論しやすいのかもしれませんね。

投稿日時 : 2007年11月20日 22:06
コメント
  • # re: リレーション型オブジェクト指向の試案 その2
    れい
    Posted @ 2007/11/20 23:16
    んー。やっぱり何が良いのかわかりません。
    もう続かないのでしょうか?

    参照実装作るのは大変ですから、
    簡単DB操作の見本を作ったりしたらどうでしょう?

    ところで、上の説明だと継承って、1対1の関係でつながれたテーブルみたいですね。
  • # re: リレーション型オブジェクト指向の試案 その2
    れい
    Posted @ 2007/11/21 0:12
    前のエントリのコメントの返事。

    > 「データ構造が違うものを移すのは「常に」大変なのです。」というくだりからすると
    > 変換して乗せることを前提に話をされているのかな?
    > 私が変換しないでのせることを考えているから話が合わないのでしょうか。

    変換しないで載せるということはオブジェクト指向言語にDBエンジンを載せるということですか?
    もしそれができるならRDBMSである必要は無いですよね。
    ODBMSがよいはずです。
    ただODBを言語に載せるにはいくつもの困難があり、まだ発展途上です。
    その一つがLINQです。

    > ここで言うメタデータというのはテーブル側が保持している属性を意味しています?
    > ちょっとイメージが掴みにくくて。

    保持してる属性はデータです。
    メタデータはデータのためのデータですから、
    テーブルの構造とかリレーションのことです。
  • # re: リレーション型オブジェクト指向の試案 その2
    凪瀬
    Posted @ 2007/11/21 0:25
    私もアイデア先行でネタを出していますからどう評価するべきなのか分かっていないのですけどね…。
    そういう意味で研究なのであって。
    もし価値がないということがわかったなら、それはそれで知見を得たということになるのかな、と考えていはいますけども。

    個人的に一番面白いと思うのはレコードにメソッドが持てて、ポリモーフィズムが使える点だと思っています。

    現在のRDBMSの操作がC言語での構造体を関数の引数に渡して処理をすることに相当するとすれば、
    レコードをオブジェクトと捉えてメソッドを持たせることは、
    構造体からオブジェクト指向のクラスというものへの変貌と同じ意味をもつのではないかと考えています。

    そこで初めてレコードへの操作をレコードの具象型による多態として表現できるようになるし、
    隠蔽といった継承階層を基準とした隠蔽の概念が適用できるだろう、と。

    こういった言語があった場合にインピーダンスミスマッチをなくせるかもしれないし、
    既存の言語とは違う、新たなデザインパターンも提唱できるとは思っています。
  • # Javaとデータベースの相性
    かつのりの日記2
    Posted @ 2007/11/22 0:38
    Javaとデータベースの相性
タイトル
名前
Url
コメント