Nazewnictwo metod bool: Czy vs. Czy vs.

51

Jaka jest lepsza nazwa metody zwracającej wartość logiczną?

IsSupportContentType

lub

CanSupportContentType
Mediator
źródło
9
Ponieważ chodzi o to, aby nazwa wyraźnie przekazywała stan lub zachowanie, a ty nigdy nie powiedziałbyś „ta klasa obsługuje typ zawartości X”, lepszą nazwą jest CanSupportContentType. Powiedziałbyś coś w stylu „ta klasa może obsługiwać zawartość typu X”.
Craig,
8
Nie jest native speakerem, ale czy SupportContentType nie byłby najbardziej „gramatyczną” opcją?
Roman Reiner,
8
Po pierwsze musiałaby IsSupportedContentTypebyć poprawna gramatycznie. (chyba że „typ zawartości wsparcia” działa jak rzeczownik, co wydaje się mało prawdopodobne)
CodesInChaos
30
A może po prostu supportsContentType? Poniżej zamieszczona jest całkowicie czytelny: if (abc.supportsContentType("text/html")). „może obsługiwać” oznacza, że ​​istnieją dodatkowe warunki do obsługi typu zawartości.
Olivier Grégoire,
10
@WeylandYutani IsCanHasSupportCheezburger?
RM

Odpowiedzi:

106

Czy vs.

Zgodnie z zaleceniami konwencji nazewnictwa Microsoft zarówno „Is”, jak i „Can” są OK (podobnie jak „Has”) jako przedrostek logiczny.

W prostym języku angielskim, „Is” byłoby użyte do zidentyfikowania czegoś na temat samego typu, a nie tego, co może zrobić. Na przykład IsFixed, IsDerivedFrom, IsNullablemożna je znaleźć w CLR typów i metod. We wszystkich tych przypadkach po „Is” następuje przymiotnik .

Tymczasem, „może” bardziej wyraźnie wskazuje na możliwość, na przykład CanEdit, CanRead, CanSeek. W każdym z tych przypadków po może występować czasownik .

Ponieważ „Wsparcie” jest czasownikiem, myślę, że w twoim przypadku CanSupportContentTypejest to lepsze.

Krótsza alternatywa

Z drugiej strony konwencje mówią, że przedrostek jest opcjonalny. Co więcej, umieszczenie typu argumentu w nazwie metody jest trochę tandetne, ponieważ programista może zobaczyć typ argumentu w inteligencji. Więc mógł tylko wymienić metodę Supportsi zdefiniować ją tak:

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

... który jest krótszy i nadal jasno określa cel. Nazwałbyś to tak:

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

A może jako kompromis najlepiej:

public bool CanSupport(System.Net.Mime.ContentType contentType)
John Wu
źródło
53
To miłe, gdy dobrze czyta:if ( someClass.Supports(contentType) )
candied_orange
5
… LubhasSupportedContentType
Bergi,
8
Metoda o nazwie „CanSupports” początkowo sprawia, że ​​zastanawiam się, kto spędził czas, aby oprogramowanie mogło obsługiwać puszki (jak w puszkach). Po prostu „Wsparcie” jest lepszą opcją, bez wątpienia!
T. Sar - Przywróć Monikę
6
Czasami programiści nie potrafią stwierdzić, kiedy coś „brzmi dziwnie”, np. Jeśli angielski nie jest ich pierwszym językiem.
John Wu,
4
Czasami krótsza wersja jest gorsza. Np. W bibliotece C ++ Standard mamy std::vector::empty(). Czy z samej nazwy opróżnia wektor? A może zwraca, czy wektor jest pusty? Właściwie to drugie, ponieważ pierwsze zadanie wykonuje std::vector::clear(). Ale ogólnie musisz przeczytać dokumenty, aby się upewnić. Jako przeciwny przykład, Qt QVectorjest łatwiejsze do zrozumienia w tym względzie, ponieważ jest to metoda sprawdzania pustki QVector::isEmpty().
Ruslan
9

Warto wspomnieć, że można również użyć prefiksu „ powinien ”. Zgodnie z wytycznymi Apple , nie tylko „ można ” i „ należy ”, czasowniki modalne w ogóle mogą być używane do nazwania funkcji zwracających wartość logiczną. Nie widzę wielu zastosowań „ woli ”, ale „ powinien ” jest miły dla haczyków pytających o porady, jak widać w reakjs:

shouldComponentUpdate: (newProps: any) => boolean
Złupić
źródło
19
powinno to imho dość kiepskie nazewnictwo, „no cóż, powinien zamknąć dokument, ale tak naprawdę nie jestem całkiem pewien”
Lovis
1
@lovis: Myślę, że komentarz Harry'ego jest bardzo ważny. Na przykład, mógłbym delegować niektóre działania związane z bazą danych poprzez warstwę wtyczki, każda wtyczka ma metodę „ShouldCloseConnection”, która informuje środowisko, że należy wykonać pewne czyszczenie. To tylko przykład, ale „powinien” jest zdecydowanie poprawnym przedrostkiem.
greg
1
@greg Jak to jest mniej dwuznaczne niż WillCloseConnection?
Podstawowy
@Lovis Zasadniczo używamy, is...ale używamy should...w niektórych nazwach argumentów funkcji miejsc, w których wartość logiczna wskazuje, na co funkcja ma zmienić rzeczy . Jeśli funkcja może opcjonalnie zamknąć dokument, wywołanie parametru control, który isClosedbyłby dokładny (nie jest jeszcze zamknięty ), a więc użylibyśmy shouldClosedo wskazania, że ​​właśnie to funkcja ma zrobić. (Przykład arbitralny; prawdopodobnie nie mielibyśmy takiej funkcji, zwłaszcza że zamknięcie dokumentu powinno być wystarczająco ciężkie, aby mieć dedykowane połączenie).
KRyan
@Basic Przynajmniej w naszym przypadku will...jest zarezerwowany dla funkcji asynchronicznych, które zwracają obietnicę; jeśli funkcja opisana w moim poprzednim komentarzu jest synchroniczna, użycie will...byłoby niezgodne z naszym nazewnictwem.
KRyan,