複雑な「if」ロジックを支援するツールはありますか?

StackOverflow https://stackoverflow.com/questions/626120

  •  06-07-2019
  •  | 
  •  

質問

私の個人的なプログラミングの悪魔の1つは、ifステートメント(または類似の)で制御する必要がある複雑なロジックでした。必ずしもそのように複雑であるとは限らず、場合によっては説明が必要ないくつかの州だけでもあります。

設計時に開発者が「状態」を確認し、コードをリファクタリングして結果のコードを簡素化する手段を講じることができるツールまたは手順はありますか?私はそれらの線に沿ってマトリックスや何かを描くことを考えています...?

役に立ちましたか?

解決

すべての意欲的なプログラマー向けに、命題論理の基本コースをお勧めします。最初は、表記法とギリシャ文字は数学を嫌う人にとって不快なように思えるかもしれませんが、それは本当にあなたのスキルセットで最も強力な(そしてしばしば無視されている)ツールの1つであり、コアではかなり単純です。

基本的な演算子 de Morgan's およびその他の基本法真理値表、および例えば選言および結合標準形は私にとって目を見張るものでした。それらについて学ぶ前に、条件式は危険な獣のように感じました。それ以来、重砲を撃破することで、必要に応じてそれらを提出に駆り立てることができることを知っています!

他のヒント

真理値表は基本的に網羅的なアプローチであり、可能であればすべての可能性を強調します。

Microsoft Pex をご覧ください。あなたが考えていなかったフリンジケースを見つけるのに役立ちます。

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

コードをできるだけフラットにコーディングし、すべての否定を最初に排除する場合の複雑な処理方法。化合物の一部を上に配置することで化合物を取り除くことができる場合は、それを行います。

シンプルさの美しさは、本やクラスを習得する必要がないことです。分割できる場合は、分割してください。その一部を削除できる場合は、削除してください。理解できない場合は、別の方法で行ってください。そして、ほとんどの場合、flatはネストされているよりも優れています(pythonに感謝!)。

読みやすい:

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

読むことより:

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

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

私が長年にわたって複雑なIFで経験してきた最大の問題は、人々がすべてのブランチをテストしていないことです。ブランチをヒットする可能性がどれほど低いかに関係なく、可能なブランチごとにテストを作成してください。

最大4つの変数に適したカーノーマップも試してみてください。 。

まだお持ちでない場合は、コード完了を読むことを強くお勧めします。このようなトピックに関する多くのアドバイスがあります。現時点ではコピーが手元にありません。そうでない場合は、このセクションの要約を本に投稿します。

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

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

カーノー地図は、真理値表から情報を取得する良い方法です(Visageが提案) )およびそれらをコンパクトな式および/または非式に変換します。これらは通常、EEデジタルロジックコースで教えられます。

デザインパターンを試しましたか?戦略パターンとして知られているものを見るかもしれません: http://en.wikipedia.org/wiki/ Strategy_pattern

ニュークリアスオプションを確認してください: Drools 。それには非常に多くのことがあります。その機能を理解するために、文献を熟読するのに1、2日かかりました。しかし、複雑なif-thenロジックがプロジェクトの進化する部分であるアプリケーション(たとえば、モジュールアルゴリズムを使用するアプリケーション)がある場合、それは単なるものかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top