Jak nazwać metody podobne do fabryk?


146

Myślę, że większość metod fabrycznych zaczyna się od create. Ale dlaczego nazywa się je „ tworzyć ”? Dlaczego nie „ tworzyć ”, „ produkować ”, „ budować ”, „ generować ” lub czegoś innego? Czy to tylko kwestia gustu? Konwencja? A może ma specjalne znaczenie w „tworzeniu”?

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

Który z nich wybrałbyś ogólnie i dlaczego?


4
Kiedyś pracowałem nad projektem, który nazywa metody fabryczne „get ()”. Na początku bardzo zagmatwane.
Muxecoid

4
A ostatnia opcja, co powiesz na brak przedrostka? Skoro prawie zawsze używamy fabryk w kontekście statycznym, czy nie powinno to być jasne? Po prostu proszę o wywołanie dyskusji - moje osobiste preferencje są takie createXyz().
vikingsteve

@vikingsteve W systemie, który zbudowałem, użyłem createprefiksu jako konwencji ze względu na spójność API, a także dlatego, że samo wpisanie litery cspowodowałoby, że wszystkie z nich pojawiłyby się w autouzupełnianiu IDE, co ułatwiłoby to dla kogoś, kto próbuje dowiedzieć się, co jest dostępne. Mógłbym miałem Matrix4f.identity(), Matrix4f.transpose()itp ale byliby szybciej znaleźć jak Matrix4f.createIdentity()i Matrix4f.createTranspose(...)itp
code_dredd

Odpowiedzi:


117

Kilka przypadkowych myśli:

  • „Utwórz” lepiej pasuje do tej funkcji niż większość innych słów. Kolejnym najlepszym słowem, które przychodzi mi do głowy, jest „Konstruuj”. W przeszłości „Alloc” (przydziel) mogło być używane w podobnych sytuacjach, odzwierciedlając większy nacisk na bloki danych niż obiekty w językach takich jak C.

  • „Utwórz” to krótkie, proste słowo o jasnym, intuicyjnym znaczeniu. W większości przypadków ludzie prawdopodobnie wybierają to jako pierwsze, najbardziej oczywiste słowo, które przychodzi im na myśl, gdy chcą coś stworzyć. To powszechna konwencja nazewnictwa, a „tworzenie obiektów” to powszechny sposób opisywania procesu ... tworzenia obiektów.

  • `` Konstrukcja '' jest bliska, ale zwykle służy do opisania konkretnego etapu w procesie tworzenia obiektu (przydziel / nowy, skonstruuj, zainicjalizuj ...)

  • „Build” i „Make” to terminy wspólne dla procesów związanych z kompilacją kodu, dlatego mają różne konotacje dla programistów, co oznacza proces składający się z wielu kroków i prawdopodobnie dużej aktywności dyskowej. Jednak idea „budowania” czegoś przez Fabrykę jest rozsądnym pomysłem - szczególnie w przypadkach, gdy budowana jest złożona struktura danych lub wiele oddzielnych informacji jest w jakiś sposób łączonych.

  • „Generuj” oznacza dla mnie obliczenia, które są używane do tworzenia wartości z danych wejściowych, na przykład generowanie kodu skrótu lub liczby losowej.

  • „Produkuj”, „Generuj”, „Konstruuj” są dłuższe do wpisania / odczytu niż „Utwórz”. W przeszłości programiści preferowali krótkie nazwy, aby ograniczyć pisanie / czytanie.


5
kciuki w górę za „Utwórz”
pimbrouwers,

103

Joshua Bloch w „Effective Java” sugeruje następujące konwencje nazewnictwa

valueOf - zwraca instancję, która ma, luźno mówiąc, tę samą wartość, co jej parametry. Takie fabryki statyczne są efektywnymi metodami konwersji typów.

of - Zwięzła alternatywa dla valueOf, spopularyzowana przez EnumSet(pozycja 32).

getInstance - zwraca wystąpienie, które jest opisane przez parametry, ale nie można powiedzieć, że ma tę samą wartość. W przypadku singletona getInstancenie przyjmuje parametrów i zwraca jedyne wystąpienie.

newInstance - Like getInstance, z tą różnicą, że newInstancegwarantuje, że każde zwrócone wystąpienie różni się od wszystkich innych.

get Type - Like getInstance, ale używane, gdy metoda fabryki należy do innej klasy. Typ wskazuje typ obiektu zwracanego przez metodę fabryki.

nowy Typ - podobny do newInstance, ale używany, gdy metoda fabryki znajduje się w innej klasie. Typ wskazuje typ obiektu zwracanego przez metodę fabryki.


Jak byś ocenił from? Np. Przyjmowanie hipotetycznego Id.of("abc")kontra Id.from("xyz")… lub fromsugerowałoby więcej logiki (tj. Analizowanie danych wejściowych, wyszukiwanie / korelacja z / z innymi danymi…)? Naprawdę trudno jest wyszukać "of vs from": D
knittl

22

Chciałem dodać kilka punktów, których nie widzę w innych odpowiedziach.

  1. Chociaż tradycyjnie „Fabryka” oznacza „tworzy przedmioty”, wolę myśleć o tym szerzej jako „zwraca mi obiekt, który zachowuje się tak, jak się spodziewam”. Nie powinienem zawsze wiedzieć, czy to zupełnie nowy przedmiot , w rzeczywistości może mnie to nie obchodzić. Dlatego w odpowiednich przypadkach możesz uniknąć nazwy „Utwórz ...”, nawet jeśli właśnie tak ją implementujesz.

  2. Guawa to dobre repozytorium pomysłów na nazwy fabryk. Popularyzuje ładny styl DSL. przykłady:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    

1
Masz rację, Guava to wspaniała biblioteka z bardzo czytelnym kodem.
demon

11

„Tworzenie” i „tworzenie” są krótkie, dość sugestywne i nie są powiązane z innymi wzorcami w nazewnictwie, które przychodzą mi do głowy. Widziałem też oba dość często i podejrzewam, że mogą to być „de facto standardy”. Wybrałbym jeden i używałbym go konsekwentnie przynajmniej w ramach projektu. (Patrząc na mój obecny projekt, wydaje mi się, że używam słowa „make”. Mam nadzieję, że jestem konsekwentny ...)

Unikaj „budowania”, ponieważ lepiej pasuje do wzorca Konstruktora i unikaj „produkcji”, ponieważ przywołuje to producenta / konsumenta.

Aby naprawdę kontynuować metaforę nazwy „Fabryka” dla wzoru, kusiłabym się „manufakturą”, ale to za długie słowo.


3

Myślę, że wynika to z „ tworzenia przedmiotu”. Jednak w języku angielskim słowo „stworzyć” jest powiązane z pojęciem „spowodować powstanie, jako coś wyjątkowego, co nie wyewoluowałoby w naturalny sposób lub nie zostało wytworzone w wyniku zwykłych procesów” oraz „ewoluować z własnej myśli lub wyobraźnia, jako dzieło sztuki lub wynalazek ”. Wygląda więc na to, że „tworzyć” nie jest właściwym słowem. Z drugiej strony „tworzyć” oznacza „powstawać poprzez kształtowanie lub zmianę materiału, łączenie części itp.” Na przykład, nie stworzyć sukienkę, to zrobić sukienkę (Object). Tak więc, moim zdaniem, „robić” w znaczeniu „produkować; przyczyna zaistnienia lub zdarzenia; doprowadzić ”to o wiele lepsze określenie metod fabrycznych.


3

Lubię nowe. Dla mnie

var foo = newFoo();

czyta lepiej niż

var foo = createFoo();

Przetłumaczone na angielski mamy foo to nowe foo lub foo to utworzone foo. Chociaż nie jestem ekspertem od gramatyki, jestem prawie pewien, że ta ostatnia jest niepoprawna gramatycznie.


Oboje pracują. createFoojest funkcją. foonie jest createFoo, jak mówisz. foojest wynikiem createFoo().
Krzysztof Czelusniak

2

Po części konwencja, po części semantyka.

Metody fabryczne (sygnalizowane tradycyjnymi create) powinny wywoływać odpowiednie konstruktory. Gdybym zobaczył buildURI, założyłbym, że wymagało to jakichś obliczeń lub montażu z części (i nie sądziłbym, że była w to zaangażowana fabryka). Pierwszą rzeczą, o której pomyślałem, kiedy zobaczyłem, generateURIbyło zrobienie czegoś przypadkowego, na przykład nowego spersonalizowanego linku do pobrania. Nie wszystkie są takie same, różne słowa wywołują różne znaczenia; ale większość z nich nie jest konwencjonalna.


1

Nazwałbym to UriFactory.Create()

Gdzie,

UriFactoryto nazwa typu klasy, który udostępnia metody do tworzenia Uriinstancji.

a Create()metoda jest przeciążona dla tylu wariantów, które masz w specyfikacjach.

public static class UriFactory
{
    //Default Creator
    public static UriType Create() 
    {
    }

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}

1
Chociaż zgadzam się z twoim nazewnictwem, zdecydowanie nie zgadzam się z twoją konwencją używania nazw metod z literami Pascal.
Chatatata

2
@Leviathlon zawsze zależy od języka programowania i wewnętrznych konwencji. Pascal Case jest całkowicie w porządku dla języków, takich jak C #.
momo

@momo Dokładnie, myślę, że przyjąłem założenie, że język, o którym mowa, to Java.
Chatatata

0

Zwracam uwagę, że widziałem wszystkie czasowniki, ale produkuję je w jakiejś bibliotece lub innej, więc nie nazwałbym tworzenia jako konwencją uniwersalną.

Teraz kreacja brzmi dla mnie lepiej, przywołuje precyzyjny sens akcji.

Więc tak, to kwestia gustu (literackiego).


0

Osobiście lubię instantiatei instantiateWith, ale to tylko z powodu moich doświadczeń z Jednością i Obiektywem C. Konwencje nazewnictwa w silniku Unity wydają się obracać wokół słowa, instantiateaby utworzyć instancję za pomocą metody fabrycznej, a Cel C wydaje się lubić withwskazywać, jakie są parametry. Działa to naprawdę dobrze tylko wtedy, gdy metoda znajduje się w klasie, która ma zostać utworzona (aw językach, które pozwalają na przeciążanie konstruktorów, nie jest to taka „rzecz”).

Zwykłe, stare obiekty Objective C initWithto także niezła broń!


-3

Metoda fabryczna nie narzuca nazwy metody. Możesz mieć dowolną liczbę metod w swojej fabryce, pod warunkiem, że wszystkie zwracają obiekt z tej samej rodziny.

Aby uzyskać więcej informacji, odwiedź adres URL http://xeon2k.wordpress.com


4
link nie ma sensu, powinien być bardziej szczegółowy.
brunsgaard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.