2008-07-31

全部 public でいい!

よく、クラスのメンバ変数を private にして、setter と getter 関数を作れといいますよね。こんな風に。

class Person {
    private $_name;
    public function setName($name)
    {
        if (empty($name)) {
            throw new IllegalArgumentException();
        }
        $this->_name = $name;
    }
    public function name()
    {
        return $this->_name;
    }
}

でも、明らかにバカっぽい!! public なら1行じゃないか!!

誰しも、1度ならず10度ぐらいは考えたことがあると思います。

我々崇高なるプログラマはこんなコードを書くために時間を費やしていいはずがない。

そこで、私はあえて、もう全部 public でいい!と推します。関数も。

上記がメインの理由ですが、他の理由もこねくりだしてみます。

なんでこの関数が private !?

オープンソースプロジェクトコードを見ていて、

中々便利そうな関数があるじゃないか、と思ったら private ! なんてことが実は結構あります。

(それを正式に使いたいとなったら、パッチを投げて議論を交わし導入されるのを待たなければいけません。)

コードコミットした人は上級者といっていいプログラミングレベルの人です。

そんな人でも、private にしたほうが意図せず外からアクセスされなくて安心、の理論で、

とりあえず private 関数にしてしまうのです。なぜか?

考えたくないからです。

他から利用されたりすることが完全にないと言い切れるのか、などと悩みたくないからです。

この作業は単純なようでいておそろしく時間がかかります。

ありとあらゆる可能性をつぶしていかなければならないからです。

「あとはコードに直すだけ」

なんて言葉を上級者から聞いたことはありませんか?

彼らにとっては、本当に時間がかかるのはアルゴリズムだったり、このようなコード設計なのです。

このコード設計の時間を短縮できれば彼らの崇高なる脳力を有効活用できるのです。

もう、全部 public にすればいいじゃん!

この private 変数覗きたいんですけど!

確かに、設計上、その変数は他所から覗かれることはない変数でしょう。

でも、デバグ目的だったりで、メンバ変数の値を覗きたい、なんていうことは良くあります。

UnitTest をやっていて、途中経過の値を見たい、なんて実はよくあるんじゃないですか?皆さん。

UnitTest は関数仕様テストするもので、途中経過がどんな値であろうか問題ではない?

知るか!!オレが今やりたいのはデバグなんだよ!!

なんて実はよくあるんじゃないですか?皆さん。

そんな時、メンバ変数が private だと、わざわざリフレクションを使ったトリックを使ってアクセスしたりと、

本来必要のない時間の使い方をしちゃったりします。

我々崇高なるプログラマはこんなコードを書くために時間を費やしていいはずがない。

  • 時と場合によるんじゃないかなぁ。 setter,getterの場合は、値に境界条件などを付けたい時にpublic変数だと、なんでも入れられてしまうのでバグの温床になってしまうし private関数の場合...

  • そんなあなたにperl/javascript。 でも、getter/setterは継承したとき便利だよ。デバッグのときも便利だよ。1行もいらない仕組みを作れるよ。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん