1.對於屬性的封裝,若是返回集合,使用IEnumerable<T>,若是延遲加載,使用IQueryable<T>,緣由是這個接口只能遍歷取出它的值,而不能對這個集合作出改變,好比設計模式
public class Order { private List<string> names; public IList<string> Names { get { return names; } } }
在程序中調用
Order order = new Order();
order.Names.Add("aa");
就對names作出了改變
因此將代碼重構,IList<string>換成IEnumerable<string>
public class Order { private List<string> names; public IEnumerable<string> Names { get { return names; } } }
由於IEnumberable只包括一個一個返回值爲IEnumerator的GetEnumerator()方法
2.使用委派代替繼承,是指在根本沒有父子關係的類中使用繼承是不合理的,能夠用委派的方式來代替。函數
以下代碼所示,Child和Sanitation(公共設施)是沒有邏輯上的父子關係,由於小孩不多是一個公共設施,因此咱們爲了完成這個功能讓Child類中可使用WashHands()方法,能夠考慮使用委派的方式spa
重構以前:設計
public class Sanitation { public string WashHands() { return "Cleaned"; } } public class Child : Sanitation { }
重構以後:這種方式咱們常常會用到,其實IOC也使用到了這個原理,能夠經過構造函數注入和方法注入等code
public class Sanitation { public string WashHands() { return "Cleaned"; } } public class Child { private Sanitation Sanitation { get; set; } public Child() { Sanitation = new Sanitation(); } public string WashHands() { return Sanitation.WashHands(); } }
這個重構是一個很好的重構,在很大程度上解決了濫用繼承的狀況,不少設計模式也用到了這種思想(好比橋接模式、適配器模式、策略模式等)。blog
3.封裝條件,是指條件關係比較複雜時,代碼的可讀性會比較差,因此這是咱們應該根據條件表達式是否須要參數將條件表達式提取成可讀性更好的屬性或者方法,若是條件表達式不須要參數則能夠提取成屬性,若是條件表達式須要參數則能夠提取成方法。繼承
4.分解複雜判斷,是指把原來複雜的條件判斷等語句用盡快返回等方式簡化代碼。接口
好比:get
public class Security { public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions) { bool hasPermission = false; if (user != null) { if (permission != null) { if (exemptions.Count() == 0) { if (SecurityChecker.CheckPermission(user, permission) || exemptions.Contains(permission)) { hasPermission = true; } } } } return hasPermission; } }
重構後:string
public class Security { public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions) { if (user == null || permission == null) { return false; } if(exemptions.Contains(permission)) { return true; } return SecurityChecker.CheckPermission(user, permission); } }
讓代碼在作處理任務以前先檢查條件,若是條件不知足就儘快返回,不繼續執行。