این الگوی بسیار مفید است و معمولاً در بسیاری از کتابخانه ها مورد استفاده قرار می گیرد.این اجازه می دهد تا کد شما واضح تر ، و واژگان کمتری داشته باشد.به همین دلیل ، از روش زنجیره ای استفاده کنید و نگاهی بیندازید که کد شما چقدر تمیز خواهد بود.
Good:
public static class ListExtensions { public static List<T> FluentAdd<T>(this List<T> list, T item) { list.Add(item); return list; } public static List<T> FluentClear<T>(this List<T> list) { list.Clear(); return list; } public static List<T> FluentForEach<T>(this List<T> list, Action<T> action) { list.ForEach(action); return list; } public static List<T> FluentInsert<T>(this List<T> list, int index, T item) { list.Insert(index, item); return list; } public static List<T> FluentRemoveAt<T>(this List<T> list, int index) { list.RemoveAt(index); return list; } public static List<T> FluentReverse<T>(this List<T> list) { list.Reverse(); return list; } } internal static void ListFluentExtensions() { var list = new List<int>() { 1, 2, 3, 4, 5 } .FluentAdd(1) .FluentInsert(0, 0) .FluentRemoveAt(1) .FluentReverse() .FluentForEach(value => value.WriteLine()) .FluentClear(); }
همانطور که معروف است در الگوهای طراحی/Design Patterns توسط Gang of Four ، شما ترکیب را بر وراثت تا جایی که می توانید ترجیح دهید.دلایل خوب زیادی برای استفاده از وراثت و دلایل خوب زیادی برای استفاده از ترکیب وجود دارد.
نکته اصلی حداکثر این است که اگر ذهن شما به طور غریزی به سمت ارث بری می رود ، سعی کنید فکر کنید که آیا ترکیب می تواند مشکل شما را بهتر مدل کند. در بعضی موارد می تواند.
ممکن است تعجب کنید ،"چه موقع باید از ارث بری استفاده کنم؟"بستگی به مشکل شما دارد ،اما این یک لیست مناسب در زمانی است که ارث بری از ترکیب بیشتر معنی می دهد:
Bad:
class Employee { private string Name { get; set; } private string Email { get; set; } public Employee(string name, string email) { Name = name; Email = email; } // ... } // Bad because Employees "have" tax data. // EmployeeTaxData is not a type of Employee class EmployeeTaxData : Employee { private string Name { get; } private string Email { get; } public EmployeeTaxData(string name, string email, string ssn, string salary) { // ... } // ... }
Good:
class EmployeeTaxData { public string Ssn { get; } public string Salary { get; } public EmployeeTaxData(string ssn, string salary) { Ssn = ssn; Salary = salary; } // ... } class Employee { public string Name { get; } public string Email { get; } public EmployeeTaxData TaxData { get; } public Employee(string name, string email) { Name = name; Email = email; } public void SetTax(string ssn, double salary) { TaxData = new EmployeeTaxData(ssn, salary); } // ... }