2016年11月3日にPHPカンファレンス2016が開催されました。本稿では,
PHP7では例外や表明の機能が大幅に見直され,
導入
はじめに,
和田さんは,
- データーベース接続確立失敗
(誰かがマイグレートを実行している等の考慮がない) usr
,passwd
等キー名が変更された- テーブル名やカラム名が誰かに変更された
$params
がnull
$params
のキー名や数の不一致(値がおかしい可能性) $params
の値が文字列に変換不能(暗黙のキャストに失敗する可能性) - Bugクラスが未定義
(Bugクラスに配列をマッピングしているが, そもそも配列がない場合の考慮がない) - 途中でデーターベース接続エラー
この中で一番手強いと感じるバグとして,$params
のキー名や数の不一致」
そして,
さらに,
以上がこの講演の導入部です。バグの早期発見のためにどのようなプログラミングをおこなえば良いのか,
予防的プログラミング
先に示した一連のコードに内包されるバグは,usr
やpasswd
のキーが変更されるのはバグであるし,
$params
がnull
$params
のキー名や数の不一致がある$params
の値が文字列に変換できない
そこで取り上げるのが予防的プログラミングです。これは,
予防的プログラミングに近いものとして防御的プログラミングがあります。これは端的に言えば
- 徹底的に値を確認する
- おかしな値が来たけど,
なんとかゴニョゴニョいいようにする - パラメーターの中身をコメントで書きまくる
和田さんは
そして,
- 可読性の高いコードと適切な命名規則
- すべての関数の戻り値をチェック
- デザインパターンの採用
型の制限
ここで
例えば,
防御的プログラミングの例として,
「問題領域の知識を活用して固有の型を作ることで,OPEM
, NEW
, FIXED
のたった3種類であること,String
やint
を使う必要がないことを示しました。
class $status extends Enum
{
const OPEN = "OPEN";
const NEW = "NEW";
const FIXED = "FIXED";
}
$status = new Status(Status::OPEN);
$status = new Status('OPEN');
$status = new Status('HOGE');<<<<エラーが出る
これで列挙型ができるため,
public static function findAll(int $assignedTo, Status $status)
以上により,$params
に関する心配事に対応できるとしました。
多すぎる責務に起因する問題
次に,
- データーベース接続確立失敗
usr
,passwd
等キー名が変更された
この部分のコードは検索を行うコードです。データーベースに接続しに行くことは,
そしてPDOを作るところまでは外で行い,
予防的プログラミングの話のまとめとしては