質問したいこと
クラスのメソッドにおいて、どこで引数チェックをするべきなのか。
詳細
例えば
- ユーザーからの入力を受け取り、保存するようなメソッド(下記のsaveメソッドのようなもの)
php
1class Hoge_Controller() 2{ 3 public function save($inputs) 4 { 5 $errors = // バリデーション 6 7 if (!empty($erros)) { 8 return $errors; 9 } 10 11 // DBに保存 12 } 13}
であれば、ユーザーからの入力は基本的に信用するべきでは無いと思うので、バリデーションで引数をチェックするのが一般的かなとは思っているのですが、
- モデルにあるprivateメソッドのようなアプリケーションの内部で呼ばれるメソッド
php
1class Hoge_Controller 2{ 3 public function save($inputs) 4 { 5 $hoge = new Hoge_Model($inputs); 6 7 $errors = $hoge->validate(); 8 if (!empty($errors)) { 9 return $errors; 10 } 11 12 // 適当に考えた処理です。 13 $number = rand(); 14 $hoge->set((string)$number . (string)$hoge->calc($number)); 15 16 $hoge->save(); 17 } 18} 19 20class Hoge_Model 21{ 22 // 2乗して2倍にして返す 23 public function calc($number) 24 { 25 $number = $this->square($number); 26 $number = $this->double($number); 27 28 return $number; 29 } 30 31 protected function square($number) 32 { 33 return $number * $number; 34 } 35 36 protected function double($number) 37 { 38 return $number * 2; 39 } 40} 41
の引数に対して、どの段階でチェックを行うべきなのかがイマイチよく分かっていません。
$numberに対する引数チェックを行うべきパターンとしては、
- calc だけで行う (呼び出し側で行う)
- square, double の2箇所で行う (呼び出される側で行う)
- calc, square, double の3箇所で行う (どっちも行う)
の3パターンがあるかと思います。
1にした場合、squareやdoubleにnullとか配列を渡せばバグってしまったり、間違った使い方が出来てしまう問題があります。が、アプリケーション的に見れば問題ない気もします。
2にした場合は、これが自分的には一番しっくりきているし、あまり問題を感じません。
3にした場合は、やりすぎかなと感じるのですが、それぞれ単体のメソッドとしてみると、正しい値だけに処理を実行する設計になるので、理論的には正しい気がしています。
という感じで、メソッドを新しく作るときに結構悩んでいます。
みなさんはどうしているのか、意見をお聞きしたいです。
また自分の考えにおかしなところがあればご指摘頂けると幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。