کلاس ها در Clean Code (قسمت5)

استفاده از زنجیره متدها-Use method chainingترجیح دادن ترکیب بجای وراثت-Prefer composition over inheritanceاستفاده از زنجیره متدها Use method chainingاین الگوی بسیار مفید است و معمولاً در بسیاری از کتابخانه ها مورد استفاده قرار می گیرد.این اجازه می دهد تا کد شما واضح تر ، و واژگان کمتری داشته باشد.به همین دلیل ، از روش زنجیره ای استفاده کنید و نگاهی بیندازید که کد شما چقدر تمیز خواهد بود.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(); }ترجیح دادن ترکیب بجای وراثت Prefer composition over inheritanceهمانطور که معروف است در الگوهای طراحی/Design Patterns توسط Gang of Four ، شما ترکیب را بر وراثت تا جایی که می توانید ترجیح دهید.دلایل خوب زیادی برای استفاده از وراثت و دلایل خوب زیادی برای استفاده از ترکیب وجود دارد.نکته اصلی حداکثر این است که اگر ذهن شما به طور غریزی به سمت ارث بری می رود ، سعی کنید فکر کنید که آیا ترکیب می تواند مشکل شما را بهتر مدل کند. در بعضی موارد می تواند.ممکن است تعجب کنید ،"چه موقع باید از ارث بری استفاده کنم؟"بستگی به مشکل شما دارد ،اما این یک لیست مناسب در زمانی است که ارث بری از ترکیب بیشتر معنی می دهد:1-وراث شما نمایانگر یک رابطه "is-a" (هست یک)است و نه یک رابطه "has-a" (دارد یک) (انسان->حیوان در مقابل کاربر->اطلاعات کاربر) (Human->Animal درمقابل User->UserDetails).2-می توانید از کد کلاس های پایه (base classes) استفاده مجدد کنید (انسانها مانند همه حیوانات می توانند حرکت کنند).3-شما می خواهید با تغییر یک کلاس پایه ، تغییرات global در کلاسهای مشتق شده ایجاد کنید(هزینه کالری همه حیوانات را هنگام حرکت تغییر دهید).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 &quothave&quot 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); } // ... }منبع