C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计
1.区分接口和抽象类的应用场合
区别:
①接口支持多继承,抽象类则不能。
②接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类则可以。
③接口在增加新方法后,所有的继承者都必须重构,否则编译不会通过,而抽象类不需要。
应用:
①如果对象存在多个功能相近且关系紧密的版本,则使用抽象类。
②如果对象关系不密切,但是若干功能拥有共同的声明,则使用接口。
③抽象类适合于提供丰富功能的场合,接口则更倾向于提供单一的一组功能。
总结:接口一旦被设计就应该是不变的。而抽象类可以随着版本的升级,增加一些功能。
2.用多态代替条件语句
开闭原则:对扩展开放,对修改关闭。遵从开闭原则的一次重构是,使用多态来规避不断膨胀的
条件语句。
3.使用私有构造函数强化单例
单例:指的是一个类型只生成一个实例对象。
单例注意在多线程情况下,还是可能会产生第二个实例。单例一个著名的技术是“双锁定”技术。采用双锁定技术后,单例的线程安全版本为:
public class SingTon { static SingTon instance = null; static readonly object oLock = new object(); public static SingTon Instance { get { if(instance ==null) { lock(oLock) { instance = new SingTon(); } } return instance; } } }
4.区分静态类和单例
单例是一个实例对象,而静态类不满足这点。静态类直接违反面向对象三大特性中的两项:继承和
多态。静态类无法继承其他类型;也不能让静态类作为参数和返回值进行传递。
本质上讲,在C#中,静态类不会被认作是一个真正的对象。而单例,是一个实例对象,因为特殊需求,他被自己实现为整个系统只有一个对象。
5.用类代替enum
如果对enum有更加多的需求,不妨使用类来代替enum。
public class Week { public static readonly Week Monday=new Week(0); public static readonly Week Tuesday = new Week(1); int type; private Week(int type) { this.type = type; } public override string ToString() { switch(type) { case 0: return "星期一"; case 1: return "星期二"; } return "星期一"; } }
6.避免双向耦合
双向耦合指两个类型之间互相引用。就是A类中引用B,B类中引用A。一般来说,类型之间不应该存在双向耦合,如果出现,则考虑重构。
学以致用,不致用,何学?