Gibt es irgendwelche Werkzeuge mit komplexen zu unterstützen ‚wenn‘ Logik?

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

  •  06-07-2019
  •  | 
  •  

Frage

Einer meiner persönlichen Programmierung Dämonen ist schon immer komplexe Logik, die von if-Anweisungen gesteuert werden muss (oder ähnlich). Nicht immer unbedingt, dass komplexe entweder, manchmal nur wenige Staaten, die berücksichtigt werden muss.

Gibt es irgendwelche Werkzeuge oder die Schritte einen Entwickler während der Entwurfszeit durchführen kann, um die ‚Staaten‘ helfen zu sehen, und Maßnahmen zu ergreifen, um den Code Refactoring Sie den resultierenden Code zu vereinfachen? Ich denke, eine Matrix oder etwas in diese Richtung der Erstellung ...?

War es hilfreich?

Lösung

würde ich einen Grundkurs in Propositionslogik für jeden angehenden Programmierer empfehlen. Zunächst können die Notation und griechische Buchstaben scheinen abstoßend auf die Mathe-abgeneigt, aber es ist wirklich eine der mächtigsten (und oft vernachlässigten) Werkzeuge in ihren Fähigkeiten und ziemlich einfach, in dem Mittelpunkt.

Die Basisoperatoren , de Morgans und andere grundlegende Gesetze , Wahrheitstabellen , und das Vorhandensein von zB disjunctive und konjunktive Normalformen ein Augenöffner für mich waren. Bevor ich über sie gelernt, fühlte bedingte Ausdrücke wie gefährliche Tiere. Seitdem ich weiß, dass ich sie in der Unterwerfung bei Bedarf durch Ausbrechen der schwere Artillerie peitschen kann!

Andere Tipps

Wahrheitstabellen sind im Grunde die erschöpfende Ansatz und (hoffentlich) markieren alle Möglichkeiten.

Vielleicht möchten Sie einen Blick nehmen an Microsoft Pex , die hilfreich sein kann für das Auffinden der Franse Fällen Sie nicht gedacht hatte.

Ich denke, dass der Entwickler fragen, wie sein Leben leichter zu machen, wenn sie mit komplexem, wenn Code.

Umgang

Die Art und Weise, die ich komplex handhaben, wenn Code so flach zu codieren, wie möglich und Unkräuter alle Negationen first out. Wenn Sie oben, indem man einen Teil davon, wenn sich der Verbindung loswerden kann, dann das.

Die Schönheit der Einfachheit ist, dass es nicht ein Buch oder eine Klasse, es zu lernen dauert. Wenn Sie es brechen können, tun dies. Wenn Sie einen Teil davon entfernen können, tun dies. Wenn Sie es nicht verstehen, es anders machen. Und eben ist fast immer besser als verschachtelt (dank Python!).

Es ist einfacher zu lesen:

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

als es ist zu lesen:

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

Wahrheitstabellen und Unit-Tests -. Die Tabellen erstellen, (n-dimensionalen für n Variablen), und verwenden Sie diese als Eingänge zu Ihrem Gerät zu testen, die jede Kombination von Variablen testen und die Ergebnisse überprüfen

Das größte Problem, das ich mit komplexen IFs im Laufe der Jahre gesehen habe, ist, dass die Menschen nicht testen alle Zweige. Achten Sie darauf, einen Test für jeden möglichen Zweig zu schreiben, egal wie unwahrscheinlich es scheint, dass Sie es treffen wird.

Sie möchten vielleicht auch Karnaugh versuchen, Karten , die für bis zu 4 Variablen sind gut .

Wenn Sie nicht bereits haben, würde ich sehr empfehlen Lesen Code Complete . Es hat eine Menge Ratschläge zu Themen wie diese. Ich habe nicht meine Kopie praktisch in dem Moment, sonst ich eine Zusammenfassung dieses Abschnitts in dem Buch schreiben würde.

Teilen Sie die Logik nach unten in diskrete Einheiten (a && b, etc.), die jeweils mit ihren eigenen Variablen. bauen diese dann auf die Logik die Sie benötigen. Benennen Sie jede Variable mit etwas angemessen, so dass Ihre komplexen Aussage ziemlich lesbar ist (obwohl es dauern kann mehrere zusätzliche Linien und eine faire paar temporären Variablen).

Gibt es Gründe, können Sie nicht nur behandeln, die Logik mit Guard-Anweisungen?

Karnaugh Karten schöne Möglichkeiten, können Informationen aus einer Wahrheitstabelle der Einnahme (von Visage vorgeschlagen ) und in kompakte und / oder / nicht Ausdrücke drehen. Diese werden typischerweise in einem EE digitalen Logik Kurs gelehrt wird.

Haben Sie ein Entwurfsmuster ausprobiert? Sie könnten in schauen, was als das Strategiemuster bekannt ist: http://en.wikipedia.org/wiki/ Strategy_pattern

Überprüfen Sie die nukleare Option aus: geifert . Es gibt eine ganze Menge zu es-- mir nahm einen Tag oder zwei der Literatur durchlesen nur einen Griff auf seine Fähigkeiten zu erhalten. Aber wenn Sie Anwendungen, bei denen Ihre komplexe if-then logisch ein sich entwickelnder Teil des Projekts (zum Beispiel eine Anwendung mit modularen Algorithmen) ist es genau das, was sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top