C# Kompleksi Object Construction için Builder Deseni Anlamak
C#'deki karmaşık nesneler, uzun parametre listeleri ile inşa etmek için genellikle zor olan ve aynı inşaat sürecini kullanarak bir nesnenin farklı konfigürasyonlarını oluşturmanızı sağlar.TheDANFLT:0)Builder Desen), temsilinden karmaşık bir nesnenin inşasını ayırarak temiz bir çözüm sunar.
Bir yapılandırma nesnesini onlarca seçenekle bir araya getiren, bir kompozit rapor inşa etmek veya sofistike bir veri hattı oluşturmak, Builder Kalıp, kendi projelerinizde tam olarak karmaşık bir şekilde oluşturmaya hazır olacaktır.
Builder Desen Nedir?
Builder Desen bir tasarım modeli[Dönetici) oluşturur.[Dönetici:0) Bu, bir müşteriyi her parametreyi tek bir yapıya dönüştürmek yerine, bir dizi yöntem görüşmesi aracılığıyla inşa etmenizi sağlar. Aynı inşaatçı farklı temsiller oluşturmak için bir yönetmen tarafından talimat verebilir.
Desen özellikle de kullanışlıdır:
- Bir nesne birçok opsiyonel veya bağlı parametre gerektirir.
- İnşaat belirli bir sırayla yapılması gereken birden çok adım içerir.
- Aynı inşaat sürecini bir nesnenin farklı çeşitlerini oluşturmak için yeniden kullanmak istiyorsunuz.
- Bir nesnenin iç durumu tamamen inşa olana kadar ortaya çıkmamalıdır.
Kavram, dört kişilik bir özellik tarafından resmileştirildi: 0,4.Gang of Four): "Taraflı Kuraklıklar: Reusable Object-Oriented Software) ve C# geliştirmede bir temel haline geldi.
Builder Kalıplarının Temelleri
Builder Kalıp dört ana katılımcı içerir:
- [FONT:0]Ürün - İnşaat altında karmaşık nesne. Genellikle monte edilmesi gereken birçok parça içerir.
- [FONT:0)Yapıcı[Dön veya soyut sınıf) - Ürün inşa etmek için gerekli adımları at, genellikle [[Üyetim:0), [[Şerefli:2.
- [FONT:0)Concrete Builder[Dönetici:0)[Dönetici:0)[Kıtlı Yapılar[Dönlümler)[Döneticileri inşa etmek ve bir araya getirmek için inşaatçı arayüzünü uygular.
- [FONT:0) Yönetmen) – İnşaatçının belirli bir sırayla adımlarını arayarak bina sürecine eşlik eder. Yönetmen, tarifin tanımını bilir, ancak aynı algoritmanın farklı temsillere olanak sağlar.
Müşteri genellikle beton bir inşaatçıya geçer, yönetmene geçer (veya inşaatçıyı akıcı bir tarzda çağırır), ve sonra bitmiş ürünü alır.
Gerçek Dünya C# Örnek: Özel Bir Ev inşa
Tamamlanmış, yeniden uygulanabilir bir örnekle yürüyelim. Birkaç seçenekli özellikle bir ürün tasarlayacağız. İnşaatçılar bir ev adımını adım atmasına izin verecek ve bir yönetmen standart bir inşaat dizisine uygulayacaktır.
Ürün Sınıfı
public class House
{
public string Foundation { get; set; }
public string Walls { get; set; }
public string Roof { get; set; }
public string Windows { get; set; }
public string Doors { get; set; }
public bool HasGarage { get; set; }
public bool HasGarden { get; set; }
public override string ToString()
=> $"House: {Walls}, {Roof}, {Doors}, {Windows}, Garage: {HasGarage}, Garden: {HasGarden}";
}
The Builder Interface
public interface IHouseBuilder
{
void BuildFoundation();
void BuildWalls();
void BuildRoof();
void BuildWindows();
void BuildDoors();
void BuildGarage();
void BuildGarden();
House GetResult();
}
Beton Builder
public class ConcreteHouseBuilder : IHouseBuilder
{
private House _house = new House();
public void BuildFoundation() => _house.Foundation = "Concrete slab";
public void BuildWalls() => _house.Walls = "Brick walls";
public void BuildRoof() => _house.Roof = "Gable roof";
public void BuildWindows() => _house.Windows = "Double‑pane windows";
public void BuildDoors() => _house.Doors = "Wooden doors";
public void BuildGarage() => _house.HasGarage = true;
public void BuildGarden() => _house.HasGarden = true;
public House GetResult() => _house;
// Allow reset to reuse the builder
public void Reset() => _house = new House();
}
Yönetmen
public class HouseDirector
{
private IHouseBuilder _builder;
public HouseDirector(IHouseBuilder builder) => _builder = builder;
// Standard house construction steps
public House ConstructStandardHouse()
{
_builder.Reset();
_builder.BuildFoundation();
_builder.BuildWalls();
_builder.BuildRoof();
_builder.BuildWindows();
_builder.BuildDoors();
return _builder.GetResult();
}
// House with garage
public House ConstructHouseWithGarage()
{
_builder.Reset();
_builder.BuildFoundation();
_builder.BuildWalls();
_builder.BuildRoof();
_builder.BuildWindows();
_builder.BuildDoors();
_builder.BuildGarage();
return _builder.GetResult();
}
}
Müşteri Kodu
var builder = new ConcreteHouseBuilder();
var director = new HouseDirector(builder);
House standardHouse = director.ConstructStandardHouse();
Console.WriteLine(standardHouse);
// Output: House: Brick walls, Gable roof, Wooden doors, Double‑pane windows, Garage: False, Garden: False
House houseWithGarage = director.ConstructHouseWithGarage();
Console.WriteLine(houseWithGarage);
// Output: House: Brick walls, Gable roof, Wooden doors, Double‑pane windows, Garage: True, Garden: False
Bu örnek, desenin “nasıl” (profesyonel adımlar) “nasıl” (projektör) ile “nasıl” (her bir ev inşa etmek için nasıl bir şey oluşturacağını gösterir.
Fluent Builder Variation
Modern C# geliştirmede, klasik Builder Desen genellikle aİLFLT:0)fluent arayüzü) okunabilirliği artırmak yerine, bir yönetmen kullanarak, inşaatçının kendisini döndürürsünden 9, yöntem zincirlemesine izin verir.
public class FluentHouseBuilder
{
private House _house = new House();
public FluentHouseBuilder WithFoundation(string type)
{
_house.Foundation = type;
return this;
}
public FluentHouseBuilder WithWalls(string material)
{
_house.Walls = material;
return this;
}
public FluentHouseBuilder WithRoof(string style)
{
_house.Roof = style;
return this;
}
public FluentHouseBuilder WithWindows(string type)
{
_house.Windows = type;
return this;
}
public FluentHouseBuilder WithDoors(string type)
{
_house.Doors = type;
return this;
}
public FluentHouseBuilder AddGarage() { _house.HasGarage = true; return this; }
public FluentHouseBuilder AddGarden() { _house.HasGarden = true; return this; }
public House Build() => _house;
}
// Usage
House modernHouse = new FluentHouseBuilder()
.WithFoundation("Concrete slab")
.WithWalls("Glass panels")
.WithRoof("Flat roof")
.WithWindows("Floor‑to‑ceiling")
.WithDoors("Sliding glass")
.AddGarage()
.Build();
Akışkan inşaatçısı ayrı bir yönetmen ihtiyacını ortadan kaldırır ve müşteri inşaat dizisi üzerinde tam kontrol sağlar. Ürün birçok opsiyonlu parametreye sahip olduğunda ve önceden belirlenmiş bir inşaat düzenine ihtiyacınız yoktur.
Builder Deseni Ne Zaman Kullanılır
Builder Desen her zaman en iyi seçim değildir. Bunu göz önünde bulundurun:
- [FONT:0]Objects'in birçok seçenek veya karmaşık başlangıç vardır.[[DÜT:1] 10+ parametre ile bir yapıtsız ve hata-prone olur.
- [FONT:0)Construction, çok adımlı bir süreçtir.[DÜT:1] E.g., veri toplama, formatlama ve üst düzey / ayaklamalar ekleme gerektiren bir rapor inşa etmek.
- [FONT=0) Aynı nesnenin farklı temsillerini oluşturmanız gerekir.[[DÜT 1: 1) Aynı inşaatçı arayüzü birden çok beton inşaatçı tarafından uygulanabilir (örneğin, [[UygunT:12).
- [FONT:0) Belirli bir inşaat siparişini uygulamak istiyorsunuz [DÜDÜT:1] inşaatın altında nesneyi açığa çıkarmadan. yönetmen bunu uygulamaktadır.
Öte yandan, nesneniz basit ve birkaç parametreye sahipse, bir inşaat veya statik fabrika yöntemi yeterlidir. Yapıcı, önemsiz durumlarda haklı olmayan karmaşık durumlar için karmaşık olmayan karmaşıklık ekliyor.
Diğer Yaratılış Desenleri
Builder vs. Factory Method
[FONT=0]Fabrika Yöntemi[[Dönetici:0)[Dönetici:0) Bir fabrika genellikle bir çağrıda tam bir nesne döndürür, bir inşaatçı, hangi beton sınıfın hangi beton sınıfın yaratıp oluşturamayacağına karar vermek için bir fabrika kullanır; nesnenin inşaatını birçok adım veya opsiyonel parçalara dahil ettiğinde kullanır.
Builder vs. Abstract Factory
[FONT:0)Abstract Factory[[[Dönetici: 1), ilgili aile oluşturmak için bir arayüz sağlar (veya bağımlı) beton sınıflarını belirtmeden sonra nesneleri döndürür.Bir inşaatçı, aksine, tek bir karmaşık nesne inşa etmeye odaklanır. Abstract Factory genellikle son inşa adımı çağırdıktan sonra bir ürün döndürür.
Uygulamada, iki birleştirilebilir: inşaatçının kendisini (örneğin, 03,5) oluşturmak için soyut bir fabrika kullanabilir veya inşaatçı ürünün bireysel kısımlarını oluşturmak için soyut bir fabrika kullanabilir.
Gelişmiş Kullanım Vakaları ve Variations
Immutable Objects için Genric Builder
İmkansız nesnelerle çalışırken (örneğin, kayıt), inşaatçılar devletten bir araya gelebilir ve sonra da makul bir nesne inşa edebilir.Bu, kütüphanelerde kullanılmaktadır.
public record ProductConfiguration
{
public string Name { get; init; }
public decimal Price { get; init; }
public int Stock { get; init; }
public bool IsAvailable { get; init; }
}
public class ProductConfigurationBuilder
{
private string _name = "Default";
private decimal _price;
private int _stock;
private bool _isAvailable;
public ProductConfigurationBuilder WithName(string name) { _name = name; return this; }
public ProductConfigurationBuilder WithPrice(decimal price) { _price = price; return this; }
public ProductConfigurationBuilder WithStock(int stock) { _stock = stock; return this; }
public ProductConfigurationBuilder SetAvailability(bool available) { _isAvailable = available; return this; }
public ProductConfiguration Build()
=> new ProductConfiguration
{
Name = _name,
Price = _price,
Stock = _stock,
IsAvailable = _isAvailable
};
}
Bağımlılığı ile Builder with Dependency Enjeksiyon
İşletme uygulamaları, inşaatçılar genellikle hizmetleri enjekte etmek zorunda kalıyorlar. DI konteynerinizde inşaatçıyı kayıt olabilirsiniz ve gerekli bağımlılıkları inşaat sırasında kullanabilirsiniz. (e.g., a construction forurFLT:19).
Adım-Wise Builder (Dialog Builder)
Bazı nesneler, ürünün zorunlu, eşdeğer adımlarda yapılmasını gerektirir. Bu tür durumlarda, yalnızca bir sonraki izin verilen adımı ortaya koyan bir HTTP isteği oluşturucu oluşturabilirsiniz.Bu, bir inşaatçı içinde, genellikle sorgu veya diyaloglar oluşturmak için kullanılır. Örneğin, bir HTTP isteği oluşturucu, sizi bölmeden önce alıntıları belirtmeye zorlayabilir.
En İyi Uygulamalar ve Ortak Pitfalls
- [FONT:0) İnşaatçıyı odaklanmış tut.[[Dönetici: 1) Bir inşaatçının bir tür ürün inşa etmesi gerekir. Farklı ürün ailelerine ihtiyacınız varsa, ayrı inşaatçılar veya soyut bir fabrika düşünün.
- [FONT:0)Provide mantıklı varsayılan varsayılanlar.[DÜT:1] Her adımın çağrılması gerekmez. Ürün, opsiyonel parçalar için makul varsayılan varsayılanlere sahip olmalıdır.
- [FONT:0] Ürün geçerli bir durumda değilse, nihai ürünü kontrol etmek yerine, her adımdan sonra geçerliliği kontrol etmek yerine, bir kez daha doğrulayın. Ürün geçerli bir durumda değilse bir istisna kullanın.
- [[Dönetici:0)Bir kez inşa edilene kadar ürün genellikle düşünülemez veya sınırlı bir arayüze sahip olmalıdır. Bu, inşaattan sonra kazara değişiklikler yapılmasını önler.
- [FONT:0] İnşaat sırasında ürüne maruz kalmaktan kaçının.[DÜT:1] Ürünü inşaat sırasında özel olarak tut. ”Bu, müşterileri eksik bir nesne kullanarak önlemektir.
- [FONT:0) Modern C# için akıcı bir stil ortaya koyar.[#) Fluent inşaatçılar kullanmak ve ayrı bir yönetmen sınıfı için ihtiyaç duyulan ihtiyacı azaltmak için daha sezgiseldir.
Ortak bir hata, inşaatçıyı çok genel hale getirmek veya aynı inşaatçı ile ilgili birçok ürün oluşturmaya çalışmaktır. Single Sorumluluk Prensibine sadık kalın: Her inşaatçı bir ürün türü inşa eder.
Dış Kaynaklar
Builder Kalıp ve tasarım desenlerini genel olarak derinleştirmek için, bu yazara dayalı referansları keşfedin:
- [FONT=0) Microsoft Design Desenleri (C#)) - Örneklerle Resmi belgeler.
- [FONT=0)Refaksiyon Guru: Builder Desen[DÜT:1) – UML diyagramları ve pcode ile açık açıklama.
- [FONT:0)Martin Fowler, Fluent Interface) – inşaatçılarla sık sık sık bir araya gelen akıcı stili açıklayın.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Builder Desen, C#'de karmaşık nesne yaratımı için güçlü bir tekniktir. İnşaat sürecini farklı adımlara ayırarak, kodunuzda daha iyi kontrol, yeniden kullanılabilirlik ve netlik kazanırsınız. Klasik yönetmen tabanlı yaklaşımı veya daha modern akıcı inşaatçıyı benimsemeniz, desen size güven ile nesneleri birleştirebilirsiniz - bu nesneler birçok seçenek olduğunda bile, karmaşık başlangıç mantığı veya çoklu varyasyonlar.
Hiçbir desenin gümüş bir mermi olduğunu unutmayın. Belirli senaryonuzu Evaluate: Eğer nesneler basit veya inşaat adımlarını nadiren değiştirirse, basit bir yapı veya fabrika yöntemi daha basit olabilir. Ancak kendinizi telescoping yapıcılar veya derinden nestedizer başlangıçları ile güreştiğinizde, doğru bir şekilde kullanılan Builder Kalıplara ulaşabilir, özellikle de büyük Cscale C# uygulamaları ile çalışmak için kodunuzu daha fazla koruyabilir.