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); } }
让代码在作处理任务以前先检查条件,若是条件不知足就尽快返回,不继续执行。