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

[jfriends] Re: Observable,Observerへの応用




Shin@イデアです
少しだけ時間が取れました.

In article <199811180311.MAA15871@xxxxxxxxxx>
ENDO Yasuyuki wrote:
>>class Hoge implements A, B {
>>//class Hoge implements ABC { でも同じ※
>>	public static void main(String[] arg){
>>		test(new Hoge());	// ←エラー
>
>このエラーは、複数で開発している場合などは起こりそうですね。
>
>>	void test(AB ab){
>
>この引数を java.lang.Object にしてしまい、instanceof で検査する戦略は
>いかがでしょう。

Object型を使う場合、コンパイル時に検出できるエラーが検出できなくなるの
で、逆に性質が悪いバグを発生させる原因になってしまいます.
# 上記の場合、instanceof AB || (instanceof A && instanceof B)とするこ
# とで…と言う意味だとは思いますが、ちょっとinterfaceの使い方としては
# 本末転倒な感じですね.

>>みたいなのがあまり多くなると、そのスーパータイプ達を実装している人が、
>>それらを合成したもの(サブタイプ)で実装していなければならないといったこ
>>とに気づくのが遅れる可能性があるんじゃないかと.
>
>本来、class Hoge implements A, B { みたいなパターンが繰り返し出てきたら
>それらをまとめて interface AB extends A, B みたいにして抽出して
>class Hoge implements AB と書き換えていく戦略ではないかと解釈しています。

そうですね.これを実践するためにはそれを実装する側も、参照する側もその
interface(名)が存在する意義が直感的にわかることが重要かと思います.


>INameAdress とはちょっと文脈が異なる例ですが、
>例えば5章の「通知を利用した戦略」で、
>java.util.Obserbable / Observer を使うかどうかという問題について、
>「継承に適した例では無い」と判断した Coad は、
>
>public interface IObserver {
>  void update(Object theObserved, Object changeCode);
>}
>
>public interface IObervable {
>  void addIObserver(IObserver anIObserver);
>  void deleteIObserver(IObserver anIObserver);
>  void deleteIObservers();
>}
>
>という2つの interface を書いて Observable, Observer を実現しています。
>
>この応用で、Repeater (中継者) を間に挟んだ例を扱い、
>
>public interface IRepeater extends IObservable, IObserver {}
>
>という interface を導入しています。
java.util.Observableがなぜinterfaceじゃなかったかと言った議論が
JavaHouseの方であったような気がするんですが、時間が無くて見つけられま
せんでした.
私もinterfaceの方がいいんじゃないかって漠然と思ってるんですが、
>public interface IRepeater extends IObservable, IObserver {}
これは考えに無かったので面白いです.
# ただ、これも名前から直感的に役割がわかるかと言うと私にはちょっと・・
# でしたが:-)

# 英語はだめなくせに名前にはこだわる人.そのせいで名前を考えるのにやた
# ら時間がかかる.

ではいったん失礼します.
--
shin@xxxxxxxxxx