3

私たちは通常、失敗を避けるためにビジネス ロジックに不必要なチェックを入れます。

例えば。

1. public ObjectABC funcABC(){

      ObjectABC obj = new ObjectABC;
     ..........
     ..........
     //its never set to null here.
     ..........
     return obj; 
} 

ObjectABC o = funABC();

if(o!=null){
//do something
}

null になることはないと確信しているのに、なぜこの null チェックが必要なのでしょうか? それは良い習慣ですか?

2. int pplReached = funA(..,..,..);
   int totalPpl   = funB(..,..,..);

   funA() just puts a few more restriction over result of funB().


    Double percentage = (totalPpl==0||totalPpl<pplReached) ? 0.0 : pplReached/totalPpl;

チェックは必要'totalPpl<pplReached'ですか?

問題は、そのようなチェックを行うことで、根本的な問題を飲み込んでいないかということです。これらのチェックを入れることで、理想的に表示されるべき問題が回避されます。

おすすめの方法は?

4

1 に答える 1

8

聴衆について考えてください。小切手は価値がある

  1. プログラマーがエラーを検出するのに役立ちます。
  2. 他のプログラマーのコードがあなたのコードと一致するエラーを検出するのに役立ちます。
  3. プログラムが不正な入力または無効な状態から回復できるようにする、または
  4. メンテナーが後でエラーを導入するのを避けるのに役立ちます。

null上記のチェックがこれらに当てはまらない場合、または同じことを行うより単純なメカニズムがある場合は、省略してください。

より単純なメカニズムには、多くの場合、

  1. 単体テスト。
  2. 読者に意図を伝え、 findbugsまたは同様のツールでチェックできる注釈
  3. assertコードを早期に失敗させ、絶対に到達してはならないエラー処理コードを挿入する必要なく、コード カバレッジ ツールを混乱させることなく意図を伝える
  4. ドキュメントまたはインライン コメント

この場合、注釈を追加することをお勧めします

public @Nonnull ObjectABC funcABC(){

findbugs をビルド プロセスに統合し、場合によっては置き換える

if(o!=null){
//do something
}

assert o != null: "funcABC() should have allocated a new instance or failed."

そのようなチェックを入れることで、何か根本的な問題を飲み込んでいないでしょうか。

経験則として、

  1. 単体テストは、小さなコードの動作をチェックするのに適しています。重要な機能の単体テストを記述できない場合、根本的な問題は、テスト可能なコードを記述していないことです。
  2. 注釈は、コード レビュアー、メンテナー、および自動化ツールに意図を伝えるのに適しています。これらのツールをプロセスに統合していない場合、根本的な問題は、利用可能なコード品質ツールを活用していないことです。
  3. asserts は、仮定を再確認するのに適しています。コードにアサーションを散りばめて、違反しているものをすぐに特定できない場合、基本的な問題は、代表的なデータに対してコードを実行して問題を解決する簡単な方法がないことです。
  4. ドキュメントとインライン コメント (ソース管理コメントを含む) は、チーム内でシステムに関する知識を広めるのに適しています。チームの複数の人がコードの任意の部分の問題を修正できるようにします。それらが常に欠落しているか同期していない場合、根本的な問題は、メンテナーを念頭に置いてコードを書いていないことです。

最後に、デザイン・バイ・コントラクトは、多くの人がビジネス ロジック コードに役立つプログラミング手法です。チームに特定のツールやプラクティスを採用するよう説得できなくても、DbC を読めば、コードベースに重要な不変条件を適用する方法を推論して説明するのに役立つ場合があります。

于 2012-03-27T17:26:51.187 に答える