Zawsze mam problem z ustaleniem, czy powinienem nazwać określoną metodę zaczynającą się od getSomething
kontra findSomething
.
Problem polega na tworzeniu pomocników dla źle zaprojektowanych interfejsów API. Dzieje się tak zwykle podczas pobierania danych z obiektu, który wymaga obiektu jako parametru. Oto prosty przykład:
public String getRevision(Item item) {
service.load(item, "revision");
// there is usually more work to do before getting the data..
try {
return item.get_revision();
}
catch(NotLoadedException exception) {
log.error("Property named 'property_name' was not loaded", exception);
}
return null;
}
Jak i dlaczego decydować między nazwaniem tej metody jako getRevision()
lub findRevision()
?
Odpowiedzi:
Używam,
Get
gdy wiem, że czas pobierania będzie bardzo krótki (jak w przypadku wyszukiwania z tabeli skrótów lub btree).Find
implikuje proces wyszukiwania lub algorytm obliczeniowy, którego wykonanie wymaga „dłuższego” okresu (dla pewnej dłuższej wartości).źródło
find
później zastąpił algorytm tabeli skrótów?get
ifind
miałyby zastosowanie w zależności od tego, jak jest używany.Powiedziałbym, że to
find
może zawieść, aleget
nie powinno.źródło
find
może zwrócić NULL, aget
nigdy nie zwróci NULL, ale może rzucić (lub potwierdzić), zgadzam się.find()
zwrotyOptional<>
? W takim przypadkufind
jest równieżnull
bezpieczny.Cytując rozmowę, którą często prowadzę z moimi dziećmi:
Ten sam pomysł dotyczy:
użyj „get” dla metody, która zwraca tanio dostępną informację (i prawdopodobnie może być wstawiona lub w inny sposób zoptymalizowana), lub dla informacji posiadanej wyłącznie przez ten obiekt.
użyj „find” dla metody, która działa, aby uzyskać kawałek informacji lub używa innych obiektów, aby go znaleźć.
źródło
Znajdź oznacza brak wyniku, na przykład podczas wykonywania zapytania do bazy danych z niektórymi parametrami, które mogą się zmieniać między wywołaniami. Z drugiej strony, uzyskanie sugeruje, że wyniki są znane metodzie wcześniej lub nie zmienią się, gdy zostaną poznane, że nie ma parametrów wywołania.
Więc użyłbym na przykład Customer findCustomerById (długi customerId) i Customer getCustomer ()
źródło
Stosuję następujący wzór:
Foo GetFoo()
nie może zwrócić wartości null, a jego złożoność wynosi O (log (n)) lub mniejbool TryGetFoo(out Foo)
może zwrócić null, a jego złożoność wynosi O (log (n)) lub mniejFoo FindFoo()
nie może zwrócić null, a jego złożoność jest większa niż O (log (n))bool TryFindFoo(out Foo)
może zwrócić null, a jego złożoność jest większa niż O (log (n))W ten sposób kod jest dość jasny pod względem intencji i złożoności, jakiej można się spodziewać.
Zazwyczaj Gettery są przeznaczone do bezpośredniego dostępu do listy lub słownika / zestawu.
Findery to dokładne wyszukiwanie, pełne skanowanie listy itp.
W Twoim przypadku:
źródło
try
, krótki i precyzyjnyget
jest odpowiednie w każdym przypadku _ w rzeczywistości często zakłada się, że aby coś uzyskać, musisz to najpierw znaleźć. Więc jeśli nie jesteś pewien, użyjget
.Użyłbym
find
do metod takich jakfindMinimum()
lubfindOptimal()
, tj. Tam, gdzie istnieje jakiś specjalny algorytm, który oblicza wartość zwracaną, a nie po prostu wysyła do DB, systemu plików, zdalnego serwera itp. Żądanie otrzymania danych.źródło
find
jako prefiksu w podanych przez ciebie przykładach. Do zadań obliczeniowych, takich jak te w twoim przykładzie, użyłbymcalculate
lubcompute
.Nie używaj znajdź ani nie otrzymuj prefiksów. Jest to naruszenie zasady UniformAccessPrinciple wymyślonej przez Bertranda Meyera . Dlaczego nie stworzyć metody takiej jak poniżej:
źródło
Zasadniczo będę używać
Get
do pobierania obiektu / wartości iFind
do wyszukiwania jego położenia (na przykład w tablicy).na przykład:
źródło
Dla mnie
find
oznacza to, że może być obecny więcej niż jeden wynik.get
implikuje tylko jeden.źródło
getCat
vsfindCat
vsgetCats
vsfindCats
.find..
Nadal reprezentuje zwracane pojedyncze obiekty. Liczba mnoga powinna być dodana do rzeczownika, moim zdaniem.