AS3的デザインパターンについての独り言

デザインパターンって読み囓っただけであんまりエラソーなことは言えないんだけど、素朴な疑問を書いておきたいと思います。未来の自分がアンサーしてくれることを祈って。

この分野では「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の利点を引き出したデザインパターン」が必要な時期ではないかと、思う。


おわり。

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/238

Comment (3)

おもしろかったです。
確かにASの流儀だとプロパティの方がしっくりきますよね。
そして、プロパティで書いてしまっても何ら問題はないと思います。
デザインパターンは実装の領域ではなく設計の領域を扱ったものだと思いますので。
Iteratorパターンを理解しているプログラマーは、その実装がどれほど変形されていようともそこにIteratorパターンを見いだすんじゃないかと思います。

yamaharu : 2008 .07 .28

すみません。追記します。
hasNext()をプロパティにするのは同感なのですが、
next()はちょっとまずいかなと思います。
next()は明らかに「操作」だからです。

暗黙のセッターは、実装上は操作と等価だと思いますが、
外からの見かけ上はあくまで「値(プロパティ)の上書き」であるべきな気がします。

Iterator.next()は明らかに操作ですので、
プロパティではなくメソッドとして
そのことを明示すべきだろうなと思います。

yamaharuさま

コメントありがとうございます!

そうなんですよね~。
他の人からもnext()はやっぱり内包する「操作」が存在するのでメソッドのままのほうがいいんじゃない?
と言うアドバイスをいただきました。

hasNextとかSingleton.instanceに関しては賛成意見が多かったように感じます。

個人的には textField.text = "hoo bar"; とかも実際には内部的にゴニョゴニョとやってるわけですが、コーディング上はプロパティに値を代入しているだけの様に見えるので、next も許容されないかな~?と思ったりします。

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.