2011-06-30 10 views
6

現在、(私は)かなりの数の組み込みif文が必要なコードを作成しています。埋め込むif文の数にはいくつかの基準がありますか?私のグーグル・グーグルの大部分は、優れたものを扱っています。理由は分かりません。埋め込まれたif文が多すぎますか?

標準がある場合、その理由は何ですか?読みやすくするためか、コードをよりスムーズに動かすことですか?私の考えでは、主に読みやすくするためには意味があります。

私の場合、構造の例:

if (!all_fields_are_empty): 
    if (id_search() && validId()): 
     // do stuff 
    else if (name_search): 
     if (name_exists): 
      if (match < 1): 
       // do stuff 
     else: 
      // do stuff 
    else if (name_search_type_2): 
     if (exists): 
      if (match < 1): 
       // do stuff 
     else: 
      // do stuff 
else: 
    // you're stupid 

私はのために/ whileループネストされて2-3には限界があることを聞いたことがあるが、if文のためのいくつかの規格がありますか?

更新: 私は今、私のベルトの下に何年かあります。この多くの文を使用しないでください。ifこれが多く必要な場合は、デザインが悪い可能性があります。今日、私は最小限のifステートメントまたはswitchケースでこれらのことを行うエレガントな方法を見つけることができます。コードはよりクリーンで、テストも簡単で、メンテナンスも簡単です。通常は。

+0

可能な重複:http://stackoverflow.com/questions/4610489/maximum-number-of-nested-conditions-allowed –

+0

私はどのように多く、私はどのような基準を最大聞いてるのよさを求めていませんよプログラマーの一人です。 – Cody

+1

プログラマには「標準」の最大値はありません。それぞれの状況には、それ自身のネストされた最大値があります。たとえば、いくつかのひどい計算をしている重い数学コードがある場合 - 近くにすべて説明するコメントがあれば、問題のない15個のネストされたifで簡単に行くことができます。しかし、そのコードの一部が再利用可能な場合、再利用できるように分割しようとします。 – bezmax

答えて

4

のようないくつかの素晴らしい本を見てみることをお勧めします。技術的には、私はネスティングの制限を認識していません。

自分が非常に深くなっていると、デザインが悪いと感じるかもしれません。

投稿した内容の一部は、caseという声明の方が効果的かもしれません。

私は読みやすさと次の人のためのコードのメンテナンスに関心があります。これは、最初の人(あなた)の場合でも、まず最初は大丈夫です。

編集:またSearchableObject()のようなものであるクラスを持つ考えるかもしれ

。共通の機能を持つ基本クラスを作成し、ID、名前などを継承することができます。このトップレベルのコントロールブロックは大幅に単純化されます。

0

Javaのネストされたif/elseブロックの数の技術的な制限は、おそらくスタックのサイズになります。スタイルは別の問題です。

Btw:コロンは何ですか?

+0

if構造の例として、本当に素早く何かをタイプしました。私のPythonの経験の一部が出てきていると思います。 – Cody

5

私には限界があるとは思われませんが、2つ以上を埋め込むことはお勧めできません。読みにくく、デバッグが難しく、単体テストが難しいです。 RefactoringDesign Patterns、おそらくClean Code

1

技術的には、好きなだけの数を持つことができますが、たくさんある場合はすぐにコードを読むことができなくなります。

何私は通常どおりたいことのようなものです:私はあなたがランディが述べたように、この種のコードの原因が悪い、ほとんどの場合、ある絵

7

を得ると確信している

if(all_fields_are_empty) { 
    abuseuser; 
    return; 
} 

if(id_search() && validId()) { 
    //do stuff 
    return; 
} 

if(name_search) 
{ 
    if(name_exists) 
    //do stuff 
    return 
    else 
    //do stuff 
    return 
} 

アプリケーションの設計。通常私はあなたのケースで "プロセッサ"クラスを使用しようとします。例えば

、いくつかの「操作」という名前の汎用パラメータと異なるパラメータを持つ30種類の操作があることを考えると、あなたはインターフェースを作ることができるが:

interface OperationProcessor { 
    boolean validate(Map<String, Object> parameters); 
    boolean process(Map<String, Object> parameters); 
} 

次に、必要な操作ごとにプロセッサの多くを実装し、例えば:

class PrinterProcessor implements OperationProcessor { 
    boolean validate(Map<String, Object> parameters) { 
     return (parameters.get("outputString") != null); 
    } 
    boolean process(Map<String, Object> parameters) { 
     System.out.println(parameters.get("outputString")); 
    } 
} 

次のステップ - アプリケーションが初期化されたとき、あなたは、いくつかのアレイ内のすべてのあなたのプロセッサを登録します。

これは一例であり、そして、あなたのプロジェクトは、少し異なるアプローチが必要だろうが、私はそれが私が説明したものに似かもしれないと思い、

String operation = parameters.get("operation"); //For example it could be 'name_search' 
OperationProcessor processor = this.processors.get(operation); 
if (processor != null && processor.validate()) { //Such operation is registered, and it validated all parameters as appropriate 
    processor.process(); 
} else { 
    System.out.println("You are dumb"); 
} 

確か:

だからあなたの主な方法は、このようなものになります。

0

Tlの、博士は、あなたが本当にあなたは、本質的に、ここに言及何いずれかの方法

しかし、もはやよりも10〜15本のパスを望んでいないがCyclomatic complexityです。

サイクロマティックな複雑さは、ソフトウェアメトリック(測定値)です.は、プログラムの複雑さを示します。プログラムのソース コードを使用して直線的に独立したパスの数である の量的尺度です。これは、1976年にThomas J. McCabe、Sr.によって開発されました。

したがって、すべてのif文は、潜在的にあなたのコードを新しいパスにして、それを循環性の複雑さを増加させます。潜在的なリファクタリングのために、これを測定するためのツールと高度な複雑さの高い軽い領域があります。

組み込むif文にいくつの標準がありますか?

はい、いいえ。 約10または15を超える複雑な複雑さは高すぎますとコードがリファクタリングされるべきであるというサインが一般的に考えられています(McCabe自身も主張しています)。

McCabeのオリジナルアプリケーションの1つは、プログラム開発中の ルーチンの複雑さを制限することでした。彼は、 のプログラマは、開発中のモジュールの複雑さを数えるべきであり、 というモジュールの循環的複雑さが10を超えたときには、 を小さなモジュールに分割することを推奨しました。[2]この実践は、 ストラクチャード・テスト方法論によって採用されました。これは、 McCabeのオリジナルの出版以来、10の数字は実質的に裏付けのある証拠を受けていましたが、ある状況では が制限を緩和し、モジュールを許可するのが適切かもしれません。 は15と同じくらい複雑です。方法は、 が合意された限度を超えていることが時折ある理由として認められているので、 は、以下のように推奨しています: "各モジュールについて、 循環的複雑さを[合意した限度]に制限するか書かれた "[7]

これは実際には厳しいルールではなく、状況によっては無視することができます。この質問What is the highest Cyclomatic Complexity of any function you maintain? And how would you go about refactoring it?を参照してください。

なぜですか?読みやすさのためか、コードをより多く実行し続けるのですか? ?

これは、コードをスムーズに実行できるようにするためのものです。見積もりMartin Fowler

どんなばかでも、コンピュータが理解できるコードを書くことができます。良い プログラマは人間が理解できるコードを書く。