[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: JAVAオブジェクト設計第二章の別案



In article <199901250310.MAA17742@xxxxxxxxxx>
ENDO Yasuyuki wrote:
>「インターフェースを使った設計」はそのあとの章なので、
>ここでは interface は使ってはいけないという前提は置いといて...
高橋さんのフォローも同じくですが、第二章ではinterfaceを使わずに無理
矢理設計したという印象は確かにあります.

ただ、以降を読み進んでも結局Passenger is Personにはならないんですよ
ね.
私はinterfaceはクラスに応答可能性を付加するものだと考えているんで、
せっかくそういう機構があるのにPassenger(乗客)がPerson(人)として扱え
ないのは異常に不自然に見えます.
# だって、乗客オブジェクトから人オブジェクトを取り出して操作するんで
# すよ.使う側の立場で見て混乱を招きそうです.

以下の実装でも人オブジェクトとその人の役割オブジェクトは別のオブジェ
クトではありますが、外部からはそれを意識する必要はありません.
# 役割を動的に付け替える必要が無いなら単純にimplementsしたクラスを作
# るだけで、静的に「役割を付加」できますが.

>>// 役割の定義部分
>>interface Person { //(略) }
>>interface PersonRole extends Person { //(略) }
# この命名は本に合わせただけで役割を端的に表せていません.
>>interface Agent extends PersonRole { //(略) }
>>interface Passenger extends PersonRole { //(略) }
>>interface AgentPassenger extends Agent, Passenger {}
>
>なかなかいい感じですね。
とりあえずinterfaceだけ決めてみました.とにかく使う側はinterfaceを見
てAgent/PassengerはPersonであることが解かります.以下のクラスは基本的
にこのinterfaceを保証できるように埋めていったに過ぎません.
(動的に変えられるということは意識しています)

# だからパターンではなくなってしまいましたが...

>>abstract class PersonDecorator implements PersonRole { //(略) }
>>class ConcretePerson implements Person { //(略) }
>>class ConcretePersonRole extends ConcretePerson implements PersonRole { //(略) 
>}
↑こいつはConcretePersonを受けとるコンストラクタをた方が良いですね.
# コピー可能な属性をコピーするもの.これによってConcretePersonからの
# 変形を可能にする.
>>class ConcreteAgent extends PersonDecorator implements Agent { //(略) }
>>class ConcretePassenger extends PersonDecorator implements Passenger { //(略) }
>>class ConcreteAgentPassenger extends ConcreteAgent {//(略) }
>
>このへんが具体的にどう動くのか、どう使うのかがまだ私には見えていません。
>生成に関するパターンなのでしょうか...
分類するなら「振る舞いに関する〜」といった感じです.

使うときはConcretePersonオブジェクトは単体で使えますが、それに役割を
付加する場合にまずConcretePersonRoleオブジェクトに変形して(或いは最
初からConcretePersonRoleオブジェクトを生成)、それらを下の3つのクラ
スの何れかのコンストラクタに渡せば動的に役割の付加が出来ます.
# 役割の取り外しも可能ですがそのメソッドの記述は省略しています.

以下はあんまり考えていないまま書いています.

大体Decoratorパターンと同じ問題があるのかなと思います.
# 同じ振る舞いを二重に付け足されたときにどう振る舞うかとか.
そして出来てから思うに、この機構自体はinterfaceを使わなくても可能じ
ゃ無いでしょうか?
interface使わない版に書き換えられれば、第二章に載っけても良いことに
なりますね(笑).

続きはまた時間がありましたら....
# 読書会不参加の方および、本を持っていない方へ.だらだらとすみません.

=====================================
Shin@イデア
=====================================