12 Stimmen

Welcher Kodierungsstil ist besser?

Während einer Codeüberprüfung hat ein erfahrener Entwickler einige Verschachtelungen in meinem Code bemängelt. Er schlug vor, einen bool-Wert zu setzen, damit ich nie mehr als eine Verschachtelungsebene habe. Ich denke, dass mein Code besser lesbar ist, aber ich möchte die Meinung anderer Entwickler dazu hören. Welcher Stil ist besser? Ist seine spontane Abneigung gegen Verschachtelungen begründet?

Nachstehend finden Sie einige vereinfachte Code-Beispiele.

Verschachtelt:

If(condition1)
{
    If(condition2)
    {
        if(condition3)
        {
            return true;
        }
        else
        {
            log("condition3 failed");
        }
    else
    {
        log("condition2 failed")
    }
}
else
{
    log("condition1 failed")
}

return false;

oder

Bool Getrieben:

bool bRC = false;

bRC = (condition1);
if(brc)
{
    bRC = (condition2);
}
else
{
    log("condition1 failed");
    return false;
}

if(bRC)
{
    bRC = (condition3);
}
else
{
    log("condition2 failed");
    return false;
}

if(bRC)
{
    return true;
}
else
{
    log("condition3 failed");
    return false;
}

32voto

tvanfosson Punkte 506878

Deine gefällt mir besser, aber ich würde wahrscheinlich so etwas machen wie:

if (condition1 && condition2 && condition3)
{
    return true;
}
else if (!condition1)
{
    log("condition1 failed");
}
else if (!condition2)
{
    log("condition2 failed");
}
else
{
    log("condition3 failed");
}
return false;

Wenn es sich bei den Bedingungen um komplexe Ausdrücke handelt, könnte ich die Ausdrücke vor der Auswertung der if-Anweisungen entsprechend benannten Variablen zuordnen, um zu vermeiden, dass die Werte in jedem if neu berechnet werden müssen.

Dabei wird davon ausgegangen, dass im Normalfall alle Bedingungen erfüllt sind und Sie daher diese Prüfung zuerst durchführen möchten. Wenn der normale Modus ist, dass eine oder mehrere Bedingungen falsch sind, dann würde ich es neu anordnen und jede Negation der Reihe nach prüfen und einfach true zurückgeben, wenn alle Prüfungen fehlgeschlagen sind. Das würde auch die Notwendigkeit von temporären Variablen anstelle von komplexen Ausdrücken beseitigen.

19voto

Chris Lutz Punkte 69879

Wenn Sie keine dummen Regeln für mehrere Rückgabestellen haben, finde ich das ganz nett (und jemand anderes auch, aber er hat seine Antwort aus unbekannten Gründen gelöscht):

if(!condition1)
{
    log("condition1 failed");
    return false;
}

if(!condition2)
{
    log("condition2 failed");
    return false;
}

if(!condition3)
{
    log("condition3 failed");
    return false;
}

return true;

Vielleicht ist das auch nur eine Abneigung gegen Super-Nesting, aber es ist auf jeden Fall sauberer als sein Mist, der die booleschen Bedingungen in bestimmten Werten speichert. Allerdings kann es im Kontext weniger lesbar sein: Stellen Sie sich vor, eine der Bedingungen wäre isreadable() . Es ist klarer zu sagen if(isreadable()) weil wir wissen wollen, ob etwas lesbar ist. if(!isreadable()) schlägt vor, dass wir wissen wollen, ob sie nicht lesbar ist, was nicht unsere Absicht ist. Es ist sicherlich diskutabel, dass es Situationen gibt, in denen das eine besser lesbar/intuitiver ist als das andere, aber ich selbst bin ein Fan dieser Methode. Wenn sich jemand an den Rückgaben stört, könnten Sie dies tun:

if(!condition1)
    log("condition1 failed");

else if(!condition2)
    log("condition2 failed");

else if(!condition3)
    log("condition3 failed");

else
    return true;

return false;

Aber das ist eher hinterhältig und meiner Meinung nach weniger "klar".

18voto

Michael Ekstrand Punkte 27071

Ich persönlich finde den verschachtelten Code wesentlich einfacher zu lesen.

6voto

Adam Maras Punkte 25358

Ich bevorzuge im Allgemeinen verschachtelte Bedingungen; wenn meine verschachtelten Bedingungen zu weit nach rechts eingerückt werden, muss ich mich natürlich fragen, ob es nicht einen besseren Weg gibt, das zu tun, was ich gerade versuche (Refactoring, Redesign usw.).

5voto

GogaRieger Punkte 345

Ähnlich wie die verschachtelte Version, aber für mich viel sauberer:

if not condition1:
    log("condition 1 failed")
else if not condition2:
    log("condition 2 failed")
else if not condition3:
    log("condition 3 failed")
else
    return true;
return false;

Beachten Sie, dass jede Bedingung nur einmal ausgewertet wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X