Bir nesneyi oluşturmak için yöntem zincirini kullanan deyim adı nedir?


21

Bir nesneyi, a veya desene benzer şekilde ayarlamak için yöntem zincirini kullandığım , ancak her yöntem çağrısı ile yeni nesneler oluşturmadığım, orijinal nesneyi değiştirdiğim bir desen kullanıyorum .BuilderPrototype

Örnek:

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

Sadece bu kalıp için bir isim olup olmadığını ve bunun anti-pattern olarak kabul edilip edilmediğini merak etmek, çünkü daha akıcı bir şekilde okuyabilmesine rağmen, uzun yöntem zincirlerine yol açabilir.


3
Akıcı bir arayüz bir stil meselesidir. Bir API yazıyorsanız, ona alternatif formlar sağlayın.
02.02'de

1
Daha fazla tartışma için, bu soruya bir göz atın: programmers.stackexchange.com/questions/69519/…
Eric King

@Oded Her çağrıyı ayrı bir açıklama yaparak zincirleme yapmadan böyle bir API kullanmak mümkün mü, yoksa alternatif için başka bir fikriniz mi var?
Garrett Hall

@GarrettHall - Tabii ki mümkün, ama sonra bağlamsız gibi şeyler çağırıyorsun menu.withStyle(""). Böyle bir durumda iki API'ye ihtiyacınız var .
Oded

2
@GarrettHall 'Akıcı arayüzün amacı , bir cümle gibi okunması gereken yöntem zinciridir. Bu anlamda, uzun yöntem zinciri fena sayılmaz. Fakat burada Oded ile aynı fikirdeyim, aynı işlevselliği daha geleneksel bir sözdiziminde sağlamak en iyisidir. Bu şekilde geliştirici hangi yöntemi kullanacağını seçebilir.
Eric King,

Yanıtlar:


37

Akıcı Arayüz

Bu yöntemin , Eric Evans ( Domain Driven Design şöhreti) ve Martin Fowler ( Agile Manifesto şöhreti) ile oluşturduğu gibi, ' akıcı arayüz ' olarak adlandırıldığını her zaman duydum .

Başlıca sakıncalar, okunabilirlik (bazılarının sevdiği ve bazılarından nefret ettiği) ve bazı durumlarda hata ayıklamanın daha zor olabileceği gerçeğidir, çünkü eylem zincirinin tamamı, adım adım ilerlerken tek bir ifade olarak kabul edilebilir.

Tekniği bir model olarak görmüyorum, ancak tekniği sadece birkaç defa kullandım.


4
Taraftarların akıcı bir ara yüzün sadece yöntem zincirlemesinden çok daha fazlasını içerdiği konusunda ısrarcı olduklarına dikkat edin, ancak bu terimle ne kastedildiği genellikle belirsizdir.
Kilian Foth

Tüm zincirin tek bir açıklama olarak kabul edilmesi yaygın mıdır? Bana kötü tasarlanmış bir hata ayıklayıcı sorun gibi geliyor.
blueberryfields

Zincirleri tek bir ifade olarak gören bir hata ayıklayıcısına rastlamadım, ancak belirli bir zincirde, zincirin sonuna doğru yöntemlerden yalnızca biriyle ilgileniyorsanız, hala acı olabilir.
vaughandroid

1
C # ile çalışıyorum ve .NET hata ayıklayıcı, bireysel yöntemlere gayet iyi adım atmama izin veriyor. Diğer diller, pek emin değilim.
Eric King,

1
@KilianFoth Sorunun yorumlarında belirtildiği gibi, akıcı bir arayüzdeki zincirleme yöntemler neredeyse bir cümle olarak okunabilir olmalıdır. Bazen bu, bireysel metotların aksi takdirde iyi uygulama olarak kabul edilenden farklı isimlere sahip olması gerektiği anlamına gelir
Izkata

5

Bunun gibi yöntem zincirleme, zincirde bir tür akış veya keşfedilebilirlik olduğunda genellikle Akıcı Arayüz olarak adlandırılır. Alternatif olarak, jQuery gibi bir api'yi, akıcı olmayan bir yöntem olarak 'akıcı' olarak kullanmayan, çünkü keşfedilebilirliğe vurgu yapan aynı şey olmadığını düşünebilirsiniz - kolaylık için daha fazla.

Örneğiniz için (withx, withy kullanarak) bunu Builder modelinin bir türevi olarak düşünebilirsiniz, çünkü bazı durumlar (yöntem çağrıları) uygun şekilde yapılandırılmış bir nesneyi nasıl geri döndüreceğini bilen uzman bir sınıfa sahiptir.

Bu, uygun şekilde kullanıldığında bir kalıp karşıtı değildir.


Keşfedilebilirlik nedir? API'nin otomatik tamamlaması aracılığıyla ihtiyacınız olan yöntemleri bulma yeteneği?
Josiah Yoder

JQuery ile aşina değilim. Yöntem zincirleri keşfedilebilirlik yerine sadece kolaylık sağlamak için nasıldır? Çünkü zincirlemenin pek çok yolu var, otomatik tamamlamada bile çok muazzam?
Josiah Yoder

3

Anti-patern olarak kabul edilip edilmediği,

kesinlikle bir anti-pattern değil. jQuery muhtemelen bunun en çok kullanılan uygulamasıdır.

Çünkü daha akıcı bir şekilde okuyabilmesine rağmen, uzun yöntem zincirlerine yol açabilir.

Evet yapabilir, ancak alternatif nedir? Neredeyse sade bir ingilizce cümle ile bitebilir, api neyin uygun ve uygun olduğuna sizi yönlendirir.


..ve 8 - 10 yerine 1 satırda istediğinizi elde edersiniz. Terminalde sadece tek bir yazı yazıyorsanız iyidir. 10'dan 1 komutunu geri çağırmak daha kolaydır. Akıcı olduğundan ve yöntemlerin tanımlayıcı adları olduğundan okunması da kolaydır. Maalesef Python2'de bunun çoğu Python3 / Python4 ile yapılamaz.
mckenzm

-3

Bu "tren kazası" deseni denir.

(Bu bir anti-kalıptır ve Temiz Kod'a aykırıdır)

"Tren kazası" deseni Demeter Yasasını ihlal ediyor .


3
Bu, link verdiğiniz makalede yer alan ve örneklerin bulunduğu metotla aynı değildir a.getB().getC().doSomething(). Bu örnek kötü çünkü "Metodunuz metotları doğrudan kendi alanlarından arayabilir (alanların tarlalarında değil)". Burada, yaratılan sadece 1 nesne var ve “kendin yaptığın oyuncaklarla oynayabilirsin”.
Nic
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.