いったんOKと言ったあとで「やっぱダメ」と言う人、嫌われるよね?
コードでも同じ。
ある判定を行う固まりで、条件に統一性が無いとすごくわかりづらいです。
bool isValidXxxx(string targetValue, bool allowNull, bool allowZero, bool allowWhiteSpace){
//nullチェック
if(!allowNull && targetValue == null){
return false;
}
//ゼロチェック
if(!allowZero)
{
int parsed;
if( Int32.TryParse(targetValue, out parsed) && parsed==0){
return false;
}
}
//空白のみ・空文字チェック
if(!allowWhiteSpace && targetValue.Trim.Equals("")){
return false;
}
}
void main(){
var targetValue = "";
bool result = isValidXxxx(targetValue, true, false, false); //nullはOKで判定している
if(targetValue == null){
result = false; //(・д・)なぜに
}
}
26行目のisValidXxxxではnullはOKで判定依頼しているのに、そのあと(27行目)で自分でnullの場合はNGのチェックを行っています。
「こんなコード書かねぇよ」と思うかもしれませんが、nullの場合は特別なメッセージをセットしたいという要件がある場合、書いてしまうことがあるようです。そのような場合でも、条件は一致させておくのが誠意のあるコードです。
bool isValidXxxx(string targetValue, out string message, bool allowNull, bool allowZero, bool allowWhiteSpace){
//nullチェック
if(!allowNull && targetValue == null){
message = "null error";
return false;
}
//ゼロチェック
if(!allowZero)
{
int parsed;
if( Int32.TryParse(targetValue, out parsed) && parsed==0){
return false;
message = "zero error";
}
}
//空文字チェック
if(!allowWhiteSpace && targetValue.Trim.Equals("")){
meaage = "white space only";
return false;
}
}
void main(){
var targetValue = "";
var message = "";
bool result = isValidXxxx(targetValue, out message, false, false, false); //nullはNGで判定
if(targetValue == null){ //nullの場合はメッセージ書き換え
message="NULLだよ!";
}
}
そもそもisValidXxxxの作りがイケてないというのは、言ってはいけない。