デザインパターンって読み囓っただけであんまりエラソーなことは言えないんだけど、素朴な疑問を書いておきたいと思います。未来の自分がアンサーしてくれることを祈って。
この分野では「Javaで学ぶデザインパターン」といったタイトルの書籍が多く見受けられ、自分もその手の書籍を読んだ。するとまあ、当然だけどjavaで書かれていて、変数や関数の定義は下記の如くだ。
String getName();
int myNumber;
これをAS3で書き換えるともちろん
function getName():String ;
myNumber:int;
という感じになる。戻り値が関数・変数名の前につくのか後に付くのかが異なり、初めは何か気持ちが悪いけどすぐ慣れるし大した問題じゃあない。
では、何が問題なのか。
それはgetter、setterにまつわる実装方法だ(あくまで、個人的に)
たとえばイテレータパターン。通常、javaでは「next()」「hasNext()」というメソッドを実装し、「next()」を実行するとシーケンシャルにデータを受け取る事を可能にしている。
「next()」はカプセル化された配列から、次のデータを順番に返すように実装され、「hasNext()」は最後に「next()」を実行した配列のインデックスが最後で無いかを真偽値で返す。つまり、次のデータがあるのか無いのかを教えてくれる。
「next()」と「hasNext()」は両者とも「戻り値を持つ」そして「引数を取らない」という共通点がある。これは外から見た場合、読み取り専用値と言えるのではないかと思う。とすればAS3で実装する場合は「get」アクセサを使って、「next」「hasNext」とプロパティ化してしまうべきなのでは無いかと思う。
実際のコードを書けばこうだ。
public function get hasNext():Boolean{
return (index < str_ary.length)
}
public function get next():*{
return str_ary[index++]
}
そして、使用する場合は
if(iteratot.hasNext){
var data:* = iterator.next
}
とすればすっきりしていいんじゃないかと思う。同じ理由でsingletonモデルなんかでも「Singleton.getInstance()」ではなく「Singleton.getInstance」にするとか、プロパティなのに動詞がダメというなら「Singleton.uniqInstance」にするとか、いっそ「Singleton.singleton」にすればいいんじゃないかと思う。
もちろん、こうして従来の命名を多少なりとも変更することはあまりいいことではないと思う。特に「getInstance()」と書かれていれば一目瞭然でSingletonモデルであることが解る。これはすごく重要な事だ。でも「Singleton.singleton」とか手が無いわけでもない。
そして、もう一つ重要なことに「AdobeがプロパティベースのAPIを推奨していると言うことだ。」ココを読んでみるとどうやらそれっぽい事が書いてある。
Property-based APIs
Favor property-based APIs rather than method-based APIs, because these are more suitable for declarative-style MXML programming.
プロパティベースのAPIのほうがメソッドべースよりオススメさ!だって、MXMLで開発するときそっちの方がいいんだもん。
と言っている。これは確かに説得力のある言い分だ。(MXML使ったこと無いけど)
そろそろ、「JavaとかC++から載せ替えただけのデザインパターン」ではなく「AS3、というかECMAScriptの利点を引き出したデザインパターン」が必要な時期ではないかと、思う。
おわり。