
وجود اشیای پیچیده در solutionهای مختلف بسیار رایج است. اشیایی که دارای چندین فیلد هستند و ساختن هر فیلد از آن می تواند مشکل باشد و گاهی اوقات ما برای آنها سازنده های غول پیکیری را ایجاد می کنیم.
public class Order { public Order(Buyer buyer, Seller seller, Product product, double price) { Buyer = buyer; Seller = seller; Product = product; Price = price; } public Buyer Buyer { get; set; } public Seller Seller { get; set; } public Product Product { get; set; } public double Price { get; set; } }
همانطور که مشاهده می کنید، برخی از فیلدها می توانند دارای اشیای تودرتو باشند.
از طریق این الگو، کدهای ساخت یک شی را از کلاس خود خارج می کنیم و در یک کلاس سازنده قرار می دهیم. به این ترتیب سادگی و خوانایی کد را افزایش می دهیم.
از مهم ترین مزایای الگوی Fluent Builder، افزایش قابلیت نگهداری کد، بالا بردن خوانایی کد و کاهش خطا در ساخت یک شی جدید می باشد.
در زمان استفاده از این الگو، به این نکته توجه داشته باشید که استفاده از آن چه مزایایی را می تواند برای شما داشته باشد. هدف ما این است که پیچیدگی را کاهش دهیم، نه اینکه برای ایجاد کلاس های builder وقت خود را تلف کنیم.
در یک مثال ساده می توانید کلاس زیر را در نظر بگیرید.
public class Burger { public int NumPatties { get; set; } public bool Cheese { get; set; } public bool Bacon { get; set; } public bool Pickles { get; set; } public bool Letuce { get; set; } public bool Tomato { get; set; } public Burger(int numPatties = 1) { NumPatties = numPatties; } public Burger(bool cheese, bool bacon, bool pickles, bool letuce, bool tomato, int numPatties = 1) { NumPatties = numPatties; Cheese = cheese; Bacon = bacon; Pickles = pickles; Letuce = letuce; Tomato = tomato; } }
یکی از گزینه های موجود، داشتن یک constructor است که تمام پارامترهای boolean را دریافت کند.
نتیجه چیزی شبیه به مثال زیر خواهد بود:
Burger uglyBurger = new Burger(true, true, false, false, false);
با این حال، ارائه این کد زیبا نیست. در چنین مواردی، ما می توانیم یک کلاس سازنده با چندین متد ایجاد کنیم که عملکرد آنها به راحتی قابل درک باشد.
public class BurgerBuilder { private Burger _burger = new Burger(); public Burger Build() => _burger; public BurgerBuilder WithPatties(int num) { _burger.NumPatties = num; return this; } public BurgerBuilder WithCheese() { _burger.Cheese = true; return this; } public BurgerBuilder WithBacon() { _burger.Bacon = true; return this; } (...) }
با این پیاده سازی می توانیم موارد زیر را داشته باشیم:
var awesomeburger = new BurgerBuilder() .WithCheese() .WithBacon() .Build();
این الگو زمانی مناسب است که یک شی داشته باشید که دارای یک سازنده با بیش از چند پارامتر است و این پارامترها اشیایی با کلاس های تو در تو می باشند. سازنده ای که دارای چندین پارامتر اختیاری است نیز سناریوی مناسبی برای استفاده از این الگو است.
پایان