那些年,我们应该读的书 一、《NET设计规范-.NET约定、惯用法与模式》

1. 命名

          System.Attribute 添加“Attribute”后缀;

          System.Delegate 用于事件处理的委托,添加“EventHandler”后缀;

                                                       用于事件处理处的那些委托,添加“Callback”后缀;

          System.EventArgs 添加“EventArgs”后缀;

          System.Exception 添加“Exception”后缀;

           Enum不要加前/后缀。

 

在程序集与名字空间、DLL中加入公司名字的前缀。

,一般为名词或名词的词组,命名。如果你的类无法这样起名,那你可以考虑一下你的类的设计了。

方法,一般为动词或动词的词组。

属性,用名词、名词的词组或形容词,命名。布尔属性要加入”IS”、”CAN”、”HAS”等前缀。

事件,与方法差不多,可以加入时态作为后缀,不要加入Before,After等为前缀。当作为事件的委托时加入后缀“EventHandler”,参数一般用(Sender,e等)

参数,camelCasing风格,命名的意思要可读,不要使用类型。

资源,PascalCasing风格,其它与属性相似。

(P66 3-14 20:14电业局4楼)

那一夜梦见了,失去了工作(那是我工作了6年的单位)。可能是因为前不久公司有3位同事接二连三的辞去了工作的原因吧。在和其中一位同事交流的过程中,他的一句话深深的触动了我,“当时我眼含着热泪,递交了辞呈。百感交集,更多的是对未来的不确定性和对这熟悉环境的永别。”我的同学、同事、朋友、兄弟,走好,祝你大展宏图。

1)     类与接口的选择

接口没有类灵活,一旦发布了,它的成员就永远固定了。类更灵活些,即使发布了也可以添加成员。(只要不是添加的抽象方法,如果是也要加上默认的实现。)任何已有的派生类无需改变仍能继续使用。

在C#中类只能单一继承,接口可以多继承。

Think:

如果想在一个已公开的接口中加入一些方法,为了不损坏子类中已继承了此接口的类,如何实现?

只能用一个新的接口去继承现有接口,在新接口中完成新方法的实现。

但是对于已实现老接口的类,想用到新的方法,就十分痛苦。会用到动态类型的转换,这样就会出现许多难以预知的异常。

e.g.

         1.以发布的接口

         publicinterface IStream {...}

         publicclass FileStream : IStream {...}

        

         2.在接口中加入新的方法

         publicinterface ITimeoutEnableStream : IStream{

                   intReadTimeOut {get;set;}

         }

         publicclass FileStream : ITimeoutEnableStream{

                   publicint ReadTimeOut{ get{...} set{...} }

         }

         3.已有类中实现新方法(ReadTimeOut)

         publicclass StreamReader{

                   publicStreamReader( IStream stream){ ... }

                   publicIStream BaseStream{ get{ ... } }

         }

         //---实现新功能---

         StreamReaderreader =GetSomeReader();

         ITimeoutEnableStreamstream = reader.BaseStream as ITimeoutEnableStream;

         if (stream !=null ){ stream.ReadTimeOut = 100;

          }//---繁琐、易错---

          

          4.如果以前不是接口而是类,在基类中加入新的方法,实现就方便的多了

          StreamReader reader = GetSomeReader ();

          if( reader.BaseStream.CanTimeout){

                   reader.BaseStream.ReadTimeOut= 100;

         }

         JEFFERYRICHTER:

         建议,先定义一个接口,然后定义一个实现该接口的抽象基类。用接口与对象进行交流,让最终的开发人员自己决定是基于你的抽象基数定义自己的类型(为了方便),还是基于他们想要的任何基类来定义自己的类型并实现该接口(为了灵活性)。

         CHRISANDERSON:

         如果你确实要定义2个对象间的协定,且协定不会随着时间而改变,那么接口非常合适。

         如果要为一族类型定义一个公共基类,那么抽象基类会更好。

        

         (P81 4-25 19:00电业局4楼)

什么时候用接口?

如果要提供一个多态的值类型层次结构的话,使用接口吧。

值类型不能自其它类型继承,但它可以实现接口。

考虑通过定义接口来达到与多重继承相类似的效果。

public struct Int32 : IComparable , IFormattable , IConvertible , IComparable<int> , IEquatable<int>

接口名以“er”结尾,最好。

接口最好只做一种功能的事情,否则你会后悔的。

JEFFREY RICHTER:当一个类派生自一个基类时,我说派生类与基类之间有IS-A关系。但是,当一个类实现一个接口时,我说实现接口的类与接口之间有CAN-DO关系。例,

public class FileStream : Stream

public abstract class Stream : MarshalByRefObject , IDisposable

public interface IDisposable

 

抽象类的设计

不要在抽象类型中定义仅有的构造函数。(抽象类本就不能实例,定义为公有的只能导致麻烦。)

BRAD ABRAMS:如果你自己没有定义构造函数的话,许多编程语言(C#)会插入一个受保护的构造函数。在源代码中显式地定义构造函数是很好的做法,这样一来今后对源代码的归档和维护都会更容易。

 

静态类的设计

静态类被定义为一个只包含静态成员的类。它是密封的、抽象的,不能覆盖或声明任何实例成员。public static class File

静态类,尽量少用、目的一定要明确、不要声明或覆盖实例成员。

静态类相当于一个sealed abstract,主要的一个优点是写在栈中,安全高速稳定,而且在执行的时候,十分优先。

类可以声明为 static 的,以指示它仅包含静态成员。不能使用 new关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework公共语言运行库 (CLR;特指:C#语言)自动加载。

Think:静态类与静态方法一样,不能实例化就可以使用。

JEFFREY RICHTER:结构静态是无用的,因为无论如何都能被实例化。只有类可以是静态的。

 

接口的设计

Think:一个类只能有一个基类(一般是名词如,人),但这个类可以有许多接口(一般是动词如,看、走、工作)。人只有一个父亲,但都可以看、走、工作。

要定义接口,如果你需要包括值类型在内的一组类型支持一些公共的API

考虑定义接口,如果你需要让已自其它类型继承的类型支持该接口提供的功能。

要为你定义的每个接口提供至少一个使用该接口的API(一个以该接口为参数的方法,或是一个类型为该接口的属性。)

不要给已发行的接口再添加成员。

(P88 6-4 23:00出租屋内)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清晰完整PDF版本,第二版,清晰完整。 .NET设计规范约定惯用模式(第2版)克瓦林纳 2/5 .NET 设计规范 约定惯用模式 第2版 克瓦林纳 定 价:69.00元 作  者:(美)克瓦林纳 等著,葛子昂 译 出 版 社:人民邮电出版社 出版时间:2010-5-1 页  数:370 字  数:579000 I S B N:9787115226518 -------------------------------------------------------------------------------- 数千名微软精锐开发人员的经验和智慧,最终浓缩在这本设计规范之中。与上一版相比,书中新增了许多评注,解释了相应规范的背景和历史,从中你能聆听到微软技术大师Anders Hejlsberg、Jeffrey Richter和Paul Vick等的声音,来令人兴味盎然。   本书虽然是针对.NET平台上的框架设计的,但对其他平台的框架设计同样具有借鉴意义。新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。   本书提供配套光盘,内含Designing .NET Class Libraries等13个演讲视频。此外,光盘还包括.NET Framework类和组件设计指南、API规范样例以及其他有用的资源和工具。 :数千名微软精锐开发人员的经验和智慧,最终浓缩在这本设计规范之中。与上一版相比,书中新增了许多评注,解释了相应规范的背景和历史,从中你能聆听到微软技术大师Anders Hejlsberg、Jeffrey Richter和Paul Vick等的声音,来令人兴味盎然。   本书虽然是针对.NET平台上的框架设计的,但对其他平台的框架设计同样具有借鉴意义。新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。   本书提供配套光盘,内含Designing .NET Class Libraries等13个演讲视频。此外,光盘还包括.NET Framework类和组件设计指南、API规范样例以及其他有用的资源和工具。 作者简介 -------------------------------------------------------------------------------- Krzysztof Cwalina 微软公司.NET Framework开发组项目经理。他为.NET Framework设计了多个API,还开发了FxCop等框架开发工具。目前,他正致力于在微软内部开发推广设计规范,将其应用到.NET Framework中,同时负责核心.NET Framework API的交付。 :Krzysztof Cwalina 微软公司.NET Framework开发组项目经理。他为.NET Framework设计了多个API,还开发了FxCop等框架开发工具。目前,他正致力于在微软内部开发推广设计规范,将其应用到.NET Framework中,同时负责核心.NET Framework API的交付。 目录 -------------------------------------------------------------------------------- 第1章 概述  1.1 精心设计的框架所具备的品质   1.1.1 精心设计的框架是简单的   1.1.2 精心设计的框架设计代价高   1.1.3 精心设计的框架充满利弊权衡   1.1.4 精心设计的框架应该借鉴过去的经验   1.1.5 精心设计的框架要考虑未来发展   1.1.6 精心设计的框架应具有良好的集成性   1.1.7 精心设计的框架是一致的 第2章 框架设计基础  2.1 渐进框架  2.2 框架设计的基本原则   2.2.1 围绕场景进行设计的原则   2.2.2 低门槛原则   2.2.3 自说明对象模型原则 显示全部信息 :第1章 概述  1.1 精心设计的框架所具备的品质   1.1.1 精心设计的框架是简单的   1.1.2 精心设计的框架设计代价高   1.1.3 精心设计的框架充满利弊权衡   1.1.4 精心设计的框架应该借鉴过去的经验   1.1.5 精心设计的框架要考虑未来发展   1.1.6 精心设计的框架应具有良好的集成性   1.1.7 精心设计的框架是一致的 第2章 框架设计基础  2.1 渐进框架  2.2 框架设计的基本原则   2.2.1 围绕场景进行设计的原则   2.2.2 低门槛原则   2.2.3 自说明对象模型原则   2.2.4 分层架构原则  2.3 小结 第3章 命名规范  3.1 大小写约定   3.1.1 标识符的大小写规则   3.1.2 首字母缩写词的大小写   3.1.3 复合词和常用术语的大小写   3.1.4 是否区分大小写  3.2 通用命名约定   3.2.1 单词的选择   3.2.2 使用单词缩写和首字母缩写词   3.2.3 避免使用编程语言特有的名字   3.2.4 为已有API的新版本命名  3.3 程序集和DLL的命名  3.4 名字空间的命名  3.5 类、结构和接口的命名   3.5.1 泛型类型参数的命名   3.5.2 常用类型的命名   3.5.3 枚举类型的命名  3.6 类型成员的命名   3.6.1 方的命名   3.6.2 属性的命名   3.6.3 事件的命名   3.6.4 字段的命名  3.7 参数的命名  3.8 资源的命名  3.9 小结 第4章 类型设计规范  4.1 类型和名字空间  4.2 类和结构之间的选择  4.3 类和接口之间的选择  4.4 抽象类的设计  4.5 静态类的设计  4.6 接口的设计  4.7 结构的设计  4.8 枚举的设计   4.8.1 标记枚举的设计   4.8.2 给枚举添加值  4.9 嵌套类型  4.10 类型和程序集元数据  4.11 小结 第5章 成员设计 第6章 扩展性设计 第7章 异常 第8章 使用规范 第9章 常用的设计模式 附录A C#编程风格约定 附录B 通过FxCop来实施设计规范 附录C API规格书样例 术语表 推荐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值