2016-03-30 9 views
1

vorgeben Ich habe mich über Programmierpraktiken gefragt, und kam mit einer Frage. Es empfiehlt sich, mehrere Parameter innerhalb einer Methode vorzugeben. Wenn Sie diese Methode aufrufen, müssen Sie keine Werte übergeben, wenn der Wert vordefiniert und korrekt ist. dhGute Idee, mehrere Parameter in Methode

 private void ErrorMessage 
    (bool isEmpty = false, bool fromAccEmpty = false, bool toAccEmpty = false){} 

Also, wenn man es so nennen können Sie entweder rufen es über

ErrorMessage(); 

oder

ErrorMessage(true, false, true); 
+0

Hast du [sehen?] (Https://msdn.microsoft.com/en-us/library/dd264739.aspx) – TaW

+3

Off-Topic für SO (denke ich) aber einige Überlegungen: wie oft Sie weglassen diese Parameter?Wenn Sie die Standardeinstellungen häufiger verwenden, dann sollten Sie sie verwenden (mit all ihren Nachteilen, ignorieren Sie sie nicht). Zweite Überlegungen: Solche booleschen Parameter Chaos sollte noch mehr vermieden werden. Verwenden Sie (mindestens) Enumerationsflags oder erzwingen Sie die Verwendung benannter Parameter, der Aufrufpunkt ist absolut obskur. –

+0

Ich benutze die Standardwerte öfter als ich nicht, aber jeder bool hat eine andere if-Bedingung. –

Antwort

2

Ich denke, das wird eine Alternative für Sie sein:

public class ErrorMessage 
    { 
     public bool isEmpty = false; 
     public bool fromAccEmpty = false; 
     public bool toAccEmpty = false; 
    } 
private void ShowErrorMessage(ErrorMessage errorObject) 
    { 
     //Do your stuff here 
    } 

Warum ich vorschlagen Betrachten der Code des op: dieser

# Wenn wir die Methode nennen, wie er in der Frage angegeben (Positional arguments) wir die Methode nicht aufrufen können, indem Wert für die zweiten Parameter angeben, ohne Wert zu dem ersten zu geben. wir können nur auf den zweiten Parameterwert zuweisen

ErrorMessage(fromAccEmpty :true); 

daher andere Standard sein wird:

# Dies kann durch Verwendung Named arguments wie wie folgt vermieden werden. Wir können die vorgeschlagene Methode einfach ohne diese Probleme und Verwirrungen verwenden; Betrachten Sie die folgenden Schnipsel:

ErrorMessage errorBoject = new ErrorMessage(); 
ShowErrorMessage(errorBoject);// All default values ware assigned 
errorBoject.toAccEmpty = true; 
ShowErrorMessage(errorBoject); // call with value for last parameter only rest are default 
errorBoject.isEmpty = true; 
ShowErrorMessage(errorBoject); // only the second value is default rest of them have values 
+0

Ich stimme dieser Antwort zu, aber um zu erweitern, warum es eine gute Idee ist - mehrere Parameter mit Standardwerten macht es unmöglich, beispielsweise den 3. Parameter vom Standard zu ändern, ohne Werte für die ersten beiden explizit angeben zu müssen. – esmoore68

+0

@ esmoore68: bitte sehen Sie; Ich habe die Antwort aktualisiert –

0

eine Sache zum Nachdenken ist dies. Wenn Sie sehen,

ErrorMessage(true, false, true, false); 

im Code 2 Jahre von jetzt an. Was heißt das? Auch hast du die Flaggen in der richtigen Reihenfolge bekommen. Obwohl es langatmiger ist vielleicht

ist klarer. (Ja, ich weiß, Sie 16 Methoden für alle Kombinationen benötigen würden oder 4 flags - aber vielleicht gibt es gemeinsam diejenigen genannt geführt werden, und reduziere die Anzahl der Flags)

Eine weitere Idee ist es, die bools von Aufzählungen ersetzen

ErrorMessage(IsError.True, EmptyAcc.False,..); 

Jetzt können Sie sehen, was sie bedeuten und der Compiler wird sicherstellen, dass Sie die richtigen Dinge

oder un-glücklich Vorschlag des Leitens eines Parameterblocks von einer Art

ErrorMessage(new ErrorControl{IsEmpty=true}); 
passieren

Beachten Sie, dass viele Personen (einschließlich mir) auf Standard-Arg-Werten im Gegensatz zu Überladungen setzen. Warum? Weil, wenn Sie das Standardverhalten ändern möchten, müssen Sie die Anrufer neu kompilieren, vielleicht kein Problem für Sie, aber im Allgemeinen macht Kapselung ein wenig schwächer (Gleicher Grund, warum Sie öffentliche erhalten sollten; set; Accessoren statt nackten öffentlichen Felder)

Verwandte Themen