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();
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# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计的更多相关文章
- C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇
题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...
- C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计
1.可以字段应该重构为属性 2.谨慎将数组或集合作为属性 数组和集合作为属性存在会引起这样的一个分歧:如果属性是只读的,我们通常会认为他是不可改变的.但是如果将只读属性应用于数组和集合,而元素的内容和 ...
- C# 《编写高质量代码改善建议》整理&笔记 --(六)编码规范及习惯
一.命名规范 1.考虑在命名空间中使用复数 System.AllCollections System.TheCollection 2.用名词和名词组给类型命名 ScoreManager UserCon ...
- C# 《编写高质量代码改善建议》整理&笔记 --(三)泛型&委托&事件
1.泛型 基于泛型,我们可以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型, 确保类型安全. 1)总是优先考虑泛型 优点:可重用性,类型安全,高效率. 2)避免在泛型 ...
- C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化
1.显示释放资源需继承接口IDisposable 什么是资源:C#中每一个类型都代表一种资源,而资源又分为以下两类. 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 ...
- 编写高质量代码改善C#程序的157个建议——建议149:使用表驱动法避免过长的if和switch分支
建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tue ...
- 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串
最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码--改善python程序的建议(六)
原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...
随机推荐
- celery学习笔记2
1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部分 (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代 ...
- Python模拟登陆万能法-微博|知乎
Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅 ...
- 【codeforces 718E】E. Matvey's Birthday
题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串 ...
- awk的递归
想来惭愧,之前写的一篇文章<用awk写递归>里多少是传递里错误的信息.虽然那篇文章目的上是为了给出一种思路,但实际上awk是可以支持函数局部变量的. awk对于局部变量的支持比起大多数过程 ...
- 【毕业原版】-《伦敦艺术大学毕业证书》UAL一模一样原件
☞伦敦艺术大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- Java I/O流详解与应用(二)
I/O流(二) 一.缓冲流(缓冲区): 特点:本身没有读写的能力,需要借助普通的读写流进行读写,但可以加快读写的效率 分类:字符缓冲流:BufferedReader(读),BufferedWriter ...
- tomcat7支持https配置
基本环境:centos7.0 jdk1.8 tomcat7 1.下载tomcat,解压到指定目录 例如:/home/test/apache-tomcat-7.0.81 2.生成证书 首先进入J ...
- Java关于static的作用
概述 只要是有学过Java的都一定知道static,也一定能多多少少说出一些作用和注意事项.如果已经对static了如指掌的请点击关闭按钮,看下去也只是浪费您宝贵时间而已.这篇随笔只是个人的习惯总结. ...
- Supervisor守护DotNet Core控制台程序
Supervisor 相信对Linux系统很熟的都知道这个软件,基于Python写的一个守护进程软件.具体的介绍和使用我就不再赘述了. 使用asp.net core 部署在Linux常用的方法 我们可 ...
- Asp.net Core 2.2关于AutoMapper更初级的入门教程
今天刚看到老张的哲学博客关于AutoMapper的教程,从壹开始前后端分离[ .NET Core2.0 +Vue2.0 ]框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完 ...