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())以及值,对象根据其值能否修 ...
随机推荐
- 他学习一年Python找不到工作,大佬都说你别再学Python了!
引言: 都说,滴水穿石非一日之功.然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月.其中缘由,有些人看了大半辈子还没看明白. 即使Python这么火,为何你学习一年的Pytho ...
- testng增加失败重跑机制
注: 以下内容引自 http://www.yeetrack.com/?p=1015 testng增加失败重跑机制 Posted on 2014 年 10 月 31 日 使用Testng框架搭建自动测试 ...
- Windows 使用 Visual Studio 编译 caffe
说明:最近看 caffe 发现在 github 上下载的源码没有windows版本的,需要自己生成项目文件才能用 Visual Studio 编译,这里记录一下生成Windows项目文件的方法以及编译 ...
- 《The java.util.concurrent Synchronizer Framework》 JUC同步器框架(AQS框架)原文翻译
一.论文简介 闲来无事,看看源码,发现了一篇JDK作者的论文<The java.util.concurrent Synchronizer Framework>主要描述了作者对Abstrac ...
- 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引
先说背景,由于本人工作需要创建很多小应用程序,而且在微服务的大环境下,服务越来越多,然后就导致日志四分五裂,到处都有,然后就有的elk,那么问题来了 不能每个小应用都配置一个 logstash 服务来 ...
- ISCC2018(最新的考核解析)
最近一直在做这个 ISCC2018,感觉可能自己只是一个新手吧!但是我会继续努力的,希望我的解题思路能够给你们带来一定的想法,我也希望自己能够在安全方面遇到更多志同道合的人! 其它题目可以看这里 1 ...
- python-----HTMLTestRunner报告生成注意点!
简单的测试加HTMLTestRunner使用的具体方式如下:
- Windows环境下消息中间件RabbitMq的搭建与应用
前言 消息中间件目前已经在很多大型的项目上得到了运用,我们常见的有 RabbitMq, activitymq,kafka,rocketmq,其中rocketmq是阿里自己在kafka的基础上用java ...
- 使用Rotativa在ASP.NET Core MVC中创建PDF
在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rotativa工具已经可用,我们可以使用 ...
- 为什么VUE注册组件命名时不能用大写的?
这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...