条件文を重ねてネストが深くなったソードコードは往々にして読みにくいものです。何々なら処理を行うという意味で作られた条件文を何々なら処理を行わないという条件文に書き換えることでソースコードを読みやすくできることがあります。
次のコードは、もしデータが未定義でなく、データのidが数字ならば、処理を行う、という動作をそのまま書き下したソースコードです。
function (data){
if(data !== undefined){
if(typeof data.id === 'number'){
//処理
}else{
return;
}
}else{
return;
}
}
実際のコードでは”//処理”の部分が大きくなり、else以下を読もうとした時このelseの元のifはなんだったか、となることがあります。ならなくともifの中を覚えておくことに記憶領域を一部占有されます。
このコードの条件文による分岐で行いたいことは”条件に合えば処理を行う”ということであり、これは”条件に合わなければ処理を行わない”と言い換えられます。この言い換えの通りに先のコードを書き換えると次の様になります。
function (data){
if(data === undefined){
return;
}
if(typeof data.id !== 'number'){
return;
}
//処理
}
元のコードではelse以下の文を読む時ifの中を記憶したまま”//処理”の部分を通る必要がありましたが、書き換えたコードならば処理を行わない条件に当てはまった場合、処理を行わずに抜けるということがすぐにわかります。これにより条件文の中身を覚えておく必要がなくなりました。またこの例の場合、単純で短い条件文二つ程度なのでさらにまとめて下の様にするのもよいです。
function (data){
if((data === undefined) || (typeof data.id !== 'number')){
return;
}
//処理
}
一見、data===undefinedの時にdata.idを参照することによってnull参照でエラーが起きる、と思えますがそうはならない言語が多数です。大体の言語には評価が決まった時点で評価を返す機能である短絡評価機能が備わっています。そのためdata===undefinedの時にはdata===undefinedを読んだ時点で条件はtrueと評価されif節の中に入ります。結果data.idは参照されずエラーは起きません。