Bagaimana memberi nama pabrik seperti metode?

146

Saya kira sebagian besar metode seperti pabrik dimulai dengan create. Tapi mengapa mereka disebut " buat "? Mengapa tidak " membuat ", " menghasilkan ", " membangun ", " menghasilkan " atau yang lainnya? Apakah ini hanya masalah selera? Sebuah konvensi? Atau adakah arti khusus dalam "menciptakan"?

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

Yang mana yang akan Anda pilih secara umum dan mengapa?

deamon
sumber
4
Saya pernah bekerja pada proyek yang menamai metode pabrik "get ()". Sangat membingungkan pada awalnya.
Muxecoid
4
Dan opsi terakhir, bagaimana kalau tidak ada awalan? Karena kita hampir selalu menggunakan pabrik dari konteks statis, bukankah harus jelas? Hanya meminta untuk memacu diskusi - preferensi pribadi saya adalah createXyz().
vikingsteve
@ vikingsteve Dalam sistem yang saya bangun, saya menggunakan createawalan sebagai masalah konvensi demi konsistensi API dan juga karena hanya mengetikkan huruf cakan menyebabkan semuanya muncul di lengkapi-otomatis IDE, yang akan membuatnya lebih mudah untuk seseorang yang mencoba mempelajari apa yang tersedia. Aku bisa punya Matrix4f.identity(), Matrix4f.transpose(), dll tapi mereka akan lebih cepat untuk menemukan Matrix4f.createIdentity()dan Matrix4f.createTranspose(...), dll
code_dredd

Jawaban:

117

Beberapa pemikiran acak:

  • 'Buat' lebih cocok dengan fitur daripada kebanyakan kata lain. Kata terbaik berikutnya yang dapat saya pikirkan dari atas kepala saya adalah 'Bangun'. Di masa lalu, 'Alloc' (mengalokasikan) mungkin telah digunakan dalam situasi yang sama, mencerminkan penekanan yang lebih besar pada blok data daripada objek dalam bahasa seperti C.

  • 'Buat' adalah kata pendek dan sederhana yang memiliki makna intuitif yang jelas. Dalam kebanyakan kasus orang mungkin hanya memilihnya sebagai kata pertama, paling jelas yang muncul dalam pikiran ketika mereka ingin membuat sesuatu. Ini adalah konvensi penamaan yang umum, dan "penciptaan objek" adalah cara umum menggambarkan proses ... membuat objek.

  • 'Membangun' dekat, tetapi biasanya digunakan untuk menggambarkan tahap tertentu dalam proses membuat objek (mengalokasikan / baru, membangun, menginisialisasi ...)

  • 'Build' dan 'Make' adalah istilah umum untuk proses yang berkaitan dengan mengkompilasi kode, sehingga memiliki konotasi yang berbeda dengan programmer, menyiratkan proses yang terdiri dari banyak langkah dan mungkin banyak aktivitas disk. Namun, gagasan tentang sesuatu yang "membangun" Pabrik adalah ide yang masuk akal - terutama dalam kasus-kasus di mana struktur data yang kompleks dibangun, atau banyak informasi terpisah digabungkan dalam beberapa cara.

  • 'Buat' kepada saya menyiratkan perhitungan yang digunakan untuk menghasilkan nilai dari input, seperti menghasilkan kode hash atau angka acak.

  • 'Produce', 'Generate', 'Construct' lebih panjang untuk mengetik / membaca daripada 'Buat'. Secara historis programmer telah memilih nama pendek untuk mengurangi mengetik / membaca.

Jason Williams
sumber
5
jempol untuk "Buat"
pimbrouwers
103

Joshua Bloch dalam "Java Efektif" menyarankan konvensi penamaan berikut

valueOf - Mengembalikan instance yang secara longgar memiliki nilai yang sama dengan parameternya. Pabrik statis semacam itu adalah metode konversi tipe yang efektif.

of - Sebuah alternatif ringkas untuk valueOf, dipopulerkan oleh EnumSet(Butir 32).

getInstance - Mengembalikan instance yang dijelaskan oleh parameter tetapi tidak dapat dikatakan memiliki nilai yang sama. Dalam kasus singleton, getInstancetidak mengambil parameter dan mengembalikan instance tunggal.

newInstance - Like getInstance, kecuali itu newInstancemenjamin bahwa setiap instance yang dikembalikan berbeda dari yang lainnya.

dapatkan Type - Like getInstance, tetapi digunakan ketika metode pabrik di kelas yang berbeda. Jenis menunjukkan jenis objek yang dikembalikan oleh metode pabrik.

Type baru - Suka newInstance, tetapi digunakan ketika metode pabrik di kelas yang berbeda. Jenis menunjukkan jenis objek yang dikembalikan oleh metode pabrik.

Jofsey
sumber
Bagaimana penilaian Anda from? Misal mengambil hipotesis Id.of("abc")vsId.from("xyz") ... atau akan frommenyarankan lebih banyak logika terjadi (mis. Penguraian input, pencarian / korelasi dari / dengan data lain, ...)? Sangat sulit untuk mencari "dari vs dari": D
knittl
22

Ingin menambahkan beberapa poin yang tidak saya lihat di jawaban lain.

  1. Meskipun secara tradisional 'Pabrik' berarti 'menciptakan objek', saya suka memikirkannya secara lebih luas sebagai 'mengembalikan saya sebuah objek yang berperilaku seperti yang saya harapkan'. Saya seharusnya tidak selalu harus tahu apakah itu benda yang benar-benar baru , bahkan saya mungkin tidak peduli. Jadi, dalam kasus yang sesuai Anda mungkin menghindari nama 'Buat ...', bahkan jika itu yang Anda terapkan sekarang.

  2. Guava adalah gudang ide penamaan pabrik yang bagus. Ini mempopulerkan gaya DSL yang bagus. contoh:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
Iain
sumber
1
Anda benar, Guava adalah perpustakaan hebat dengan kode yang sangat mudah dibaca.
deamon
11

"Buat" dan "buat" pendek, cukup menggugah, dan tidak terikat dengan pola lain dalam penamaan yang bisa saya pikirkan. Saya juga melihat keduanya cukup sering dan mencurigai mereka mungkin "standar de facto". Saya akan memilih satu dan menggunakannya secara konsisten setidaknya dalam suatu proyek. (Melihat proyek saya sendiri saat ini, saya sepertinya menggunakan "make". Saya harap saya konsisten ...)

Hindari "membangun" karena lebih cocok dengan pola Builder dan menghindari "menghasilkan" karena membangkitkan Produser / Konsumen.

Untuk benar-benar melanjutkan metafora nama "Pabrik" untuk pola itu, saya akan tergoda oleh "manufaktur", tapi itu kata yang terlalu panjang.

Don Roby
sumber
3

Saya pikir itu berasal dari " membuat objek". Namun, dalam bahasa Inggris, kata "buat" dikaitkan dengan gagasan "menyebabkan timbul, sebagai sesuatu yang unik yang tidak akan berevolusi secara alami atau yang tidak dibuat oleh proses biasa," dan "berevolusi dari pikiran sendiri atau imajinasi, sebagai karya seni atau penemuan. " Jadi sepertinya "buat" bukan kata yang tepat untuk digunakan. "Membuat," di sisi lain, berarti "mewujudkan keberadaan dengan membentuk atau mengubah bahan, menggabungkan bagian-bagian, dll." Misalnya, Anda tidak membuat gaun, Anda membuat gaun (objek). Jadi, menurut saya, "membuat" dengan makna "menghasilkan; menyebabkan ada atau terjadi; mewujudkan ”adalah kata yang jauh lebih baik untuk metode pabrik.

Frederik Krautwald
sumber
3

Saya suka yang baru. Untuk saya

var foo = newFoo();

membaca lebih baik daripada

var foo = createFoo();

Diterjemahkan ke bahasa Inggris kami memiliki foo adalah foo baru atau foo adalah buat foo. Meskipun saya bukan ahli grammer, saya cukup yakin yang terakhir secara tata bahasa salah.

rjax
sumber
Keduanya bekerja. createFooadalah suatu fungsi. footidak createFoo, seperti yang Anda katakan. fooadalah hasil dari createFoo().
Krzysztof Czelusniak
2

Sebagian konvensi, sebagian semantik.

Metode pabrik (ditandai oleh tradisional create) harus memanggil konstruktor yang sesuai. Jika saya melihat buildURI, saya akan berasumsi bahwa itu melibatkan beberapa perhitungan, atau perakitan dari bagian-bagian (dan saya tidak akan berpikir ada pabrik yang terlibat). Hal pertama yang saya pikir ketika saya lihat generateURIadalah membuat sesuatu yang acak, seperti tautan unduhan hasil personalisasi baru. Mereka tidak semuanya sama, kata-kata yang berbeda membangkitkan makna yang berbeda; tetapi kebanyakan dari mereka tidak konvensional.

Amadan
sumber
1

Saya akan menyebutnya UriFactory.Create()

Dimana,

UriFactoryadalah nama dari tipe kelas yang menyediakan metode yang membuat Uriinstance.

dan Create()metode kelebihan beban sebanyak variasi yang Anda miliki dalam spesifikasi Anda.

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

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
ini. __curious_geek
sumber
1
Meskipun saya setuju dengan penamaan Anda, saya sangat tidak setuju dengan konvensi Anda tentang penggunaan nama metode Pascal-cased.
Chatatata
2
@Leviathlon selalu tergantung pada bahasa pemrograman dan konvensi internal. Case Pascal benar-benar baik untuk bahasa seperti C #.
momo
@momo Tepat, saya pikir saya memiliki asumsi bahasa yang dibicarakan adalah Java.
Chatatata
0

Saya menunjukkan bahwa saya telah melihat semua kata kerja tetapi menghasilkan digunakan di beberapa perpustakaan atau lainnya, jadi saya tidak akan menyebut membuat menjadi konvensi universal.

Sekarang, buat memang terdengar lebih baik bagi saya, membangkitkan makna tindakan yang tepat.

Jadi ya, ini adalah masalah selera (sastra).

Vinko Vrsalovic
sumber
0

Secara pribadi saya suka instantiatedan instantiateWith, tapi itu hanya karena pengalaman Unity and Objective C saya. Konvensi penamaan di dalam mesin Unity tampaknya berputar di sekitar kata instantiateuntuk membuat contoh melalui metode pabrik, dan Objective C tampaknya menyukaiwith menunjukkan apa parameternya. Ini hanya benar-benar berfungsi dengan baik jika metode ini ada di kelas yang akan dipakai secara instan (dan dalam bahasa yang memungkinkan overloading konstruktor, ini bukan 'hal').

Justru Objective C's initWithyang lama juga bagus!

akan meminta
sumber
-3

Metode pabrik tidak menentukan nama metode. Anda dapat memiliki banyak metode yang Anda inginkan di pabrik Anda, asalkan semuanya mengembalikan objek dari keluarga yang sama.

Untuk detail lebih lanjut, kunjungi url http://xeon2k.wordpress.com

Nitin
sumber
4
Tautan tidak masuk akal, harus lebih spesifik.
brunsgaard