2009-03-09 15 views
10

私の個人的なプログラミングの悪魔の1つは、常にif文(または同様のもの)によって制御される必要がある複雑なロジックです。必ずしも必ずしも複雑であるとは限りません。時には少数の州だけが説明される必要があります。複雑な「if」ロジックを支援するツールはありますか?

開発者が設計時に「状態」を見て、コードを簡単にするためにコードをリファクタリングする対策を講じるためのツールやステップはありますか?私はそれらの線に沿って行列か何かを描くことを考えています...?

答えて

17

すべてのプログラマーのために、基本コースをpropositional logicにすることをお勧めします。最初は表記法やギリシャ語の手紙が数学的嫌悪感に打ち勝っているように見えるかもしれませんが、それはあなたのスキルセットの中で最も強力な(そして無視された)ツールの一つです。

basic operators,de Morgan'sおよびother basic laws,truth tablesdisjunctiveconjunctive normal formsは私の目を引くものでした。私がそれらについて学ぶ前に、条件式は危険な獣のように感じました。それ以来、私は重い砲兵を打ち破ることによって、必要な時にいつでもそれらを服従させることができることを知っています!

3

真理値表と単体テスト - テーブルを作成(n個の変数はn次元)し、これらを単位テストの入力として使用します。単位テストでは、変数の各組み合わせをテストして結果を検証できます。

+0

真理値表は、常に新しい2次元のものです(新しい開発がない限り)。 n個の変数に対してn個の列を意味しますか? –

+0

多次元真理値表楽しそう! –

+1

Er ...真理値表には、すべての値の組み合わせに対するすべての変数と行の列があります。あなたは好きなだけ多くの変数を表現できます。 – cletus

0

ロジックをそれぞれ個別の変数を持つ離散単位(& &bなど)に分割します。次に、必要なロジックを使用してこれらを構築します。複雑なステートメントがかなり読みやすくなるように、各変数に適切な名前を付けます(ただし、いくつかの余分な行とかなりの一時変数が必要です)。

+0

わかりました。これは私が取るアプローチのほうがかなりですが、問題は私自身が新しいブランチを詰め込み、自分の必要性を特定して既存のブランチを見つけることができないということです。これは明らかにスパゲッティコードをもたらします...私はこれを取る方法が必要です。そして、より大きな画像を参照してください。 –

5

真理値表は基本的に徹底的なアプローチであり、すべての可能性を強調(うまくいけば)します。

Microsoft Pexを見てみることをお勧めします。あなたが考えていなかったフリンジケースを見つけるのに役立ちます。

+1

+1 Pexについての情報。素晴らしいツールのように見えます。 –

2

私が複雑なIFで長年見てきた最大の問題は、人々がすべてのブランチをテストしないということです。あなたがそれを打つように見える可能性はほとんどありませんが、可能なブランチごとにテストを書くようにしてください。

0

ガードステートメントでロジックを処理できない理由は何ですか?

2

また、Karnaugh mapsを試してみてください。これは、最大4つの変数に適しています。

+0

あなたはそれに私を打つ。 –

+0

カルノーのマップはそれに適しています。私は情熱を持ってそれらを憎むのはあまりにも悪いです。彼らは私がコンピュータエンジニアになることを望んでいないと私に確信させてくれました。 :-) –

0

Karnaugh mapsは、(Visageによって提案された)真理値表から情報を取り出し、コンパクトおよび/または非表記にするうまい方法です。これらは、通常、EEデジタル論理コースで教えられます。

1

まだお持ちでない場合は、Code Completeとお伝えください。これは、このようなトピックに関するアドバイスがたくさんあります。私は現時点で私のコピーを手元に持っていません。そうでなければ、このセクションの要約を本に掲載します。

4

複雑なifコードを扱うときに、開発者は自分の人生を楽にする方法を尋ねていると思います。

私が複雑なコードを処理する方法は、できるだけフラットにコード化し、最初にすべての否定を取り除くことです。上の部分を配置することによって化合物を取り除くことができれば、それをしてください。

シンプルさの美しさは、それを学ぶために本やクラスを取っていないということです。あなたがそれを分解することができれば、そうしてください。それを削除することができる場合は、削除してください。あなたがそれを理解していない場合は、それを別の方法で行います。そしてフラットはほとんど常にネストされたものより優れています(ありがとうpython!)。

それは読むために簡単です:

if(broken){ 
    return false; 
} 
if (simple){ 
    doit(); 
    return true; 
} 
if(complicated){ 
    divide(); 
    conquor(); 
} 
if(extra){ 
    extra(); 
} 

それが読みするよりも:

if(!broken && (simple || complicated)){ 
.... 
} 
return false; 
0

チェックアウト核オプションを:Drools。それにはかなりのものがあります。文学を熟読して1日か2日かかりました。しかし、複雑なif-thenロジックがプロジェクトの進化する部分(例えば、モジュラーアルゴリズムを持つアプリケーション)であるアプリケーションを使用しているのであれば、それは単なるものかもしれません。

関連する問題