Frage

Ich habe einen massiven Code-Review und ein Muster zu tun Ich stellt fest, alle über den Ort ist dies:

public bool MethodName()
{
    bool returnValue = false;
    if (expression)
    {
        // do something
        returnValue = MethodCall();
    }
    else
    {
        // do something else
        returnValue = Expression;
    }

    return returnValue;
}

Das ist nicht, wie ich habe dies getan, hätte ich hätte gerade den Wert, wenn ich wusste, was es ist. welche dieser beiden Muster ist richtig?

Ich betone, dass die Logik scheint immer strukturiert zu werden, so dass der Rückgabewert nur in einer plave zugeordnet ist und kein Code ausgeführt wird, nachdem er zugewiesen ist.

War es hilfreich?

Lösung

Es gibt eine lange Diskussion zu diesem Thema hier .

Andere Tipps

Eine Menge Leute empfehlen, nur einen Abgang aus dem Verfahren mit. Das Muster, das Sie oben beschreiben folgt dieser Empfehlung.

Der Haupt Kern dieser Empfehlung ist, dass, wenn ou zur Reinigung etwas Speicher oder Zustand haben, bevor sie aus dem Verfahren zurückkehrt, ist es besser, nur den Code an einem Ort zu haben. mehrere Austrittspunkten zu führt entweder Duplizierung von Bereinigungscode oder potenzielle Probleme aufgrund Bereinigungscode an einem oder mehreren der Austrittsstellen fehlen.

Natürlich, wenn Ihre Methode paar Zeilen lang ist, oder braucht keine Bereinigung, könnten Sie mehrere Renditen haben.

Ich habe verwendet ternäre würde, Kontrollstrukturen zu reduzieren ...


return expression ? MethodCall() : Expression;

Ich vermute, ich in der Minderheit sein wird, aber Ich mag den Stil im Beispiel dargestellt. Es ist einfach, eine Log-Anweisung und einen Haltepunkt, IMO hinzuzufügen. Außerdem verwendet, wenn in einer konsistenten Art und Weise, wie es scheint leichter zu „Mustererkennung“ als mehrere Renditen haben.

Ich bin nicht sicher, ob es eine „richtige“ Antwort auf das ist, aber.

Einige Lehrinstitute und Bücher befürworten die einzige Rückkehr der Praxis.

Ob es besser ist oder nicht, ist subjektiv.

Das sieht aus wie ein Teil eines schlechten OOP-Designs. Vielleicht soll es auf dem höheren Niveau Refactoring wird als innerhalb eines einzigen Verfahrens.

Ansonsten ziehe ich einen ternären Operator, wie folgt aus:

return expression ? MethodCall() : Expression;

Es ist kürzer und besser lesbar.

Zurück von einem Verfahren sofort in jeder dieser Situationen:

  1. Sie haben eine Randbedingung gefunden und müssen einen eindeutigen oder Sentinel-Wert zurück: if (node.next = null) return NO_VALUE_FOUND;
  2. Ein erforderlicher Wert / Zustand falsch ist, so dass der Rest des Verfahrens gilt nicht (auch bekannt als eine Schutzklausel). Z.B .: if (listeners == null) return null;
  3. Der Zweck des Verfahrens ist es, einen bestimmten Wert zu finden und zurück, z.B .: if (nodes[i].value == searchValue) return i;
  4. Du bist in einer Klausel, die einen eindeutigen Wert aus der Methode gibt nicht an anderer Stelle in dem Verfahren verwendet: if (userNameFromDb.equals(SUPER_USER)) return getSuperUserAccount();

Ansonsten ist es sinnvoll, nur ein return-Anweisung zu haben, so dass es einfacher ist, die Debug-Protokollierung, Ressourcenbereinigung hinzuzufügen und der Logik folgen. Ich versuche zuerst alle oben genannten vier Fälle zu behandeln, wenn sie zutreffen, dann so spät wie möglich eine Variable mit dem Namen result(s) deklarieren und Werte zuweisen, dass je nach Bedarf.

Sie beide erreichen die gleiche Aufgabe. Einige sagen, dass ein Verfahren nur einen Eintrag und einen Abgang haben sollte.

Ich benutze dies auch. Die Idee ist, dass die Ressourcen in dem normalen Ablauf des Programms freigegeben werden können. Wenn Sie an 20 verschiedenen Orten aus einem Verfahren zu springen, und Sie müssen vor Cleanup () aufrufen, werden Sie noch eine weitere Bereinigung Methode 20mal hinzufügen müssen (oder alles Refactoring)

Ich denke, dass der Kodierer das Design die Definition ein Objekts übernommen hat an der Spitze des Verfahrens toReturn (zB List toReturn = new Arraylist ();) und dann während des Methodenaufrufes bevölkert, und irgendwie beschlossen, es zu einem boolean Rückgabetyp anzuwenden, die ungerade ist.

Könnte auch eine Nebenwirkung eines Codierungsstandard sein, die besagt, dass Sie nicht in der Mitte eines Verfahrens Körper zurückkehren kann, erst am Ende.

Auch wenn kein Code nach dem Rückgabewert ausgeführt wird nun zugeordnet ist es bedeutet nicht, dass einiger Code nicht später hinzugefügt werden muß.

Es ist nicht das kleinste Stück Code, der verwendet werden könnte, aber es ist sehr Refactoring freundlich.

Delphi zwingt dieses Muster durch automatisch eine Variable mit dem Namen „Ergebnis“ zu schaffen, die der Funktion des Rückgabetypen sein. Was auch immer „Ergebnis“ ist, wenn die Funktion beendet, Ihr Rückgabewert ist. Es gibt also keine „Rückkehr“ Stichwort überhaupt.

function MethodName : boolean;
begin
  Result := False;
  if Expression then begin
    //do something
    Result := MethodCall;
  end
  else begin
    //do something else
    Result := Expression;
  end;

  //possibly more code
end;

Das verwendete Muster ist weitschweifig -. Aber es ist auch einfacher zu debuggen, wenn Sie den Rückgabewert wissen möchten, ohne die Register Fenster zu öffnen und die Überprüfung EAX

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