🔍はじめに
「paiza」の一問題について、 関数を作成したい。
しかし、関数内の"条件文"が複雑になってしまう
そこで、try-catchを用いることで、
すっきりとしたコードになるのではないかと考え検討した。
🔎本題のコード(JavaScript)
- Sample1(if文)
let evol=(num)=>{
//条件文
if(botinfo[num-1][0]<H && 0<=botinfo[num-1][0] && botinfo[num-1][1]<W &&0<=botinfo[num-1][1]){
//メイン処理
if(toolbox[botinfo[num-1][0]][botinfo[num-1][1]]==="T"){
if(botinfo[num-1][2]!=4){
botinfo[num-1][2]++;
}
}
}
}
- Sample2(try-catch文)
let evol=(num)=>{
//メイン処理
try{
if(toolbox[botinfo[num-1][0]][botinfo[num-1][1]]==="T"){
if(botinfo[num-1][2]!=4){
botinfo[num-1][2]++;
}
}
}catch(TypeError){
}
}
🔍2つのコードの比較結果
少ない実行回数では大きな差は出なかったが、10万リクエストしたら下記のように結果がでた!
コード | 実行時間[sec] | 備考 |
---|---|---|
sample1(if文) | 4.23 | |
sample2(try-catch文) | 4.33 | あれれーー?おっかしいぞーー!? |
try-catch文は、メイン処理を試行して例外が生じてからスキップするのに対し、
if文は、条件外ならそもそもメイン処理の試行すら行わないため、
ムダな処理をしなくなった分速くなったと考えられる。
またtry-catch文で用いたTypeError
は
"変数やオブジェクトの型が合わないときに発生するエラーすべて"
を拾ってしまうため、無視してよい条件だけでなく、
本来無視できない状態でも後続処理に通してしまうリスクが考えられる。
(バグの埋め込みになる)
👓真実はいつも1つ!(結論)
その時の要件/仕様にもよると思うが、今回のケースのように条件が明らかな場合は、
条件文を明示しておくことでメイン処理の前に分別をつけておく方が、
パフォーマンス、保守性の観点からみても好ましいのではないかと考えた。