「属性」と「関係」

OOP の属性は所有関係であり主従関係にあり, 関係を表すものとしては特殊. そうではなく一般の主従ではない関係を表すことはできないか? という疑問が発端の会話. ちょっと脱線話も入れました.
11
前へ 1 2 ・・ 5 次へ
pokarim @pokarim

@cocoatomo すごくわかります>「夫婦」 僕の方の発端は、ORmapper使ってる時に、オブジェクトの属性を関数と見なすと、集合の圏におけるpullbackになるようなテーブル構造に出会ったときです。

2010-11-23 13:56:49
pokarim @pokarim

@cocoatomo ほんとに詳しく書いていいですか?長いですよ?w あといまさらですが、数学用語関係に関しては突っ込みどころ満載の予感なので適当につっこむなりスルーするなりしてくださいねw

2010-11-23 14:03:50
pokarim @pokarim

@cocoatomo 最初は集合と関数の圏で考えていたのですが、多値のためその他で関係になった感じです。IDや値の集合とそれらの間の、多値をとって多値を返す関数としての関係でデータを表すイメージです。

2010-11-23 14:13:25
非実在naka aki @naka_aki_spl

@cocoatomo 例によって某風の回答を列記します!

2010-11-23 14:13:26
tomo🐧@learning @cocoatomo

@pokarim 大丈夫です。適宜補完や質問します。

2010-11-23 14:13:27
非実在naka aki @naka_aki_spl

「某」風に設計するならHumanクラスをNodeクラスの子孫として作り、 婚姻クラスを関連クラスの子孫として作る。 「class 婚姻 extends Relation left=(Human,"夫"), right=(Human,"妻")」 かな。(文法は忘れたのでテキトウ)

2010-11-23 14:13:54
非実在naka aki @naka_aki_spl

関連クラスは関連させるNodeのクラスを指定できる。 関連先は抽象的に「左右」と呼ばれる。 宣言時に下記のように具体的クラスを指定すれば、 それかそれ以下なクラスのObjしか代入できなくなる。

2010-11-23 14:13:57
非実在naka aki @naka_aki_spl

(某は実装としては弱型言語風だったので「実行時」エラーになるが、あくまで言語の問題。 のちに作られたJavaラッパー生成ツールではJavaの強型にマッピングされたので Javaではコンパイルエラーになる)

2010-11-23 14:14:00
非実在naka aki @naka_aki_spl

で、関連の「それぞれの向き」に対して呼称を設定できる。 単なる呼称なだけじゃなく関連をCRUDするときも使う。 「ある人の夫を検索せよ」「妻を検索せよ」は 「婚姻Relの左右ドッチを検索するか」で制御できる。

2010-11-23 14:14:04
非実在naka aki @naka_aki_spl

で、このへんの情報の設定のしかたって、ぶっちゃけUML(初代)の時点でも存在したんだよね。 (ちなみに某はUMLより更にずっと古いが)

2010-11-23 14:14:07
非実在naka aki @naka_aki_spl

某流だと「isPartner」や「is夫」は「Humanには実装しません」。 婚姻クラスのメソッドになります。 ただしそれは実装の「義務」が無いだけで、 Humanに橋渡しメソッドを作る自由はある。

2010-11-23 14:14:10
非実在naka aki @naka_aki_spl

ちなみに左右どっちをどっちにするかは原理的には全く自由。ただし既に存在するRelation継承クラス(つまり半具象クラス)を更に継承して作る場合、左右に既にイロづけがされていたならば、それに合わせるのが明らかに無難です。そうしないと抽象クラスを使って仕事できなくなる

2010-11-23 14:15:58
非実在naka aki @naka_aki_spl

余談だけど関連クラスじたいに自前のIDが有るかどうかについては、UMLと某とでは意見が別れてますね。個人的には某のようにRelにも自前IDが有る方が便利だと思うしモデルとしても綺麗だと思うけど、UMLは違う考えのようで、正直残念。(このへん児玉さんに突っ込んでも意味ないわけで)

2010-11-23 14:18:50
非実在naka aki @naka_aki_spl

Railsあたりだと交差エンティティに自分IDつけるかどうかは、宣言のしかたでどっちにでもコントロールできる、んだっけか。

2010-11-23 14:19:28
pokarim @pokarim

@cocoatomo OOにおけるインスタンスオブジェクトは、属性等の情報を持たないただのID値として考えてそれの集合がオブジェクトになります。int値やstr値の集合も便宜的に考えます。そして集合とその他の集合との間に関係を持ちます。OOの属性的な情報はそこで持ちます。

2010-11-23 14:19:30
pokarim @pokarim

@cocoatomo どうもです。多値をとって多値を返すところは、重複ありの多値を入力として重複ありの多値を出力として得ます。[1,1,2]->{(1,'a'),(1,'b'),(2,'c'),(2,'c'),(3,'d')}->['a','a','b','b','c','c']

2010-11-23 14:32:38
pokarim @pokarim

@cocoatomo 早くもじつは関係といっていたのが関係でない事が発覚しました。重複ありでした。

2010-11-23 14:34:27
pokarim @pokarim

@cocoatomo 合成は関数合成と同様です。属性や交差テーブルの代わりが合成可能な関係'になります。正確には関係でなかったのでとりあえず関係'と呼びます。

2010-11-23 14:49:00
pokarim @pokarim

@cocoatomo 関係'には合成、逆方向にしたものをとる演算invert(射のインバースではないです)のほか、intの四則演算に対応するものや集計操作のsumなどがあります。これらは関係'をとって関係'返す関数になります。

2010-11-23 14:55:01
pokarim @pokarim

@cocoatomo 例えば会社員オブジェクトにheightとweightというIntオブジェクトへの関係'があった場合、height*weightで新しい関係'を定義できます。

2010-11-23 14:59:01
pokarim @pokarim

@cocoatomo height*weightの*は、関係'から関係'への関数なので、値同士の演算ではなく高階関数的な演算になります。イメージとしてはlambda left, right:(lambda x:left(x) * right(x))こんな感じです。

2010-11-23 15:07:18
pokarim @pokarim

@cocoatomo 実際は多値なのでlambda left, right:(lambda xs:[l * r for l in left(xs)[:1] for r in right(xs)[:1]] こんな感じです。

2010-11-23 15:12:05
pokarim @pokarim

@cocoatomo Python風の式は実装方法ではなく動作イメージです。ちょっと息切れしてきたので甘いもの分を買いにいってきます。

2010-11-23 15:20:54
tomo🐧@learning @cocoatomo

@pokarim どうぞ~。俺も作業中なので、まったり Reply します。

2010-11-23 15:53:52
pokarim @pokarim

@cocoatomo どもです。先も長いのでぼくもまったりいきます。

2010-11-23 17:15:24
前へ 1 2 ・・ 5 次へ