ガード節(ガード, Guard)
はじめに
ある特定の言語にはガードと呼ばれる仕組みがあります。
プログラム言語Haskellの例
Before
describeLetter :: Char -> String
describeLetter c =
if c >= 'a' && c <= 'z'
then "Lower case"
else if c >= 'A' && c <= 'Z'
then "Upper case"
else "Not an ASCII letter"
After
describeLetter :: Char -> String
describeLetter c
| c >= 'a' && c <= 'z' = "Lower case"
| c >= 'A' && c <= 'Z' = "Upper case"
| otherwise = "Not an ASCII letter"
if, caseなどの構文でも記述できるのですが、関数呼び出しをガードするための構文のため、目的を明確化することができます。
ガードの仕組みが存在しない言語でも意識する
前述のとおり、if, caseなど他の構文で代用できるため、最近の言語には仕組みが導入されていません。
ただし、外部からの呼び出しを関数内部でブロックする目的の制御は有効なため、コード記述時には意識してみましょう。
Before(大げさに)
function isAdult($age){
if(!empty($age)){
if(is_numeric($age)){
if($age > 0 && $age < 100){
return ($age > 19);
}
}
}
return false;
}
After
function isAdult($age){
if(empty($age)){
return false;
}
if(!is_numeric($age)){
return false;
}
if($age < 1 || $age > 100 || ){
return false;
}
return ($age > 19);
}
ネストが浅くなりました。
ただし、行数が多くなったため、一概に良いとはいえません。また、呼び出し元と関数内部の両方でエラーチェックした場合、コードが冗長になります。
システムに求められる重要度やバランスを見て、方針を統一してコーディングするのが良さそうです。