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();
public static readonly Week Tuesday = new Week(); int type;
private Week(int type)
{
this.type = type;
} public override string ToString()
{
switch(type)
{
case :
return "星期一";
case :
return "星期二";
}
return "星期一";
}
}

6.避免双向耦合

  双向耦合指两个类型之间互相引用。就是A类中引用B,B类中引用A。一般来说,类型之间不应该存在双向耦合,如果出现,则考虑重构。

  

C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计的更多相关文章

  1. C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇

     题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...

  2. C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计

    1.可以字段应该重构为属性 2.谨慎将数组或集合作为属性 数组和集合作为属性存在会引起这样的一个分歧:如果属性是只读的,我们通常会认为他是不可改变的.但是如果将只读属性应用于数组和集合,而元素的内容和 ...

  3. C# 《编写高质量代码改善建议》整理&笔记 --(六)编码规范及习惯

    一.命名规范 1.考虑在命名空间中使用复数 System.AllCollections System.TheCollection 2.用名词和名词组给类型命名 ScoreManager UserCon ...

  4. C# 《编写高质量代码改善建议》整理&笔记 --(三)泛型&委托&事件

    1.泛型 基于泛型,我们可以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型, 确保类型安全. 1)总是优先考虑泛型 优点:可重用性,类型安全,高效率. 2)避免在泛型 ...

  5. C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化

    1.显示释放资源需继承接口IDisposable 什么是资源:C#中每一个类型都代表一种资源,而资源又分为以下两类. 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 ...

  6. 编写高质量代码改善C#程序的157个建议——建议149:使用表驱动法避免过长的if和switch分支

    建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tue ...

  7. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  8. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  9. 编写高质量代码--改善python程序的建议(六)

    原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...

随机推荐

  1. BloomFilter——大规模数据处理利器

    Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一.实例 为了说明Blo ...

  2. CentOS 7.2 关闭防火墙

    CentOS7 的防火墙配置跟以前版本有很大区别,CentOS7这个版本的防火墙默认使用的是firewall,与之前的版本使用iptables不一样 1.关闭防火墙: systemctl stop f ...

  3. Python Assert 为何不尽如人意

    Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. >>> assert 1 + 1 == 2 >>> ass ...

  4. Spider与OpenPyXL的结合

    OpenPyXL的API文档 1.OpenPyXL基础操作 引入Workbook这个类,然后调用 from openpyxl import Workbook wb = Workbook() 通过ope ...

  5. int i=0;i=i++

    package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { In ...

  6. Guava新增集合类型-Multimap

    Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...

  7. 【Floyd】BZOJ1491: [NOI2007]社交网络

    Description   Solution n<=100自然联想Floyd 设两个数组d[n][n]存最短距离,t[n][n]存最短路径条数 更新d的时候顺便更新t,乘法原理 if(d[i][ ...

  8. 权限系统与RBAC模型概述[绝对经典]

    0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的逻辑设计出了一套权限管理模型,基本原理与RBAC非常相似,只是过于简陋.当时google了一些权限管理的资料,从中了解到早就有了RBA ...

  9. AngularJs parent index

    AngualrJs ng-repeat使用 $parent.$index 当时用ng-repeat的时候在其子原属中可以使用$parent.$index获取父级下标,当没有没有多一级的ng-if,一般 ...

  10. 使用jquery 的ajax 与 Java servlet的交互

    由于是使用jquery的 所以别忘记导入jq 下面是jsp文件 <%@ page language="java" contentType="text/html; c ...