Optionale Parameternamen angeben, obwohl nicht erforderlich?

25

Betrachten Sie die folgende Methode:

public List<Guid> ReturnEmployeeIds(bool includeManagement = false)
{

}

Und der folgende Aufruf:

var ids = ReturnEmployeeIds(true);

Für einen Entwickler, der neu im System ist, wäre es ziemlich schwierig zu erraten, was truepassiert ist. Bewegen Sie den Mauszeiger zuerst über den Methodennamen oder gehen Sie zur Definition (keine der beiden Aufgaben ist im Geringsten eine große Aufgabe). Ist es jedoch aus Gründen der Lesbarkeit sinnvoll, Folgendes zu schreiben:

var ids = ReturnEmployeeIds(includeManagement: true);

Gibt es irgendwo, wo formal diskutiert wird, ob optionale Parameter explizit angegeben werden sollen oder nicht, wenn der Compiler dies nicht benötigt?

Der folgende Artikel beschreibt bestimmte Codierungskonventionen: https://msdn.microsoft.com/en-gb/library/ff926074.aspx

Etwas ähnliches wie der obige Artikel wäre großartig.

JᴀʏMᴇᴇ
quelle
2
Dies sind zwei eher unabhängige Fragen: (1) Sollten Sie aus Gründen der Klarheit optionale Argumente aufschreiben? (2) Sollte man booleanMethodenargumente verwenden und wie?
Kilian Foth
5
Das alles läuft auf persönliche Vorlieben / Stil / Meinung hinaus. Persönlich mag ich Parameternamen, wenn der übergebene Wert ein Literal ist (eine Variable könnte bereits genügend Informationen über ihren Namen enthalten). Aber das ist meine persönliche Meinung.
MetaFight
1
Nehmen Sie diesen Link vielleicht als Beispielquelle in Ihre Frage auf?
MetaFight
4
Wenn es irgendetwas hinzufügt, habe ich es über StyleCop & ReSharper ausgeführt - keiner hatte eine klare Sicht darauf. ReSharper sagt einfach, dass der benannte Parameter entfernt werden könnte , und fährt dann fort, dass ein benannter Parameter hinzugefügt werden könnte . Beratung ist aus einem Grund, den ich denke, kostenlos ...: - /
Robbie Dee
4
Mögliches Duplikat der benannten Argumente (Parameter) als Lesbarkeitshilfe
Doc Brown

Antworten:

28

Ich würde sagen, dass in der C # -Welt eine Aufzählung eine der besten Optionen ist.

Auf diese Weise müssten Sie genau angeben, was Sie tun, und jeder Benutzer würde sehen, was passiert. Es ist auch sicher für zukünftige Erweiterungen;

public enum WhatToInclude
{
    IncludeAll,
    ExcludeManagement
}

var ids = ReturnEmployeeIds(WhatToInclude.ExcludeManagement);

Also meiner Meinung nach hier:

enum> optional enum> optional bool

Bearbeiten: Aufgrund der Diskussion mit LeopardSkinPillBoxHat unten in Bezug auf eine [Flags]Aufzählung, die in diesem speziellen Fall eine gute Anpassung sein könnte (da wir speziell über das Einschließen / Ausschließen von Dingen sprechen), schlage ich stattdessen vor, ISet<WhatToInclude>als Parameter zu verwenden.

Es handelt sich um ein "modernes" Konzept mit mehreren Vorteilen, das sich hauptsächlich aus der Tatsache ergibt, dass es in die LINQ-Kollektionsfamilie passt, aber auch [Flags]maximal 32 Gruppen umfasst. Der Hauptnachteil der Verwendung ISet<WhatToInclude>ist, wie schlecht Sets in der C # -Syntax unterstützt werden:

var ids = ReturnEmployeeIds(
    new HashSet<WhatToInclude>(new []{ 
        WhatToInclude.Cleaners, 
        WhatToInclude.Managers});

Einige davon könnten durch Hilfsfunktionen gemildert werden, sowohl zum Erzeugen der Menge als auch zum Erzeugen von "Verknüpfungsmengen", wie z

var ids = ReturnEmployeeIds(WhatToIncludeHelper.IncludeAll)
NiklasJ
quelle
Ich neige dazu, zuzustimmen; Ich habe allgemein versucht, in meinem neuen Code Aufzählungen zu verwenden, wenn es eine vage Chance gibt, dass die Bedingungen in Zukunft erweitert werden. Das Ersetzen eines Bools durch eine Aufzählung, wenn etwas in einen Drei-Zustands-Zustand übergeht, führt zu sehr lauten Diffs und macht das Beschuldigen von Code um einiges mühsamer. wenn Sie Ihren Code ein Jahr später für eine dritte Option erneut nachrüsten müssen.
Dan Neely
3
Ich mag den enumAnsatz, aber ich bin kein großer Fan des Mischens Includeund Excludein den gleichen , enumwie es ist schwieriger zu begreifen , was los ist . Wenn dies wirklich erweiterbar sein soll, können Sie es zu einem [Flags] enummachen, sie alle machen IncludeXxxund ein bereitstellen, IncludeAlldas auf festgelegt ist Int32.MaxValue. Dann können Sie 2 ReturnEmployeeIdsÜberladungen bereitstellen - eine, die alle Mitarbeiter zurückgibt , und eine, die einen WhatToIncludeFilterparameter verwendet, der eine Kombination von Enum-Flags sein kann.
LeopardSkinPillBoxHat
@LeopardSkinPillBoxHat Ok, ich stimme dem Ausschließen / Einschließen zu. Das ist also ein wenig konstruiertes Beispiel, aber ich hätte es IncludeAllButManagement nennen können. In deinem anderen Punkt stimme ich nicht zu - ich denke, es [Flags]ist ein Relikt und sollte nur aus Legacy- oder Performance-Gründen verwendet werden. Ich denke, a ISet<WhatToInclude>ist ein weitaus besseres Konzept (leider fehlt C # etwas syntaktischer Zucker, um es schön zu benutzen).
NiklasJ
@NiklasJ - Ich mag den FlagsAnsatz, weil er es dem Anrufer erlaubt, WhatToInclude.Managers | WhatToInclude.Cleanersbitweise zu passieren oder genau auszudrücken , wie der Anrufer ihn verarbeiten wird (dh Manager oder Reinigungskräfte). Intuitiver syntaktischer Zucker :-)
LeopardSkinPillBoxHat
@LeopardSkinPillBoxHat Genau, aber das ist der einzige Vorteil dieser Methode. Nachteile sind beispielsweise eine begrenzte Anzahl von Auswahlmöglichkeiten und die mangelnde Kompatibilität mit anderen Linq-ähnlichen Konzepten.
NiklasJ
20

macht es Sinn zu schreiben:

 var ids=ReturnEmployeeIds(includeManagement: true);

Es ist fraglich, ob dies "guter Stil" ist, aber IMHO ist dies zumindest kein schlechter Stil und nützlich, solange die Codezeile nicht "zu lang" wird. Ohne benannte Parameter ist es auch ein üblicher Stil, eine erklärende Variable einzuführen:

 bool includeManagement=true;
 var ids=ReturnEmployeeIds(includeManagement);

Dieser Stil ist wahrscheinlich bei C # -Programmierern häufiger anzutreffen als bei der benannten Parametervariante, da benannte Parameter vor Version 4.0 nicht Bestandteil der Sprache waren. Die Auswirkung auf die Lesbarkeit ist nahezu gleich, es wird lediglich eine zusätzliche Codezeile benötigt.

Also meine Empfehlung: Wenn Sie glauben, dass die Verwendung einer Aufzählung oder von zwei Funktionen mit unterschiedlichen Namen "übertrieben" ist, oder wenn Sie die Signatur aus einem anderen Grund nicht ändern möchten oder können, fahren Sie fort und verwenden Sie den benannten Parameter.

Doc Brown
quelle
Vielleicht möchten Sie feststellen, dass Sie zusätzlichen Speicher für das zweite Beispiel verwenden
Alvaro
10
@Alvaro Es ist sehr unwahrscheinlich, dass dies in einem so trivialen Fall zutrifft (in dem die Variable einen konstanten Wert hat). Auch wenn es so wäre, ist es kaum erwähnenswert. Die meisten von uns haben heutzutage keinen Arbeitsspeicher von 4 KB.
Chris Hayes
3
Da dies C # ist, können Sie es includeManagementals lokal markieren constund die Verwendung von zusätzlichem Speicher vermeiden.
Jacob Krall
8
Leute, ich werde meiner Antwort nichts hinzufügen, was nur von dem ablenken könnte, was ich hier für wichtig halte.
Doc Brown
17

Wenn Sie auf Code stoßen wie:

public List<Guid> ReturnEmployeeIds(bool includeManagement = false)
{

}

Sie können so ziemlich garantieren, dass das, was sich im Inneren befindet, {}ungefähr so ​​aussieht:

public List<Guid> ReturnEmployeeIds(bool includeManagement = false)
{
    if (includeManagement)
        return something
    else
        return something else
}

Mit anderen Worten, der Boolesche Wert wird verwendet, um zwischen zwei Vorgehensweisen zu wählen: Die Methode hat zwei Verantwortlichkeiten. Damit ist so ziemlich ein Codegeruch garantiert . Wir sollten uns immer darum bemühen, dass Methoden nur eines tun; Sie haben nur eine Verantwortung. Ich würde daher argumentieren, dass beide Ihrer Lösungen der falsche Ansatz sind. Die Verwendung optionaler Parameter ist ein Zeichen dafür, dass die Methode mehr als eine Sache tut. Boolesche Parameter sind ebenfalls ein Zeichen dafür. Wenn Sie beide haben, sollten Sie unbedingt die Alarmglocken läuten lassen. Sie sollten daher die beiden verschiedenen Funktionssätze in zwei separate Methoden umgestalten. Geben Sie den Methoden Namen, die verdeutlichen, was sie tun, zB:

public List<Guid> GetNonManagementEmployeeIds()
{

}

public List<Guid> GetAllEmployeeIds()
{

}

Dies verbessert sowohl die Lesbarkeit des Codes als auch die Einhaltung der SOLID-Prinzipien.

BEARBEITEN Wie bereits in den Kommentaren erwähnt, wird der Fall, dass diese beiden Methoden wahrscheinlich über eine gemeinsame Funktionalität verfügen, und dass die gemeinsame Funktionalität wahrscheinlich am besten in eine private Funktion eingebunden wird, die einen booleschen Parameter benötigt, um einen bestimmten Aspekt ihrer Funktion zu steuern .

Sollte in diesem Fall der Parametername angegeben werden, obwohl der Compiler ihn nicht benötigt? Ich würde vorschlagen, dass es keine einfache Antwort darauf gibt und dass von Fall zu Fall ein Urteil erforderlich ist:

  • Das Argument für die Angabe des Namens ist, dass andere Entwickler (einschließlich Sie selbst in sechs Monaten) die primäre Zielgruppe Ihres Codes sein sollten. Der Compiler ist definitiv eine sekundäre Zielgruppe. Schreiben Sie also immer Code, um das Lesen für andere zu erleichtern. anstatt nur das zu liefern, was der Compiler benötigt. Ein Beispiel dafür, wie wir diese Regel jeden Tag anwenden, ist, dass wir unseren Code nicht mit Variablen _1, _2 usw. füllen, sondern aussagekräftige Namen verwenden (die für den Compiler nichts bedeuten).
  • Das Gegenargument ist, dass private Methoden Implementierungsdetails sind. Man könnte vernünftigerweise erwarten, dass jeder, der eine Methode wie die folgende betrachtet, den Code durchläuft, um den Zweck des booleschen Parameters zu verstehen, da er sich innerhalb der Interna des Codes befindet:
public List<Guid> GetNonManagementEmployeeIds()
{
    return ReturnEmployeeIds(true);
}

Ist die Quelldatei und die Methoden klein und leicht verständlich? Wenn ja, dann ist der genannte Parameter wahrscheinlich ein Rauschen. Wenn nein, kann es sehr hilfreich sein. Wenden Sie die Regel also den Umständen entsprechend an.

David Arno
quelle
12
Ich höre, was Sie sagen, aber Sie haben den Punkt, den ich verlange, irgendwie verpasst. Unter der Annahme , ein Szenario , wobei es ist am besten geeigneten optionalen Parameter zu verwenden (diese Szenarien existieren), ist es in Ordnung , um die Parameter zu nennen , obwohl es nicht notwendig ist?
19.
4
Alles wahr, aber die Frage war nach einem Aufruf einer solchen Methode. Auch ein Flag-Parameter garantiert keine Verzweigung innerhalb der Methode. Es kann einfach an eine andere Ebene weitergegeben werden.
Robbie Dee
Das ist nicht falsch, aber zu einfach. In echtem Code werden Sie feststellen public List<Guid> ReturnEmployeeIds(bool includeManagement) { calculateSomethingHereForBothBranches; if (includeManagement) return something else return something else }, dass eine Aufteilung in zwei Methoden wahrscheinlich bedeutet, dass diese beiden Methoden das Ergebnis der ersten Berechnung als Parameter benötigen.
Doc Brown
4
Ich denke, was wir alle sagen, ist die Öffentlichkeit Gesicht Ihrer Klasse wahrscheinlich zwei Methoden (jede mit einer Verantwortung) verfügbar machen sollte, aber intern kann jede dieser Methoden die Anforderung vernünftigerweise an eine einzelne private Methode mit einem verzweigten bool-Parameter weiterleiten .
MetaFight
1
Ich kann mir 3 Fälle für das Verhalten vorstellen, das sich zwischen den beiden Funktionen unterscheidet. 1. Es gibt eine andere Vorverarbeitung. Lassen Sie die öffentlichen Funktionen Argumente in die private Funktion vorverarbeiten. 2. Es gibt eine andere Nachbearbeitung. Lassen Sie die öffentlichen Funktionen das Ergebnis der privaten Funktion nachbearbeiten. 3. Zwischenverhalten ist unterschiedlich. Dies kann als Lambda an die private Funktion übergeben werden, sofern Ihre Sprache dies unterstützt. Oft führt dies zu einer neuen wiederverwendbaren Abstraktion, die Ihnen vorher nicht wirklich in den Sinn gekommen ist.
jpmc26
1

Für einen Entwickler, der neu im System ist, wäre es ziemlich schwierig zu erraten, was wahr ist. Bewegen Sie den Mauszeiger zuerst über den Methodennamen oder gehen Sie zur Definition (keine der beiden Aufgaben ist im Geringsten eine große Aufgabe).

Ja stimmt. Selbstdokumentierender Code ist eine schöne Sache. Wie andere Antworten gezeigt haben, gibt es Möglichkeiten, die Mehrdeutigkeit des Aufrufs zu beseitigen, ReturnEmployeeIdsindem Sie eine Aufzählung, andere Methodennamen usw. verwenden. Manchmal können Sie den Fall jedoch nicht wirklich vermeiden, möchten ihn jedoch nicht verwenden sie überall (es sei denn, Sie mögen die Ausführlichkeit von Visual Basic).

Zum Beispiel kann es helfen, einen Anruf zu klären, aber nicht unbedingt einen anderen.

Ein benanntes Argument kann hier hilfreich sein:

var ids = ReturnEmployeeIds(includeManagement: true);

Fügen Sie nicht viel zusätzliche Klarheit hinzu (ich gehe davon aus, dass dies eine Aufzählung analysiert):

Enum.Parse(typeof(StringComparison), "Ordinal", ignoreCase: true);

Dies kann die Übersichtlichkeit beeinträchtigen (wenn eine Person nicht versteht, welche Kapazität in einer Liste enthalten ist):

var employeeIds = new List<int>(capacity: 24);

Oder wo es egal ist, weil Sie gute Variablennamen verwenden:

bool includeManagement = true;
var ids = ReturnEmployeeIds(includeManagement);

Gibt es irgendwo, wo formal diskutiert wird, ob optionale Parameter explizit angegeben werden sollen oder nicht, wenn der Compiler dies nicht benötigt?

Nicht AFAIK. Lassen Sie uns jedoch beide Teile ansprechen: Das einzige Mal, dass Sie benannte Parameter explizit verwenden müssen, besteht darin, dass der Compiler dies verlangt (im Allgemeinen, um die Mehrdeutigkeit von Anweisungen zu beseitigen). Ansonsten können Sie sie jederzeit verwenden. In diesem Artikel von MS finden Sie einige Vorschläge, wann Sie sie verwenden möchten, die jedoch nicht besonders eindeutig sind: https://msdn.microsoft.com/en-us/library/dd264739.aspx .

Persönlich verwende ich sie am häufigsten, wenn ich benutzerdefinierte Attribute erstelle oder eine neue Methode ausarbeite, bei der sich meine Parameter ändern oder neu angeordnet werden können (b / c-benannte Attribute können in beliebiger Reihenfolge aufgelistet werden). Außerdem verwende ich sie nur, wenn ich einen statischen Wert inline bereitstelle. Wenn ich eine Variable übergebe, versuche ich, gute Variablennamen zu verwenden.

TL; DR

Letztendlich kommt es auf die persönlichen Vorlieben an. Natürlich gibt es einige Anwendungsfälle, in denen Sie benannte Parameter verwenden müssen, aber danach müssen Sie einen Beurteilungsaufruf durchführen. IMO - Verwenden Sie es überall dort, wo Sie glauben, dass es Ihnen dabei hilft, Ihren Code zu dokumentieren, Mehrdeutigkeiten zu verringern oder Methodensignaturen zu schützen.


quelle
0

Wenn der Parameter aus dem (vollständig qualifizierten) Namen der Methode hervorgeht und seine Existenz dem entspricht, was die Methode tun soll, sollten Sie dies nicht tun die benannte Parametersyntax verwenden. Zum Beispiel ist ReturnEmployeeName(57)es ziemlich offensichtlich, dass dies 57die ID des Mitarbeiters ist, so dass es überflüssig ist, sie mit der benannten Parametersyntax zu kommentieren.

Mit ReturnEmployeeIds(true), wie Sie sagten, ist es unmöglich, herauszufinden, was truebedeutet , wenn Sie sich die Deklaration / Dokumentation der Funktion nicht ansehen - Sie also sollten also die benannte Parametersyntax verwenden.

Betrachten Sie nun diesen dritten Fall:

void PrintEmployeeNames(bool includeManagement) {
    foreach (id; ReturnEmployeeIds(includeManagement)) {
        Console.WriteLine(ReturnEmployeeName(id));
    }
}

Die benannte Parametersyntax wird hier nicht verwendet, aber da wir eine Variable übergeben ReturnEmployeeIdsund diese Variable einen Namen hat, bedeutet dieser Name zufällig dasselbe wie der Parameter, an den wir ihn übergeben (dies ist häufig der Fall - aber nicht immer!) - wir brauchen die benannte Parametersyntax nicht, um die Bedeutung des Codes zu verstehen.

Die Regel ist also einfach: Wenn Sie anhand des Methodenaufrufs leicht verstehen können , was der Parameter bedeuten soll, verwenden Sie den benannten Parameter nicht. Wenn Sie dies nicht können, ist dies eine Lücke in der Lesbarkeit des Codes, und Sie möchten diese wahrscheinlich beheben (natürlich nicht um jeden Preis, aber Sie möchten in der Regel, dass der Code lesbar ist). Der Fix muss nicht als Parameter bezeichnet werden. Sie können den Wert auch zuerst in eine Variable einfügen oder die in den anderen Antworten vorgeschlagenen Methoden verwenden, sofern das Endergebnis das Verständnis der Funktionsweise des Parameters erleichtert.

Idan Arye
quelle
7
Ich bin damit nicht einverstanden, dass ReturnEmployeeName(57)sofort klar wird, dass 57es sich um die ID handelt. GetEmployeeById(57)auf der anderen Seite ...
Hugo Zink
@HugoZink Ich wollte anfangs so etwas für das Beispiel verwenden, habe es aber absichtlich geändert ReturnEmployeeName, um Fälle zu veranschaulichen, in denen auch ohne ausdrückliche Erwähnung des Parameters im Namen der Methode zu erwarten ist, dass die Leute herausfinden, was es ist. Auf jeden Fall ist es bemerkenswert, dass ReturnEmployeeNameSie im Gegensatz zu vernünftigerweise nicht ReturnEmployeeIdsin etwas umbenennen können , das die Bedeutung hinter den Parametern anzeigt.
Idan Arye
1
In jedem Fall ist es ziemlich unwahrscheinlich, dass wir ReturnEmployeeName (57) in ein echtes Programm schreiben. Es ist weitaus wahrscheinlicher, dass wir ReturnEmployeeName (employeeId) schreiben. Warum sollten wir eine Mitarbeiter-ID fest codieren? Es sei denn, es handelt sich um den Personalausweis des Programmierers, und es ist eine Art Betrug im Gange. Fügen Sie dem Gehalt dieses Mitarbeiters ein wenig hinzu. :-)
Jay
0

Ja, ich denke es ist ein guter Stil.

Dies ist am sinnvollsten für Boolesche und ganzzahlige Konstanten.

Wenn Sie eine Variable übergeben, sollte der Variablenname die Bedeutung verdeutlichen. Wenn dies nicht der Fall ist, sollten Sie der Variablen einen besseren Namen geben.

Wenn Sie eine Zeichenfolge übergeben, ist die Bedeutung oft klar. Zum Beispiel, wenn ich einen Aufruf von GetFooData ("Oregon") sehe, kann ein Leser davon ausgehen, dass der Parameter ein Zustandsname ist.

Natürlich sind nicht alle Zeichenfolgen offensichtlich. Wenn ich GetFooData ("M") sehe, habe ich keine Ahnung, was "M" bedeutet, es sei denn, ich kenne die Funktion. Wenn es sich um eine Art Code handelt, wie z. B. M = "Angestellte auf Managementebene", sollten wir wahrscheinlich eher eine Aufzählung als ein Literal haben und der Aufzählungsname sollte klar sein.

Und ich nehme an, eine Saite könnte irreführend sein. Vielleicht bezieht sich "Oregon" in meinem obigen Beispiel nicht auf den Staat, sondern auf ein Produkt oder einen Kunden oder was auch immer.

Aber GetFooData (true) oder GetFooData (42) ... das könnte alles bedeuten. Benannte Parameter sind eine wundervolle Möglichkeit, sich selbst zu dokumentieren. Ich habe sie mehrmals genau zu diesem Zweck verwendet.

Jay
quelle
0

Es gibt keine eindeutigen Gründe, warum diese Art von Syntax überhaupt verwendet werden sollte.

Versuchen Sie im Allgemeinen, boolesche Argumente zu vermeiden, die in einiger Entfernung willkürlich aussehen können. includeManagementwird (höchstwahrscheinlich) das Ergebnis stark beeinflussen. Aber das Argument scheint "wenig Gewicht" zu haben.

Die Verwendung einer Aufzählung wurde diskutiert. Sie sieht nicht nur so aus, als würde das Argument "mehr Gewicht haben", sondern bietet auch Skalierbarkeit für die Methode. Dies ist jedoch möglicherweise nicht in allen Fällen die beste Lösung, da Ihre Methode ReturnEmployeeIdsneben dem WhatToInclude-enum skaliert werden muss (siehe NiklasJ Antwort von ). Dies kann später zu Kopfschmerzen führen.

WhatToIncludeBeachten Sie Folgendes : Wenn Sie das -enum skalieren, aber nicht die ReturnEmployeeIds-methode. Es könnte dann einen ArgumentOutOfRangeException(besten Fall) werfen oder etwas völlig Unerwünschtes ( nulloder ein leeres List<Guid>) zurückgeben. Was in einigen Fällen den Programmierer verwirren könnte, besonders wenn SieReturnEmployeeIds sich in einer Klassenbibliothek befinden, in der der Quellcode nicht sofort verfügbar ist.

Man wird davon ausgehen, dass WhatToInclude.Traineesdas funktionieren wird, wennWhatToInclude.All sieht, dass die Auszubildenden eine "Teilmenge" von allen sind.

Dies hängt (natürlich) davon ab, wie ReturnEmployeeIds es implementiert ist.


In Fällen, in denen ein boolesches Argument übergeben werden könnte, versuche ich, es in Ihrem Fall stattdessen in zwei Methoden (oder mehr, falls erforderlich) aufzuteilen. man könnte extrahieren ReturnAllEmployeeIds, ReturnManagementIdsund ReturnRegularEmployeeIds. Dies deckt alle Grundlagen ab und ist für jeden, der es umsetzt, absolut selbsterklärend. Dies hat auch nicht die oben erwähnte "Skalierung" -Problematik.

Da gibt es immer nur zwei Ergebnisse für etwas, das ein boolesches Argument hat. Das Implementieren von zwei Methoden erfordert nur sehr wenig zusätzlichen Aufwand.

Weniger Code ist selten besser.


Mit diesem wird gesagt, es gibt einige Fälle , in denen ausdrücklich das Argument Lesbarkeit verbessert erklärt. Betrachten Sie zum Beispiel. GetLatestNews(max: 10). GetLatestNews(10)ist immer noch ziemlich selbsterklärend, die explizite Erklärung von maxwird helfen, alle aufzuklären Verwirrung.

Und wenn Sie unbedingt ein boolesches Argument haben müssen, kann die Verwendung nicht durch einfaches Lesen von trueoder abgeleitet werden false. Dann würde ich sagen:

var ids = ReturnEmployeeIds(includeManagement: true);

.. ist absolut besser und lesbarer als:

var ids = ReturnEmployeeIds(true);

Da im zweiten Beispiel das trueabsolut alles bedeuten könnte . Aber ich würde versuchen, dieses Argument zu vermeiden.

die maus
quelle