Fabrika gibi yöntemler nasıl adlandırılır?


146

Sanırım çoğu fabrika benzeri yöntem başlıyor create. Ama neden " yarat " olarak adlandırılıyor ? Neden " yapmak ", " üretmek ", " inşa etmek ", " üretmek " ya da başka bir şey? Bu sadece bir tat meselesi mi? Bir sözleşme mi? Yoksa "yarat" ın özel bir anlamı var mı?

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

Hangisini genel olarak seçersiniz ve neden?


4
Bir keresinde fabrika yöntemlerine "get ()" adını veren projede çalıştım. İlk başta çok kafa karıştırıcı.
Muxecoid

4
Ve son seçenek, önek yok mu? Fabrikaları neredeyse her zaman statik bir bağlamda kullandığımız için, net değil mi? Sadece biraz tartışmayı istemek - kişisel tercihim createXyz().
vikingsteve

@vikingsteve Oluşturduğum bir sistemde, createöneki API tutarlılığı uğruna bir kural olarak kullandım ve ayrıca mektubu yazmak, chepsinin IDE'nin otomatik tamamlamasında görünmesine neden olacağı için, neyin mevcut olduğunu öğrenmeye çalışan biri için. Ben parlak olabilirdi Matrix4f.identity(), Matrix4f.transpose()vb ama onlar bulmak için hızlı olacağını Matrix4f.createIdentity()ve Matrix4f.createTranspose(...)vb
code_dredd

Yanıtlar:


117

Bazı rastgele düşünceler:

  • 'Oluştur' bu özelliğe diğer kelimelerin çoğundan daha iyi uyar. Aklımın üstünde düşünebileceğim bir sonraki en iyi kelime 'Construct'. Geçmişte, 'Alloc' (ayırma) benzer durumlarda kullanılmış olabilir, bu da veri bloklarına C gibi dillerdeki nesnelere göre daha fazla vurgu yapılmasını yansıtırdı.

  • 'Oluştur' açık, sezgisel bir anlamı olan kısa ve basit bir kelimedir. Çoğu durumda insanlar muhtemelen bir şey yaratmak istediklerinde akla gelen ilk, en belirgin kelime olarak seçerler. Bu yaygın bir adlandırma kuralıdır ve "nesne oluşturma", nesne oluşturma sürecini tanımlamanın yaygın bir yoludur.

  • 'Construct' yakındır, ancak genellikle bir nesne yaratma sürecinde belirli bir aşamayı tanımlamak için kullanılır (tahsis / yeni, yapı, başlangıç ​​...)

  • 'Derleme' ve 'Yap', kod derleme ile ilgili süreçler için ortak terimlerdir, bu nedenle programcılara farklı çağrışımlar yapın, birçok adım ve muhtemelen çok fazla disk etkinliği içeren bir süreç anlamına gelir. Bununla birlikte, bir Fabrikanın bir şeyi "inşa etme" fikri mantıklı bir fikirdir - özellikle karmaşık bir veri yapısının inşa edildiği veya birçok ayrı bilgi parçasının bir şekilde birleştirildiği durumlarda.

  • Bana göre 'Oluştur', bir karma kod veya rastgele bir sayı üretmek gibi bir girdiden bir değer üretmek için kullanılan bir hesaplama anlamına gelir.

  • 'Üret', 'Oluştur', 'Yapı' yazmak / okumak 'Oluştur' dan daha uzundur. Tarihsel olarak programcılar yazmayı / okumayı azaltmak için kısa isimleri tercih etmişlerdir.


5
"Create" için başparmak yukarıya
pimbrouwers

103

"Etkili Java" daki Joshua Bloch aşağıdaki adlandırma kurallarını önerir

valueOf - Gevşek olarak, parametreleriyle aynı değere sahip bir örnek döndürür. Bu tür statik fabrikalar etkili bir şekilde tip dönüştürme yöntemleridir.

of - (Öğe 32) valueOftarafından popüler hale getirilen özlü bir alternatif EnumSet.

getInstance - Parametreler tarafından açıklanan ancak aynı değere sahip olduğu söylenemeyen bir örneği döndürür. Tekli bir durumda getInstancehiçbir parametre almaz ve tek örneği döndürür.

newInstance - Gibi getInstance, ancak newInstancedöndürülen her örneğin diğerlerinden farklı olduğunu garanti eder.

Type - Like olsungetInstance , ancak fabrika yöntemi farklı bir sınıftayken kullanılır. Tür , fabrika yöntemiyle döndürülen nesnenin türünü gösterir.

new Type - Like newInstance, ancak fabrika yöntemi farklı bir sınıftayken kullanılır. Tür , fabrika yöntemiyle döndürülen nesnenin türünü gösterir.


Nasıl değerlendirirsiniz from? Örneğin, varsayımsal bir Id.of("abc")vs Id.from("xyz")… almak ya da fromdaha mantıklı bir durum ortaya çıkarmayı önerir mi (yani girdinin ayrıştırılması, diğer verilerden / diğer verilerle arama / korelasyon,…)? "Of vs from"
kelimesini

22

Diğer cevaplarda görmediğim birkaç nokta eklemek istedim.

  1. Geleneksel olarak 'Fabrika', 'nesneler yaratır' anlamına gelse de, daha geniş bir şekilde 'bana beklediğim gibi davranan bir nesneyi döndürmesini' düşünmeyi seviyorum. Her zaman yepyeni bir nesne olup olmadığını bilmemeliyim , aslında umursamayabilirim. Dolayısıyla, uygun durumlarda, şu anda böyle uygulasanız bile, bir 'Oluştur ...' adından kaçınabilirsiniz.

  2. Guava, fabrika adlandırma fikirlerinin iyi bir deposudur. Güzel bir DSL stilini popülerleştiriyor. örnekler:

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

1
Haklısın, Guava okunabilir bir koda sahip harika bir kütüphane.
deamon

11

"Yarat" ve "yap" kısa, makul derecede uyarıcı ve isimlendirmede aklıma gelen diğer kalıplara bağlı değil. Ben de oldukça sık gördüm ve "fiili standartlar" olabilir şüpheli. Birini seçer ve en azından bir proje içinde tutarlı olarak kullanırdım. (Şu anki projeme baktığımda "yapmak" gibi görünüyor. Umarım tutarlıyım ...)

“Build” dan kaçının çünkü Builder modeline daha iyi uyar ve Producer / Tüketici'yi çağrıştırdığı için “üretmek” ten kaçının.

Desen için "Fabrika" adının metaforuna gerçekten devam etmek için, "üretim" tarafından cazip olurdu, ama bu çok uzun bir kelime.


3

Bence “ bir nesne yaratmaktan ” kaynaklanıyor . Bununla birlikte, İngilizce'de “yarat” kelimesi “doğal olarak evrimleşmeyecek veya sıradan süreçlerle yapılmayan benzersiz bir şey olarak ortaya çıkmasına neden olma” ve “kişinin kendi düşüncesinden evrimleşmesi veya bir sanat eseri ya da icat olarak hayal gücü. ” Yani "yarat" kelimesi kullanılacak doğru sözcük değil gibi görünüyor . “Yap,” öte yandan, “malzemeyi şekillendirerek veya değiştirerek, parçaları birleştirerek vb. Örneğin, yok yaratmak bir elbise, siz olun bir elbise (nesne). Bence “üretmek” anlamında “yapmak”; var olma ya da olma; getirmek ”fabrika yöntemleri için çok daha iyi bir kelimedir.


3

Yeni severim. Bana göre

var foo = newFoo();

daha iyi okur

var foo = createFoo();

İngilizce'ye çevrildiğimiz foo yeni bir foo veya foo foo oluşturuyor. Gramer uzmanı olmasam da, dilbilgisinin yanlış olduğundan eminim.


İkisi de çalışıyor. createFoobir işlevdir. dediğin gibi foodeğil createFoo. foosonucudur createFoo().
Krzysztof Czelusniak

2

Kısmen konvansiyon, kısmen semantik.

Fabrika yöntemleri (geleneksel tarafından işaret edilen create) uygun kurucuları çağırmalıdır. Ben görseydim buildURI, onu yerlerinden montaj bazı hesaplama dahil, ya farz ediyorum (ve ilgili bir fabrika olduğunu düşünüyorum olmaz). Gördüğümde düşündüğüm ilk şey, generateURIyeni bir kişiselleştirilmiş indirme bağlantısı gibi rastgele bir şey yapmak. Hepsi aynı değil, farklı kelimeler farklı anlamlar uyandırıyor; ama çoğu geleneksel değil.


1

Onu ararım UriFactory.Create()

Nerede,

UriFactory, Uriörnekler oluşturan yöntem (ler) sağlayan sınıf türünün adıdır .

ve Create()yöntem özelliklerinizdeki varyasyonlar için aşırı yüklenir.

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

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

1
İsminizi kabul ederken, Pascal kasalı yöntem adlarını kullanma sözleşmenize kesinlikle katılmıyorum.
Chatatata

2
@Leviathlon her zaman programlama diline ve dahili kurallara bağlıdır. Pascal Case, C # gibi diller için tamamen iyi.
momo

@momo Tam olarak, konuşulan dilin Java olduğu varsayımına sahip olduğumu düşünüyorum.
Chatatata

0

Tüm fiilleri gördüğümü, ancak bazı kütüphanelerde veya diğer kütüphanelerde kullandığımı belirtmiştim, bu yüzden create'i evrensel bir kongre olarak adlandırmam.

Şimdi, yaratma bana daha iyi geliyor, eylemin kesin anlamını çağrıştırıyor.

Yani evet, bu (edebi) bir zevk meselesidir.


0

Şahsen seviyorum instantiateve instantiateWithbu sadece Birlik ve Objektif C deneyimlerimden kaynaklanıyor. Unity motorundaki adlandırma kuralları instantiate, fabrika yöntemi aracılığıyla bir örnek oluşturmak için kelimenin etrafında dönüyor gibi görünüyor ve Amaç C with, parametrelerin / parametrelerin ne olduğunu belirtmek istiyor gibi görünüyor . Bu, ancak yöntem yine de somutlaştırılacak sınıftaysa (ve yapıcı aşırı yüklemesine izin veren dillerde, bu çok fazla bir 'şey' değildir) iyi çalışır.

Sadece düz eski Objektif initWithC'ler de bir good'un!


-3

Fabrika yöntemi, yöntem adını gerektirmez. Tümünün nesneyi aynı aileden döndürmesi koşuluyla, fabrikanızda istediğiniz kadar yöntem kullanabilirsiniz.

Daha fazla ayrıntı için http://xeon2k.wordpress.com URL'sini ziyaret edin


4
bağlantı bir anlam ifade etmiyor, daha spesifik olmalı.
brunsgaard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.