Apa nama untuk idiom menggunakan metode chaining untuk membangun sebuah objek?

21

Saya sering menggunakan pola di mana saya menggunakan metode chaining untuk mengatur objek, mirip dengan Builderatau Prototypepola, tetapi tidak membuat objek baru dengan setiap pemanggilan metode, sebagai gantinya memodifikasi objek asli.

Contoh:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

Hanya ingin tahu apakah ada nama untuk pola ini dan apakah itu dianggap sebagai anti-pola, karena meskipun dapat membaca lebih lancar, itu dapat menyebabkan rantai metode yang panjang.

Garrett Hall
sumber
3
Antarmuka yang lancar adalah masalah gaya. Jika Anda menulis API, berikan formulir alternatif untuk itu.
Oded
1
Untuk diskusi lebih, kita lihat pertanyaan ini: programmers.stackexchange.com/questions/69519/...
Eric Raja
@Oded Hal ini dimungkinkan untuk menggunakan API seperti tanpa chaining dengan hanya membuat setiap panggilan pernyataan terpisah, atau apakah Anda punya ide lain untuk alternatif?
Garrett Hall
@ GarrettHall - Tentu saja itu mungkin, tetapi kemudian Anda akhirnya memanggil hal-hal seperti menu.withStyle("")tanpa konteks. Anda perlu dua API dalam kasus seperti itu.
Oded
2
@GarrettHall Inti dari 'antarmuka yang lancar' adalah rantai metode, yang dimaksudkan untuk dibaca seperti kalimat. Dalam hal ini, rantai metode panjang tidak dianggap buruk. Tapi, dan di sini saya setuju dengan Oded, akan lebih baik juga menyediakan fungsionalitas yang sama dalam sintaksis yang lebih konvensional. Dengan begitu, pengembang dapat memilih metode mana yang akan digunakan.
Eric King

Jawaban:

37

Antarmuka Lancar

Saya selalu mendengar tentang metode ini disebut ' antarmuka lancar ', seperti yang dicetuskan oleh Eric Evans (dari Domain Driven Design fame) dan Martin Fowler (dari Agile Manifesto fame).

Kelemahan utama adalah keterbacaan (yang disukai beberapa orang dan beberapa kebencian), dan fakta bahwa mungkin lebih sulit untuk men-debug dalam beberapa kasus karena seluruh rangkaian tindakan dapat dianggap sebagai pernyataan tunggal ketika melangkah melaluinya.

Saya tentu saja tidak menganggapnya sebagai anti-pola, meskipun saya sendiri hanya menggunakan teknik beberapa kali.

Eric King
sumber
4
Perhatikan bahwa para pendukung cukup bersikeras bahwa antarmuka yang lancar melibatkan lebih dari sekedar metode chaining, meskipun sering tidak jelas apa lagi yang dimaksud dengan istilah itu.
Kilian Foth
Apakah umum bagi seluruh rantai untuk dianggap sebagai satu pernyataan? Itu terdengar seperti masalah debugger yang dirancang dengan buruk bagi saya.
blueberryfields
Saya belum menemukan debugger yang memperlakukan rantai sebagai satu pernyataan, tetapi masih bisa menyebalkan jika Anda hanya tertarik pada salah satu metode menjelang akhir rantai, dalam satu rantai tertentu.
vaughandroid
1
Saya bekerja di C #, dan .NET debugger memungkinkan saya masuk ke metode individual dengan baik. Bahasa lain, saya tidak begitu yakin.
Eric King
1
@KilianFoth Seperti disebutkan dalam komentar pertanyaan, metode dirantai dalam antarmuka yang lancar harus dapat dibaca hampir sebagai kalimat. Kadang-kadang ini berarti bahwa metode individual harus memiliki nama yang berbeda dari yang dianggap sebagai praktik yang baik
Izkata
5

Metode perangkaian seperti itu biasanya disebut Antarmuka Lancar ketika ada semacam aliran atau kemampuan ditemukan dalam rantai. Atau, Anda dapat menganggap api seperti jQuery yang sangat bergantung pada metode chaining sebagai tidak 'lancar' karena tidak ada penekanan yang sama pada kemampuan menemukan - itu lebih untuk kenyamanan.

Sebagai contoh Anda (menggunakan withx, withy) Anda dapat menganggap ini varian dari pola Builder karena Anda memiliki kelas khusus yang, mengingat beberapa keadaan (pemanggilan metode) tahu cara mengembalikan objek yang dikonfigurasi dengan benar.

Ini bukan anti-pola jika digunakan dengan tepat.

pfries
sumber
Apa itu penemuan? Kemampuan untuk menemukan metode yang Anda butuhkan melalui pelengkapan otomatis API?
Josiah Yoder
Saya tidak terbiasa dengan jQuery. Bagaimana rantai metode mereka hanya untuk kenyamanan, bukan kemudahan ditemukan? Karena ada begitu banyak cara untuk rantai itu luar biasa bahkan dengan autocomplete?
Josiah Yoder
3

apakah itu dianggap sebagai anti-pola,

jelas bukan anti-pola. jQuery mungkin implementasi yang paling baik digunakan untuk ini.

karena meskipun dapat membaca lebih lancar, itu dapat menyebabkan rantai metode yang panjang

Ya itu bisa, tetapi apa alternatifnya? Anda dapat berakhir dengan kalimat bahasa Inggris yang hampir pasti, dengan api memandu Anda untuk apa yang tersedia dan sesuai.

NimChimpsky
sumber
..dan Anda mendapatkan apa yang Anda inginkan dalam 1 baris, bukannya 8 - 10. Yang bagus jika Anda hanya menulis satu liner di terminal. Lebih mudah mengingat 1 perintah daripada 10. Karena fasih dan metode memiliki nama deskriptif juga lebih mudah dibaca. Sayangnya banyak ini di Python2 tidak lagi dapat dilakukan di Python3 / Python4.
mckenzm
-3

Ini disebut pola "train wreck".

(Ini anti-pola dan bertentangan dengan Kode Bersih)

Pola "kereta karam" melanggar Hukum Demeter .

Marc
sumber
3
Ini tidak sama dengan metode chaining di artikel yang Anda tautkan, di mana contohnya a.getB().getC().doSomething(). Contoh itu buruk karena "Metode Anda dapat memanggil metode di bidangnya sendiri secara langsung (tetapi tidak di bidang bidang)". Di sini, hanya ada 1 objek, yang sedang dibuat, dan "kamu bisa bermain dengan mainan yang kamu buat sendiri".
Nic