読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

Stateをクラスにする訳

http://d.hatena.ne.jp/fkm/20061126/p1

関数を値とするハッシュテーブルとか,C#ならdelegateを値とする配列orハッシュテーブル(実際にはDictionaryジェネリクスだけど)以外でswitch退治というのは,野菜を切るのに刀を使ってるみたいで気持ちが悪い気がします

単純な関数ポインタのハッシュテーブルでは、一つのswitchしかつぶせない。 switch (state)... がいくつもあるなら、switch一つあたり一つのハッシュテーブルが必要になる。Stateパターンでは、switch (state) 一つあたり、Stateインタフェースの関数が一つ追加になるだけ。

もちろん、多次元ハッシュテーブルにすることで、ハッシュテーブルを一つにすることも可能。でも、それは、Stateパターンの劣化再実装に過ぎない。多次元ハッシュテーブルでは関数を振り分けることしかできないが、Stateパターンでは各Stateでのみ必要な変数をStateクラスのprivateメンバにできるという利点がある。

しかし、Perlではclassの作成が面倒(1クラス1ファイル・・・だったはず、間違っていたらスマソ)なので、小さなStateにも1ファイルを用意しないといけない。小さなクラスを作るのが手間なPerlは、いわゆる「きれいなオブジェクト指向」には向いていない。

訂正:Perlでも1ファイルにたくさんクラスを書けるとご指摘いただきました。
http://d.hatena.ne.jp/odz/20061201/1164940740
Perlをよく知らずに、packageとモジュールをごっちゃにして覚えていました。ファイル名=モジュール名(=代表pacage名?)であり、別にファイル名=pacage名では無いようです。
Perlでclassが面倒」というのは、単に私がPerlのpackageに関する文法が嫌いなだけでした。