今回はソースコードを記述しているので、プログラミングと関係の無い方にはわからないと思いますが、ご容赦を。
追っ手から逃れるシステム(きしだのはてな)を見て。過去に、それらの逃げ手の手口にことごとくハマったsugarballですが、今回はsugarが遭遇した逃げ手の手口を紹介します。
■参考リンク
http://d.hatena.ne.jp/nowokay/20050702#1120324360
http://d.hatena.ne.jp/nowokay/20050706#1120597321
http://arton.no-ip.info/diary/20050703.html#p01
インデックスiとjで二重ループをまわし、要素jについて0~8まで別々の処理をしているだけなのだが…
for (int i = 0; i < dataNum; i++) { if(i == 0) continue; for(int j = 0;j < 8; j++){ try{ (絶対catch句に行くような データが入ることがある処理) }catch(NumberFormatException nfe){ if(j == 0){ (j == 0 の場合の処理) } if(j == 6 || j == 7){ if(条件A?){ if(j == 6){ (j == 6 の場合の処理) }else if(j == 7){ (j == 7 の場合の処理) } }else if(条件B?){ if(j == 6){ (j == 6 の場合の処理) }else if(j == 7){ (j == 7 の場合の処理) } } } continue; }catch(Exception ee){ System.out.println("例外です!!:" + オブジェクトをtoString); continue; } if(i > 7) continue; if(j == 2 || j == 3){ if(条件A?){ if(j == 2){ (j == 2 の場合の処理) }else if(j == 3){ (j == 3 の場合の処理) } }else if(条件B?){ if(j == 2){ (j == 2 の場合の処理) }else if(j == 3){ (j == 3 の場合の処理) } } }else if(j == 4 || j == 5){ if(条件A?){ if(j == 4){ (j == 4 の場合の処理) }else if(j == 5){ (j == 5 の場合の処理) } }else if(条件B?){ if(j == 4){ (j == 4 の場合の処理) }else if(j == 5){ (j == 5 の場合の処理) } } }else if(j == 6 || j == 7){ if(条件A?){ if(j == 6){ (j == 6 の場合の処理) }else if(j == 7){ (j == 7 の場合の処理) } }else if(条件B?){ if(j == 6){ (j == 6 の場合の処理) }else if(j == 7){ (j == 7 の場合の処理) } } } } }
見にくすぎる。ツッコミ所を挙げるとすると
①条件Aと条件Bの判定を何回やってんのよ?
②catch句の中で普通に処理すんなよ
③とゆーか、catch句に入るのが前提ってソレは…
④なんか似たような判定ばっかだ。まとめなさい。
⑤とにかく見にくい。というより醜い。
その後日、このロジック内で不具合が発生したので、偶然(というか必然)、sugarがこのコードを修正することになりました。まぁ、仕事でなければこんなコードはドブにでも捨てた方が世のためになるし、見るのも触るのも本気で嫌だったのですが、仕事だから直すしかないわけで。あぁ、サラリーマンはツライね。というわけで、修正したコードが下のやつ。
if(条件A?){ processA(); }else if(条件B?){ processB(); } … … //////////////////////////////////////// // 条件Aのメソッド private void processA(){ for (int i = 0; i < dataNum; i++) { int j = 0; /////////////////////////////////// // j = 0 の場合 (j = 0 の場合の処理);j++; /////////////////////////////////// // j = 1 の場合 (j = 1 の場合の処理);j++; /////////////////////////////////// // j = 2 の場合 (j = 2 の場合の処理);j++; ・・・ j = 3~7 も同様 ・・・ /////////////////////////////////// // j = 8 の場合 (j = 8 の場合の処理); } } //////////////////////////////////////// // 条件Bのメソッドも同様に… private void processB(){ … }
まず条件Aと条件Bで関数分けして、if…else…で分岐していた処理をインデックスのインクリメントで対応しました。わー、面白いほどスッキリ。
やはりこの前者のコードを書いたのもこのときの彼だったりします。で、sugarが後者のコードに修正すると彼は
「sugarさん、凝ったことしてますねぇ」
いや、シンプルにしただけなんで。
sugarが勤める外勤先ではその彼はJavaのスペシャリストとして他の会社に出向したことがあるらしく…この職場、大丈夫か?と思うsugarでした。いや、むしろ辞めたい。
とにかく、キレイなソースコードを書くことは大事なのです。そんでもって、ソースコードを整理するための指標としても使えるのがこの本。オススメです。ちょっと高いけど、値段に見合った価値はあります。