Kısa bir süre önce Kod İncelemesinde şöyle başlayan bir java cevabı sildim :
private Person(PersonBuilder builder) {
Durdurmak. Kırmızı bayrak. Bir PersonBuilder bir Kişi inşa eder; bir Kişiyi bilir. Person sınıfı bir PersonBuilder hakkında hiçbir şey bilmemelidir - bu sadece değişmez bir tiptir. Burada, A'nın A'ya bağlı olan B'ye bağlı olduğu dairesel bir bağlantı oluşturdunuz.
Kişi sadece parametrelerini almalıdır; bir İnsanı inşa etmeden oluşturmak isteyen bir müşteri bunu yapabilmelidir.
Bir aşağı oyla tokatlandım ve Kırmızı bayraktan (alıntı yaparak) söyledim , neden? Buradaki uygulama Joshua Bloch'un "Etkili Java" kitabında (madde # 2) gösterdiği şekle sahiptir.
Yani, Java'da bir Oluşturucu Deseni uygulamanın Tek Doğru Yolu , oluşturucuyu iç içe bir tür yapmaktır (bu sorunun ne olduğu ile ilgili değildir) ve ardından ürünü (inşa edilen nesnenin sınıfı) yapmaktır. ) yapıcıya şu şekilde bağımlı olun :
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
Aynı Oluşturucu deseni için aynı Wikipedia sayfası, C # için çılgınca farklı (ve çok daha esnek) bir uygulamaya sahiptir:
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
Gördüğünüz gibi, buradaki ürün bir Builder
sınıf hakkında hiçbir şey bilmiyor ve tüm umurunda, doğrudan bir yapıcı çağrısı, soyut bir fabrika, ... veya bir kurucu tarafından anlatılabilir - anladığım kadarıyla, ürün bir yaradılış desen asla onu yaratıyor hakkında hiçbir şey bilmesi gerekir.
Ben onlarca isteğe bağlı argüman ile şişirilmiş bir yapıcı yeniden tür bir tür yeniden çalışma için kullanılabilir bir oluşturucu desen kullanılabilir karşı argüman (ki açıkça Bloch'ın kitabında savunulur) hizmet. Bildiğimi düşündüğüm şeye bağlı kalmak yerine, bu sitede biraz araştırma yaptığımı ve şüphelendiğim gibi, bu argümanın su tutmadığını buldum .
Peki anlaşma nedir? İlk etapta var olmaması gereken bir soruna neden aşırı mühendislik çözümleri getirmeliyiz? Joshua Bloch'u bir dakika boyunca kaidesinden çıkarırsak, iki somut tipin birleştirilmesi ve en iyi uygulama olarak adlandırılması için tek bir iyi, geçerli bir neden bulabilir miyiz?
Bunların hepsi bana kargo kült programlama gibi geliyor.