Frage

Ich bin neu in die Programmierung, und frage mich, ob es eine richtige Art und Weise ist Ihre Steuerstruktur Logik zu bestellen.

Es scheint natürlicher zuerst für den wahrscheinlichsten Fall zu überprüfen, aber ich habe das Gefühl, dass einige Kontrollstrukturen werden nicht funktionieren, wenn sie nicht alles überprüfen, die auf etwas zu kommen falsch sind, das ist wahr (logische Deduktion?)

Es würde schwierig sein, diese ‚negative‘ Ansicht anpassen, ziehe ich eine positivere Einstellung, vorausgesetzt alles ist wahr:)

War es hilfreich?

Lösung

In den meisten Fällen die Lesbarkeit ist wichtiger als die Ausführungsgeschwindigkeit. Ich deshalb versuchen, zum leichteren Verständnis zu optimieren, indem Sie den folgenden Ansatz:

All „Behauptung“ Kontrollen nach vorne getan. Dies garantiert, dass alle fehlerhaften Fälle mit ganz am Anfang behandelt werden. dies ist besonders wichtig für Null-Pointer-Kontrollen, z.

    if(arg == null){ 
      throw new IllegalArgumentException();  // harsh (correct)
    }
    // or 
    if(arg == null){
        arg = "";  // forgiving (lazy)
    }

Als nächstes versuche ich nur in jeder if-Anweisung für 1 Zustand zu überprüfen. anstelle von

    if(condition1 && condition2) {
        ...
    } else {
        ...
    }

i im Allgemeinen bevorzugen

    if(condition1) {
        if(condition2) {
            ...
        } else {
            ...
        }
    } else {
        ...
    }

Dieser Ansatz ist einfacher, zum Setzen von Haltepunkten, und es macht die Logik mehr obvous.

Ich vermeide Negationen; anstelle von

    if(! condition) {
        ...a...
    } else {
        ...b...
    }

Dinge sind besser neu geordnet

    if(condition) {
        ...b...
    } else {
        ...a...
    }

Schließlich werden alle Methoden, die ein boolean Ergebnis zurückgeben sollten einen „positive“ Namen haben, was zeigt die Ergebnisse bedeuten:

    boolean checkSomething(Something x){ ... }     // bad -- whats the result?
    boolean isSomethingInvalid(Something x){ ... } // better, but ...
    boolean isSomethingValid(Something x){ ... }   // best, no "mental negation"

Andere Tipps

Es gibt eine ausgezeichnete Diskussion gerade dieses Thema in McConnell Code Complete . Es ist ein Buch, das ich sehr empfehlen kann. Wie auch immer die entsprechende Diskussion ist auf den Seiten 706-708 der ersten Ausgabe oder pg. 749-750 der zweiten Auflage (dank Sockel). Von diesem Buch:

  

Tests anordnen, so dass die eine, die   schnellste und höchstwahrscheinlich um wahr zu sein ist   zuerst ausgeführt. Es sollte einfach sein,   fallen durch den Normalfall, und wenn   es Ineffizienzen sind, sollten sie   werden in die Ausnahmen zu verarbeiten.

Es gibt Dinge, zusätzlich zu dem Wert der Bedingungsanweisung zu beachten. Wenn beispielsweise die Codeblöcke in der Größe deutlich unterschiedlich sind, können Sie zuerst den kleinen Block zu setzen, so dass es leichter zu sehen ist. (Wenn der größere Block wirklich groß ist, kann es braucht Refactoring werden, oder vielleicht in ein separates Verfahren herausgezogen.)

if( condition is true ) {
    do something small;
} else { 
    do something;
    and something else; 
    . . .
    and the 20th something;
}

Innerhalb der Bedingung, ja, es gibt einige Sprachen, die einen Ausdruck stoppen Auswertung einmal einen Teil davon falsch ist. Dies ist wichtig, daran zu erinnern, wenn Sie irgendeine Art von IS definierten Logik im Code enthalten: Wenn Sie die Sprache den gesamten Ausdruck auswertet, sollten Sie dies tun:

if( variable is defined ) {
    if( variable == value ) {
        ...
    }
}

anstatt dies:

if( (variable is defined) && (variable == value) ) {
     ...
}

Ich glaube nicht, gibt es einen „richtigen“ Weg, um Ihre Bedingungen zu entwerfen. Wenn Sie für ein Unternehmen arbeiten, die Standards hat Codierung, sollten Sie überprüfen, ob das in den Normen enthalten ist. (Der letzte Ort, wo ich gearbeitet hatte, eine angemessene Anzahl von Standards definiert, aber nicht angeben, wie bedingte Logik zu schreiben.)

Generell würde ich die unerwarteten Artikel zuerst prüfen, was mich zwingt, mit außergewöhnlichem Ablauf des Programms zu behandeln.

Auf diese Weise kann ich Ausnahmen auslösen / Operationen abbrechen, bevor ich „Einrichten“ für den normalen Programmablauf starten.

Mein Ziel ist meine Bedingungen in eine Art und Weise zu strukturieren, um die Menge an Informationen, die der Leser in nehmen muss, zu minimieren Manchmal ist es einfacher zu testen für die negativen die positiven zu beweisen.

Ein Beispiel - der Test, um zu sehen, ob ein Zeitraum von 2 Tagen, mit einem anderen Zeitraum von 2 Daten schneidet ist einfacher als Test ohne Kreuzung von zwei Perioden schreiben

Wenn es eine einfache Ja oder Fehler Frage ist, dann in die Regel ich die Dinge so strukturieren, dass der Fehlerbehandlungszweig ist die else-Klausel. Wenn es ein Ja ist oder keine Frage (dh weder Zweig ist ein Fehler), es ist eine reine Ermessenssache, was natürlicher anfühlt. Wenn es eine Menge von Tests, die vor dem Herz des Codes gemacht werden muss, ausführen kann, versuche ich in der Regel die Dinge so zu strukturieren, dass die negativen Tests an erster Stelle stehen und irgendwie den Code überspringen, die (Rückkehr aus der Funktion folgt, brechen oder weiter aus eine Schleife).

Entweder / Oder. Ich benutze im Allgemeinen den 'negativen' Ansatz though.

if (! Etwas) {

}

Dies ist ein wenig aus dem Rahmen der Frage, aber in der Regel wollen Sie auch Ihre Methoden schnell zum Scheitern verurteilt. Aus diesem Grunde neige ich dazu, alle meine Argumentation Validierung an der Spitze des Verfahrens zu tun, auch wenn ich werde nicht das Argument verwenden, bis später im Code. Dies schadet die Lesbarkeit, aber nur in dem Fall, in dem das Verfahren wirklich lang ist (muß über den Bildschirm, um zu sehen). Natürlich, das an sich schon ein Code Geruch ist und raus Refactoring neigt zu.

Auf der anderen Seite, wenn die Prüfung nicht einfach ist, und ich werde es sein vorbei an einem anderen Methode aus, die gerade dabei ist, es trotzdem zu überprüfen, werde ich den Code nicht wiederholt in der aktuellen Methode zu überprüfen. Wie bei den meisten Dingen gibt es ein Gleichgewicht.

(Kontext: Java)

READABILITY1: Zustand, der zu einem kleineren Codeblock löst geht zuerst

if (condition) {
  smallBlock();
} else {
  bigBlockStart();
  ........
  bigBlockEnd();
}

READABILITY2: Positive Behauptung geht zuerst, da es einfacher ist, nicht eine Negation Zeichen zu bemerken

MAKING SENSE: Nimmt die alle Voraussetzungen für ein Verfahren unter Verwendung Assert.blabla () und conditionals verwenden Sie nur für das, was die Methode funktioniert

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