Benennung von Bool-Methoden: Ist vs. Kann vs.

51

Welcher ist der bessere Name für eine Methode, die einen Booleschen Wert zurückgibt?

IsSupportContentType

oder

CanSupportContentType
Vermittler
quelle
9
Da der Name den Status oder das Verhalten klar wiedergeben soll und Sie niemals sagen würden, dass diese Klasse den Inhaltstyp X unterstützt, lautet der bessere Name CanSupportContentType. Sie würden so etwas wie "Diese Klasse kann Inhaltstyp X unterstützen."
Craig
8
Kein Muttersprachler würde aber nicht funktioniert SupportContentType die meisten „grammatische“ Option?
Roman Reiner
8
Zunächst müsste IsSupportedContentTypeman grammatikalisch korrekt sein. (es sei denn, "support content type" fungiert als Nomen, was unwahrscheinlich erscheint.)
CodesInChaos
30
Was ist mit einfach supportsContentType? Im Folgenden ist vollständig lesbar: if (abc.supportsContentType("text/html")). "can support" impliziert, dass es weitere Bedingungen gibt, um den Inhaltstyp zu unterstützen.
Olivier Grégoire
10
@WeylandYutani IsCanHasSupportCheezburger?
RM

Antworten:

106

Ist gegen Can

Gemäß den Empfehlungen der Microsoft-Namenskonvention sind sowohl "Is" als auch "Can" OK (und ebenso "Has") als Präfix für einen Booleschen Wert.

Im Klartext würde "Is" verwendet, um etwas über den Typ selbst zu identifizieren, nicht was er kann. Zum Beispiel IsFixed, IsDerivedFrom, IsNullablekann alle in CLR - Typen und Methoden gefunden werden. In all diesen Fällen folgt auf "Is" ein Adjektiv .

Inzwischen „kann“ deutlicher zeigt eine Fähigkeit, zum Beispiel CanEdit, CanRead, CanSeek. In jedem dieser Fälle folgt auf can ein Verb .

Da "Support" ein Verb ist, finde ich in deinem Fall CanSupportContentTypebesser.

Kürzere Alternative

Andererseits besagen die Konventionen, dass das Präfix optional ist. Außerdem ist es etwas kitschig, den Argumenttyp in den Methodennamen aufzunehmen, da ein Entwickler den Typ des Arguments in Intellisense sehen kann. Sie können Ihre Methode also einfach so benennen Supportsund definieren:

public bool Supports(System.Net.Mime.ContentType contentType)

... der kürzer ist und trotzdem klar den Zweck kommuniziert. Sie würden es so nennen:

ContentType contentType = new ContentType("text/plain");
var someClass = new MediatorsClass();
bool ok = someClass.Supports(contentType);

Oder als Kompromiss vielleicht das Beste:

public bool CanSupport(System.Net.Mime.ContentType contentType)
John Wu
quelle
53
Es ist schön, wenn es gut liest:if ( someClass.Supports(contentType) )
candied_orange
5
… OderhasSupportedContentType
Bergi
8
Eine Methode namens "CanSupports" lässt mich zunächst fragen, wer Zeit damit verbracht hat, die Software in die Lage zu versetzen, Dosen zu unterstützen (wie bei Blechdosen). Nur "Unterstützt" ist zweifellos die bessere Option!
T. Sar - Wiedereinsetzung von Monica
6
Manchmal können Entwickler nicht sagen, wann etwas "seltsam" klingt, z. B. wenn Englisch nicht ihre Muttersprache ist.
John Wu
4
Manchmal ist eine kürzere Version schlechter. ZB in der C ++ Standard Bibliothek, die wir haben std::vector::empty(). Leert es den Vektor nur anhand seines Namens? Oder gibt es zurück, ob der Vektor leer ist? Eigentlich das letztere, da die erstere Aufgabe von erledigt wird std::vector::clear(). Aber Sie müssen im Allgemeinen die Dokumentation lesen, um sicherzugehen. Als entgegengesetztes Beispiel ist Qt QVectorin dieser Hinsicht leichter zu verstehen, da es sich um eine Methode zur Überprüfung der Leere handelt QVector::isEmpty().
Ruslan
9

Erwähnenswert ist, dass auch das Präfix " sollte " verwendet werden kann. Nach der Apple-Richtlinie können Modalverben nicht nur " können " und " sollten " verwendet werden, um Funktionen zu benennen, die boolesche Werte zurückgeben. Ich kann nicht sehen , wie oft " will " verwendet wird, aber " should " ist gut geeignet, um nach Ratschlägen zu fragen.

shouldComponentUpdate: (newProps: any) => boolean
Harry
quelle
19
sollte ist imho ziemlich schlecht benannt, "Nun, es sollte das Dokument schließen, aber ich bin eigentlich nicht ganz sicher"
Lovis
1
@lovis: Ich denke, Harrys Kommentar ist sehr gültig. Beispielsweise könnte ich einige datenbankbezogene Aktionen über eine Plugin-Ebene delegieren. Jedes Plugin verfügt über eine "ShouldCloseConnection" -Methode, die das Framework darüber informiert, dass eine Bereinigung durchgeführt werden sollte. Nur ein Beispiel, aber "sollte" ist definitiv ein gültiges Präfix.
Greg
1
@greg Wie ist das weniger zweideutig als WillCloseConnection?
Basic
@ Lovis Wir verwenden im Allgemeinen, is...aber verwenden should...in einigen Funktionsargumentnamen Stellen, an denen der Boolesche Wert angibt, in was die Funktion die Dinge ändern soll . Wenn eine Funktion kann optional ein Dokument schließen, um den Parameter Controlling aufrufen , die isClosedgenau sein würde (es ist nicht geschlossen noch ) und so würden wir verwenden , shouldCloseum anzuzeigen , dass das ist , was die Funktion tun soll. (Beliebiges Beispiel; wir hätten wahrscheinlich keine Funktion wie diese, zumal das Schließen eines Dokuments schwer genug sein sollte, um einen dedizierten Anruf zu erhalten.)
KRyan,
@Basic Zumindest in unserem Fall will...ist es für asynchrone Funktionen reserviert, die ein Versprechen zurückgeben. Wenn die in meinem vorherigen Kommentar beschriebene Funktion synchron ist, ist die Verwendung von will...nicht mit unserer Benennung vereinbar.
KRyan