D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2010年11月

や、冬があるから雪見で一杯ができる風情があるとかそういうのはわかってんだけどさ。

大人になって、いよいよ自分は「南国育ち」なんだなぁと思う。もうね、寒いってのが理解できないのよ。意味がわからない。「ここは人間の活動区域ではない!」と心の底から思う。

日本は四季があっていいなぁとは思うけど、自分はどんなに寒くても摂氏15度以上ある場所から雪とかを見ていたい、と今朝通勤中に思ったわけであります。


最近「つぶやき」はみんなtwitterでやっちゃうからつまんないな、ブログとかに残るっていいな、とこの間ひっっっさしぶりにshuさんの日記を見つけて思ったのでちょっと書いてみた。

あとJPAブログのほうを更新しました!就職してしまったのでこちらのほう更新が進まなくて申し訳ないです。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

「オブジェクト指向なパラダイムでプログラムを書くとき」にClass::Data::Inheritableは排除すべきモジュールである。今回激しくそれを痛感しているので、だらだら書いてみたい。

まず、Perlはマルチパラダイムが可能な言語なので、Class::Data::Inheritable自体は否定されるべきものでもないし、あと必ず例外ケースはでてくるのでその際には躊躇なく使えばいいと思う。以下は最初の一文の通り、Perlでオブジェクト指向を使う場合はClass::Data::Inheritableは基本的に使わず、あくまで例外ケースに留めるべきだ、という事を伝えたい。

まずその1: クラスアトリビュートはグローバル変数

クラスアトリビュートはグローバル変数です。異論は認めません。

Singletonもそうだけど・・・使う場所はあるんだけど、グローバル変数は限りなく限定的に使われるべき。基本的に使わない物なので、確実にインスタンス変数では無理、もしくはその方がパフォーマンスが○○%向上する!みたいな箇所以外では原則使うべきものではない。

特にオブジェクト指向とは混ぜるな危険!ざっとググった中で一番簡潔に書いてあったのはこのブログかな

2: オブジェクアトリビュートなのかクラスアトリビュートなのかが激しくわかりにくい。

アトリビュートはどれもアクセッサを通して使うけど、そいつらのうちどれがクラスアトリビュートなのか、どれがインスタンスアトリビュートなのか見ても全然わからない。

結果、グローバルな副作用を常に意識しながらソースコードを改修しなくてはならない。

3:ベタ書きを推奨する→アトリビュート初期化のタイミングが制御しにくい

クラスアトリビュートを使ってるとその指定を.pmファイル内にベタ書きする事が多くなる。Catalystとかでもそうだよね。ある一定の効果はあるので、完全否定じゃないんだけど、アトリビュートとかを全部これで初期化しはじめると・・・微妙。

普通オブジェクトはインスタンス化するタイミングでアトリビュートが初期化されるべきなのに、クラスが*読み込まれた*時点で初期化されちゃう。結果、設定等をBEGIN { } で書く必要があったりする。どうなんだ、これは。

4: アトリビュートのライフサイクルが指定できない→同クラスのオブジェクトインスタンス変数とライフサイクルが違うので困る

クラスアトリビュートはPerlの場合基本的には永続。明示的に ->attr( undef ); や ->attr( $new_value ); とかしないと値がリセットされることはない。どのタイミングでそれをしたらいいのか(していいのか)もわからない。

そのクラスが基本的にデータを貯蔵してるだけのクラスならいいんだけれども、そこでさらに同じクラスでオブジェクトインスタンスを作ろうものなら今度はどの変数が永続して生きてて、どの変数がインスタンスが解放されると解放されて・・・とか考え始めないといけない。

オブジェクト指向で書くなら、オブジェクト本体のライフサイクルに合わせるべきで、これを考え出すと途端に辻褄を合わせるためだけのコードが発生すると思う。

否定ばっかりしていてもしょうがないので、代替策も。

  1. まず基本方針としてクラスデータを持ちたい場合でも極力インスタンス変数で我慢する。
  2. 初期化はそのオブジェクトを初期化するクラスから値を渡す。魔法で勝手に初期化しようとするとすぐグローバル変数に頼りたくなる。
  3. アプリケーション全体を一つのオブジェクトでラップする
  4. クラスデータは例えば*デフォルト値*を指定するのに使う

具体策も書こうと思ったけど、時間が切れたのでとりあえず以下次号!


    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ