- PR -

プログラムの書き方でご指導お願いします。

投稿者投稿内容
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 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ではどちらの方が読みやすいでしょうか?
他にもよい書き方がありましたらぜひご教授お願い致します。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-11-08 16:19
パターンB
明らかに結果が分かったのであればその段階でプログラムを抜けるのがいいやり方です。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-11-08 16:32
既に明瞭な回答がありますが。

私もパターンB。

チェック項目が 10 個以上出てきた場合、パターンAではどのようなプログラムになるかを考えると愉しいかもしれません

# 蛇足:
# 藤原博文さんの「C プログラミング診断室」第 12 章で同じケースが取り上げられています。
# http://www.pro.or.jp/~fuji/mybooks/cdiag/
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2005-11-08 16:39
Anthyhime様
Gio様

さっそくのご解答ありがとうございます。
現在、既存のプログラムを修正しているのですが、パターンAの
ような書き方になっていたので私もパターンBの方が読みやすい
んじゃないかと悩んでいました。
さっそくパターンBのように書き直したいと思います^^
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-11-08 16:41
どもです。がるです。
あえて「パターンC」を :-P

コード:
  // エラーチェック
  // XXX もし問題が発生したらthrowが発生する
  chackA();
  chackB();

  // 正常
・・・・正常時の処理・・・・


例外処理系ならこーゆー書き方もありか、と。
これなら、例えば「chackAでは常にExceptionA()をthrowする
つもりだったんだけど実はちと区分したくてExceptionA()と
ExceptionA-XX()の2種類を判断してthrowしたくなった」
なんて仕様変更にも容易に耐えられます。

で、さらに応用すると
コード:
  // エラーチェック
  // XXX もし問題が発生したらthrowが発生する
  chack();  // 内部でcheckAとcheckBをcallしている

  // 正常
・・・・正常時の処理・・・・


っていう風に書けるです。
これならcheckCとかcheckDとか 以下略。

まぁ「こーゆーやり方も」って感じで軽く眺めて
いただけると。
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2005-11-08 17:00
おおおっ!なるほどぉ!このような書き方は考えつかなかったです。
がるがる様わかりやすい解説までありがとうございます。
今回は例外処理系で仕様変更も可能性があるのでぜひ参考にさせてい
ただきます^^
権兵衛
ベテラン
会議室デビュー日: 2002/09/24
投稿数: 50
投稿日時: 2005-11-08 17:17
引用:

がるがるさんの書き込み (2005-11-08 16:41) より:
どもです。がるです。
あえて「パターンC」を

コード:
  // エラーチェック
  // XXX もし問題が発生したらthrowが発生する
  chackA();
  chackB();

  // 正常
・・・・正常時の処理・・・・






これって、chackA()とchackB()がエラーのときにfalseでなく例外を返す仕様の場合であればって話ですよね?それぞれのメソッドがなんらかのチェックメソッドでエラーが例外でないのであればこの方法は使えません。chackA()、chackB()が例外をthrowするように変更すると、falseを返したときに何か処理をするって要件があると困るかもしれません。

そのあとの chack() メソッドを別途定義して、その中でchackA()、chackB()をコールするみたいな書き方はよくしますが。
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 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にしてあります。)

スキルアップ/キャリアアップ(JOB@IT)