.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.jdt.core.prefs
ここにあった。
子供のとき本気でそう思ってました。 理由は樹齢が長いから
前も同じようなタイトルで書きましたが、
スクリプト言語でプログラミングするようになってから、 この手の、「あれ?これ出来なかったんだっけぇ?!」 というシチュエーションが良くある。
記事内のオーバーロードしたメソッドが 実行時の型によって選ばれないという件。
昔は気にならなかったのは、多分できないのが、 当たり前だという脳回路が出来上がっていたんだと思う。
普通は感じる事ができないし、出来ないからこそ 恐ろしい「思考停止」という状態を 過去の自分に感じる事ができた。
これは貴重な体験だ。
それは置いておいて、
記事内の現象自体は、Javaはインタフェースに対して メッセージングをするという概念で考えれば、 納得できるが、それでは、やはり思考停止だと思い、 今の自分だったらどう実装するだとうという観点で 考えてみた。
Java的には、 Animalにenterメソッドをつける方法が一番 エレガントな気がするけど、 やりたい事がシンプルに書けてない感じが残る
(この感じがスクリプト言語から得た感覚なのかも。。)
結局今の自分なら以下のように書くかなぁという 内容です。
import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; public class TestMultiDispatch { public static void main(String[] args) { Zoo z = new Zoo(); for( Animal a : new Animal[]{new Cat(), new Dog(), new Cat()}){ z.enter(a); a.say(); } } } class Zoo{ Hashtable h = new Hashtable(); public Zoo() { h.put(Dog.class, new ArrayListなんか主旨とズレてるけど。()); h.put(Cat.class, new ArrayList ()); } public void enter(Animal a){ List list = (ArrayList)h.get(a.getClass()); list.add( a ); } } abstract class Animal{ abstract public void say(); } class Cat extends Animal{ public void say(){ System.out.println("にゃ〜"); } } class Dog extends Animal{ public void say(){ System.out.println("わん!"); } }
名付け親は、ファウラーさん。
Martin Fowler's Bliki in Japanese - 流れるようなインターフェース
で、どんな実装かっていうのは上のリンクを見てもらうとして、 つまりDSLを実現しようとしているような感じ。
昔、まだオブジェクト指向とJavaを知って 興奮しながらコーディングしてた時に 同じような発想をした事がある。
実際にコードを書き始めたが、その時は挫折した。 なぜかというと、設計が難しい。 システム内のいろんな局面でそれをやろうとすると、 クラス(インタフェース)の数が膨大になる。
この実装のポイントは、
ある目的を達成する為の手続きの為に、
インターフェースを細かく設計し、
それぞれのメソッドをうまく融合させて、
1つの事が実現する。
という事だと思う。
オブジェクト指向では、クラス中心に システムを設計していき、クラスの役割を、 「1つの事を上手に行う」という発想で 設計していく。これはクラス中心の発想。
流れるインタフェーススタイルはその中の
メソッドにフューチャーしていて、
「1つの事を上手に行う為に、
次の仕事の案内を戻り値のインタフェースによって伝えながら、
対話的に行う。」
という事になる。
さらに、案内は選択肢が多くても意味がない。
そう対話的なのです。 つまり、完結しないメソッドを実装する事になります。
Statement st = generator.select("id, hoge, mage") .from("orders") .where("xx=hoge");みたいな感じかな。
IDEでエラーになるから、楽だよ。 的な発言もあるけど、やってみればわかると思うけど、 かなり設計が難しい。 失敗すると間違いなくカオスになるから、 むやみにやらない事も大事だと思った。
仮に、近い将来このスタイルが流行ったとしても、 開発プロジェクトとしてはあまり幸せじゃない 結果をもたらす気がするなぁ。
しかし、これをどこかで、実装したくてウズウズする自分もいる。 静的言語でも、DSL行けるんじゃねぇか。 今ならできるかもみたいな。。
emosei