2009-03-09 4 views
10

Einer meiner persönlichen Programmierdämonen war immer eine komplexe Logik, die von if-Anweisungen (oder ähnlich) gesteuert werden muss. Nicht immer notwendigerweise auch dieser Komplex, manchmal nur ein paar Zustände, die berücksichtigt werden müssen.Gibt es irgendwelche Werkzeuge, um mit komplexer 'if' Logik zu helfen?

Gibt es irgendwelche Werkzeuge oder Schritte, die ein Entwickler während der Entwurfszeit ausführen kann, um die "Zustände" zu sehen und Maßnahmen zu ergreifen, um den Code umzuformen, um den resultierenden Code zu vereinfachen? Ich denke darüber nach, eine Matrix oder etwas in dieser Richtung zu entwerfen ...?

Antwort

17

Ich würde einen Grundkurs in propositional logic für jeden aufstrebenden Programmierer empfehlen. Zunächst mögen die Notation und die griechischen Buchstaben für die Mathematikabneigung abschreckend wirken, aber es ist wirklich eines der mächtigsten (und oft vernachlässigten) Werkzeuge in deinem Skillset und ziemlich einfach, im Kern.

Die basic operators, de Morgan's und other basic laws, truth tables, und das Vorhandensein von z.B. disjunctive und conjunctive normal forms waren ein Augenöffner für mich. Bevor ich davon erfuhr, fühlten sich bedingte Ausdrücke wie gefährliche Bestien an. Seitdem weiß ich, dass ich sie nötigenfalls zur Unterwerfung zwingen kann, indem ich die schwere Artillerie ausbringe!

3

Wahrheitstabellen und Komponententests - erstellen Sie die Tabellen (n dimensional für n Variablen) und verwenden Sie diese dann als Eingaben für Ihren Komponententest, der jede Kombination von Variablen testen und die Ergebnisse überprüfen kann.

+0

Wahrheitstabellen sind immer 2-dimensional (außer es gab Neuentwicklungen?). Meinst du n Spalten für n Variablen? –

+0

multidimensionale Wahrheitstabellen? klingt aufregend! –

+1

Er ... Wahrheitstabellen haben Spalten für alle Variablen und Zeilen für alle Kombinationen von Werten. Sie können beliebig viele Variablen darstellen. – cletus

0

Teilen Sie die Logik in diskrete Einheiten (a & & b usw.) mit jeweils einer eigenen Variablen. Dann bauen Sie diese mit der Logik auf, die Sie brauchen. Benennen Sie jede Variable mit einem geeigneten Namen, sodass Ihre komplexe Anweisung ziemlich lesbar ist (obwohl sie mehrere zusätzliche Zeilen und einige temporäre Variablen aufnehmen kann).

+0

Ok, das ist so ziemlich der Ansatz, den ich nehme, das Problem ist, dass ich finde, dass ich neue Zweige hineinfülle, als und wenn ich die Notwendigkeit für sie identifiziere und einen vorhandenen Zweig nicht finden kann. Dies führt offensichtlich zu Spaghetti-Code ... Ich brauche einen Weg, dies zu nehmen und 'sehen-das-größere-Bild' –

5

Wahrheitstabellen sind im Grunde der erschöpfende Ansatz und werden (hoffentlich) alle Möglichkeiten hervorheben.

Vielleicht möchten Sie einen Blick auf Microsoft Pex werfen, die hilfreich sein kann, um die Randfälle zu entdecken, an die Sie nicht gedacht hatten.

+1

+1 für die Informationen über Pex. Sieht wie ein großartiges Werkzeug aus. –

2

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

0

Gibt es einen Grund, warum Sie die Logik nicht mit Guard-Anweisungen umgehen können?

2

Sie können auch versuchen, Karnaugh maps versuchen, die für bis zu 4 Variablen gut sind.

+0

Sie schlagen mich dazu. –

+0

Karnaugh Karten sind gut dafür. Es ist schade, dass ich sie mit einer Leidenschaft hasse. Sie haben mich überzeugt, dass ich nie ein Computeringenieur sein möchte. :-) –

0

Karnaugh maps kann eine gute Möglichkeit sein, Informationen aus einer Wahrheitstabelle (von Visage empfohlen) in kompakte und/oder nicht Ausdrücke umzuwandeln. Diese werden normalerweise in einem EE-Logikkurs vermittelt.

1

Wenn Sie noch nicht, würde ich sehr empfehlen, Code Complete zu lesen. Es gibt viele Ratschläge zu solchen Themen. Ich habe meine Kopie im Moment nicht zur Hand, sonst würde ich eine Zusammenfassung dieses Abschnitts im Buch posten.

4

Ich denke, dass der Entwickler fragt, wie man sein Leben leichter macht, wenn es sich mit komplexem if-Code beschäftigt.

Die Art und Weise, wie ich komplex handle, wenn Code so flach wie möglich codiert ist und alle Negierungen zuerst aussortiert. Wenn Sie die Verbindung loswerden können, indem Sie einen Teil davon oben platzieren, dann tun Sie das.

Die Schönheit der Einfachheit ist, dass es kein Buch oder eine Klasse braucht, um es zu lernen. Wenn Sie es auflösen können, tun Sie es. Wenn Sie einen Teil davon entfernen können, tun Sie dies. Wenn du es nicht verstehst, tu es anders. Und Flat ist fast immer besser als Nested (Danke Python!).

Es ist einfacher zu lesen:

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

als es zu lesen ist:

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

prüfen die nukleare Option aus: Drools. Es gibt eine Menge zu tun ... hat mich ein oder zwei Tage damit beschäftigt, die Literatur zu studieren, nur um ihre Fähigkeiten in den Griff zu bekommen. Aber wenn Sie Anwendungen haben, bei denen Ihre komplexe Wenn-Dann-Logik ein sich entwickelnder Teil des Projekts ist (z. B. eine Anwendung mit modularen Algorithmen), könnte es genau das Richtige sein.

Verwandte Themen