blog.fuktommy.com

先日、二重に腐った実装をしてしまって反省している。 (1) 仮引数が悪い function doSomethig($logLevel = PEAR_LOG_ERR) { ... } って関数があ...

先日、二重に腐った実装をしてしまって反省している。

(1) 仮引数が悪い
function doSomethig($logLevel = PEAR_LOG_ERR) { ... }
って関数があったとしましょうよ。
細かいログが必要なときは doSomething(PEAR_LOG_INFO) とか渡すんですよ。
っておかしいでしょ、これ。
1ヶ月前の自分は酔ってたのか?

だって、doSomething() がどういうときにどういうレベルのログを吐くかを
呼び出し側が知ってないと駄目なんですよ。


(2) 実引数が悪い
doSomething(PEAR_LOG_INFO) だとエラー出すぎだからなんとかしようと思ったとして

$logLevel = PEAR_LOG_ERR;
if (! 条件1) {
  // ログ抑制のため
  $logLevel = PEAR_LOG_INFO;
}
if (条件2) {
  // ログ抑制のため
  $logLevel = PEAR_LOG_ERR;
}
doSomethig($logLevel);

って意味わかります? なんでこんな実装をしたんですかね、先日の自分は。
ここはせめて

$logLevel = PEAR_LOG_INFO;
if (条件1 || 条件2) {
  // この条件のときはログ出すぎなので抑制
  $logLevel = PEAR_LOG_ERR;
}
doSomethig($logLevel);

と書くべきでしたね。


というかやっぱり(1)の仮引数が悪いのですよ。
デフォルトでは細かいログが必要、特定の条件のときには不要、
というニュアンスがif文や前後から伝わりますか?
コメントがなかったとして。
僕は無理だと思う。

function doSomethig($verboseLog = false) { ... }

$verboseLog = true;
if (条件1 || 条件2) {
  $verboseLog = false;
}
doSomethig($verboseLog);

が落としどころかな。
説明のためにみんな知ってる定数を使ったので、なんでログレベルを渡すんだみたいなツッコミはなしで。
デフォルトがあって例外があって、
例外を指定する場合のデフォルトがあって、さらにその例外を指定する場合がある、
みたいな要件自体がおかしいという説もある。
Copyright© 1998-2014 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)