作者: ねこ丸
日時: 2006/7/7(12:03)
  ねこ丸です。

  まーた長くなっちゃった。

閑舎 writes:

> >   えーと、僕や Zazel さんの方法ではサブクラスまで考える必要はないんで、
> > 普通に $this->line などを参照すればいいと思ってるんですけど。
> 
> おいおい。
> 
> まあいいとして。PHP は 4 も 5 も名前空間を持たないために、グローバル変数
> でなければローカル変数という 2者択一しかなく、変数の扱いを厳密にしようと
> すると非常に手間がかかるということがわかりました。Python はファイル単位
> で名前空間を持っているため、簡単のもよう。

  んー、というかですね。考え方が変わらないとだめというか、僕自身は考え
方が変わってしまいましたというのが正しいでしょうかね。僕の感じたことは

* クラスとかオブジェクト指向はなんかものすごいものだと思っていたけど、
  別に魔法の杖じゃなかった
* できないことを無理にやらせようとしてもしょうがない
* オブジェクト指向で生産性が上がるなんてのは最初のうちは嘘っぱち

  ですね。ぶっちゃけ僕にとってクラスってのは

* 複数の関数で共通の変数を持てるので「引数を減らせる」
* 一つの関数で慌てて結果を返す必要はない
* したがって一つの関数を短く分かりやすくすることができる

  程度のものなんです。あと極論すればグローバル変数か否かは問題じゃなく
てですね、気にしなきゃいけない変数が増えるのはイヤ、というのがポイント
ですね。「管理を厳密にしたいんじゃなくて、管理したくない」という感覚的
な言葉で伝わるでしょうか。グローバル変数は人間が管理しなきゃいけない最
たるものなわけです。

# ちなみに、何がなんでもグローバル変数は使っちゃダメとも思ってません。
# ただこれだけ細かく呼び出しそうなクラスでグローバル変数を使っちゃうと
# あとが面倒だなと感じるんです。

  実はですね、僕も最初 HTML を題材に継承を使いまくったクラスを作ってみ
たんです。でも使いにくいんで結局まったく使わなくなりました。だから閑舎
さんの抱いているであろう違和感はとてもよく分かります。どう作ってもしっ
くりこないんですよ。そしてすでにオブジェクト指向している人の説明をどう
聞いてもピンとこないんです。まぁ僕はそうでした、ということなんですが。
  あと、PHP はオブジェクト指向の練習には向いてないと思います。特に 
PHP4 までは。単に $this-> がついて名前が長くなっただけに見えてしまいま
す。

  僕も最初 PHP で書いてみたんですが、その後 Perl で書いて、Ruby で書い
て、ようやく飲み込めました。Perl の OO は書くの超面倒くさいですけど、
Perl native の人は PHP で練習するよりも絶対に Perl で練習した方がいいと
思います。時間は掛かりますけど、クラス内部で何をしているのかが肌で分か
ります。
  Perl の場合は基本的には以下のような感じですね。$this はあえて PHP に
合わせてあります。Perl 的には $self を使うのが標準的なようですが、別に
何を使っても構いません。そこら辺の自由は実に Perl らしい。

package class;

# コンストラクタは new() にするのがセオリー
sub new {
  my( $this, $arg ) = @_;
  $this = { 'prop1' => undef,
            'prop2' => undef,
            'prop3' => undef };
  bless $this;
  $this->method1( $arg );
  // 条件によって undef を返すことも可能
  return $this;
}

sub method1 {
  my( $this, $arg) = @_;
  $this->{'prop1'} = $arg;
}

sub method2 {
  ...
}

  クラスは package による名前空間、オブジェクトはハッシュリファレンス、
それしか決まっていないというのはかなり独特です(^^;  あと継承とか使い始
めるとさらに悩みます。多重継承も可能ですし。

  ちなみに Perl については Bruce. さんの訳された perldoc を読むのがい
ちばんいいと思います。あるいはことあるごとに宣伝してる気がするけど
『Perlプログラミング救命病棟』。

--
    ねこ丸