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。一般来说,类型之间不应该存在双向耦合,如果出现,则考虑重构。

  

posted @ 2019-01-02 11:05  不三周助  阅读(347)  评论(0编辑  收藏  举报