- - PR -
プログラムの書き方でご指導お願いします。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-08 16:11
いつもお世話になっております。
プログラムを書いていてどちらの方が読みやすいのかなと思うものが あります。 chackA、chackBメソッドはエラーがあるとfalseを返すようになってい ます。 chackA、chackB共にOKの場合、正常な処理を行いたいと思っています。 ■パターンA if(chackA()){ if(chackB()){ ・・・・正常時の処理・・・・ }else{ throw new ExceptionB(); //又はreturn false;など } }else{ throw new ExceptionA(); //又はreturn false;など } ■パターンB if(!(chackA())){ throw new ExceptionA(); //又はreturn false;など } if(!(chackB())){ throw new ExceptionB(); //又はreturn false;など } ・・・・正常時の処理・・・・ パターンAとパターンBではどちらの方が読みやすいでしょうか? 他にもよい書き方がありましたらぜひご教授お願い致します。 | ||||||||
|
投稿日時: 2005-11-08 16:19
パターンB
明らかに結果が分かったのであればその段階でプログラムを抜けるのがいいやり方です。 | ||||||||
|
投稿日時: 2005-11-08 16:32
既に明瞭な回答がありますが。
私もパターンB。 チェック項目が 10 個以上出てきた場合、パターンAではどのようなプログラムになるかを考えると愉しいかもしれません # 蛇足: # 藤原博文さんの「C プログラミング診断室」第 12 章で同じケースが取り上げられています。 # http://www.pro.or.jp/~fuji/mybooks/cdiag/ | ||||||||
|
投稿日時: 2005-11-08 16:39
Anthyhime様
Gio様 さっそくのご解答ありがとうございます。 現在、既存のプログラムを修正しているのですが、パターンAの ような書き方になっていたので私もパターンBの方が読みやすい んじゃないかと悩んでいました。 さっそくパターンBのように書き直したいと思います^^ | ||||||||
|
投稿日時: 2005-11-08 16:41
どもです。がるです。
あえて「パターンC」を :-P
例外処理系ならこーゆー書き方もありか、と。 これなら、例えば「chackAでは常にExceptionA()をthrowする つもりだったんだけど実はちと区分したくてExceptionA()と ExceptionA-XX()の2種類を判断してthrowしたくなった」 なんて仕様変更にも容易に耐えられます。 で、さらに応用すると
っていう風に書けるです。 これならcheckCとかcheckDとか 以下略。 まぁ「こーゆーやり方も」って感じで軽く眺めて いただけると。 | ||||||||
|
投稿日時: 2005-11-08 17:00
おおおっ!なるほどぉ!このような書き方は考えつかなかったです。
がるがる様わかりやすい解説までありがとうございます。 今回は例外処理系で仕様変更も可能性があるのでぜひ参考にさせてい ただきます^^ | ||||||||
|
投稿日時: 2005-11-08 17:17
これって、chackA()とchackB()がエラーのときにfalseでなく例外を返す仕様の場合であればって話ですよね?それぞれのメソッドがなんらかのチェックメソッドでエラーが例外でないのであればこの方法は使えません。chackA()、chackB()が例外をthrowするように変更すると、falseを返したときに何か処理をするって要件があると困るかもしれません。 そのあとの chack() メソッドを別途定義して、その中でchackA()、chackB()をコールするみたいな書き方はよくしますが。 | ||||||||
|
投稿日時: 2005-11-08 18:01
権兵衛様
ご解答ありがとうございます。 falseを返したときに何か処理をするって要件があった場合 if(!(chackA())){ ・・・処理・・・ throw new ExceptionA(); } と書いていた所を try{ chack(); } catch(ExceptionA exA){ ・・・処理・・・ throw exA; } catch(ExceptionB exB){ ・・・処理・・・ throw exB; } と変更すれば同じような動きになるのかなと思いました。 今回は特に処理を入れる要件はなかったため chack();だけでいけそうな気がしています。 (呼び出し元でもthorwsにしてあります。) |