- 2008-06-11 (水) 2:36
- PHP
この記事の所要時間: 約 0分39秒
PHPに限らずですが、読む人に意図が伝わるようなコードを書きたいという話です。
なお以下は私の感覚での話しですので、それ違う!という突っ込みがあればお願いします:-D
業務にしろオープンソースにしろ人のソースを見て気になるのがif文です。
if文で真偽値を判定する
メソッド・関数の戻り値が真偽値の場合、true/falseを判定するなら等号(不等号)は無くても良いのではないでしょうか。
つまり(hoge()はtrue/falseを返す関数)
[1]
if (hoge() === true) { } if (hoge() !== true) { }
と書くのではなく
[2]
<?php if (hoge()) { } if (!hoge()) { } [/php] <p>と書けば良いのでは、という事です。</p> <p>特にPHPでは厳密にtrue/falseを判別するなら[===]で比較する<a href="#1" name="p1">*1</a>ということで、[1]のようなコードを見るのですが、ここで判別したいのは、true/falseの2値のみなので、型を厳密に見る必要はありません。</p> <p>[2]であればhoge()が2値のみを返す(他の値を返すにしても2値のどちらにみなされるか、だけを判定している)意図が明確になります。</p> <p>私の感覚では[1]のように書くとhoge()がtrue/false以外の値(integer等)を返すので、あえて[===]で判別しているようにも取れます。</p> <p>コードの解釈できる範囲を狭めてやることにより、コードの意図がはっきりします。</p> <p></p> <p>PHP5で強化されたオブジェクト指向機能を使うことにより、コードの意図を伝えることができます。</p> <h3>例外</h3> <p>try/catchで例外を捕捉しているコードなら、その中で例外が飛んでくることが分かります。さらにcatchで捕捉する例外を絞り込めば、飛んでくる例外の種類も分かります。</p> <?php try { // foo()内でPDOExceptionが発生する foo(); } catch (PDOException $e) { echo $e; } [/php] <h3>アクセス権(visibility)</h3> <p>インスタンス変数にprotected/privateを設定しておけば、その変数が外部からは参照・変更して貰いたくないことが分かります。メソッドについても同様です。</p> <h3>タイプヒンティング(TypeHinting)</h3> <p>関数・メソッドの引数にタイプヒンティングでクラス(インターフェイス)名を指定しておけば、与えるべき引数が明らかになります。さらにPHPではタイプヒンティングで指定した引数へはnullも指定できない<a title="引数のデフォルトパラメータにnullを指定すれば、nullも渡すことができます。" href="#2" name="p2">*2</a>ので、メソッド内部では確実に指定したクラスとして扱えます。</p> <?php class Foo {} class Bar { public function execute(Foo $foo) { } } $bar = new Bar(); $bar->execute(new Foo()); // Fooクラスのインスタンスのみ
クラスを継承/インターフェイスを実装
当たり前に使っている機能ですが、これを行えば親クラスやインターフェイスで定義されているメソッドならば(publicなら)呼べることが分かります。またそのクラスがどんな責務を負っているか、何に使うべきかを知ることができます。
意図を伝えられるコーディングを
例をいくつか書いてますが、大事なのはコードを読む人(一ヶ月後の自分も含む!)に意図を伝えられるコードを書きたい、書こうということです。
# コメントも大事ですが、実際に動くのはコードなので、まずコードがあってこそですからね。
追記[2008/06/12]:
if文の話には別の視点があるようです。人間って疲れる生き物なのですよ – よくきたはてダ
*1 PHPの==がキモい件 – hnwの日記
*2 引数のデフォルトパラメータにnullを指定すれば、nullも渡すことができます。
- Newer: フレームワークで使われているPHP関数を数えてみた
- Older: CakePHP 1.2RC1からは比較演算子をキーに書く
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2008/06/php_readable_coding.html/trackback
- Listed below are links to weblogs that reference
- PHP 意図を伝えるコーディング from Shin x blog