一、框架设计基础
1、对框架来说,最关键的品质应该是一致性
2、所谓框架,即可重用面向对象程序库
3、框架设计原则:在设计框架时,必须从一组使用场景以及实现这些场景的样例代码开始
4、确保每个主要特性域的命名空间只包含那些用于最常见场景的类型。应该把用于更高级场景的类型放在子命名空间中
5、尽可能提供强类型API;限制抽象的数量;避免把低层API和高层API混在同一命名空间中
二、命名规范
1、除参数名之外的所有标识符,标识符中每个单词的首字母大写
2、避免在标识符的名字中使用首字母缩写词,除非他们是普遍使用的 例:IO、XML (首字母缩写词都要大写)
3、不应该仅仅通过大小写来区分名字
4、为标识符选择易于阅读的名字,看重可读性而不是更看重简短性,不使用下划线和匈牙利命名法
5、不要在标识符中使用单词缩写或首字母缩写词,即使被广泛接受的首字母缩写词,也只应该在必须的时候使用,因为可读性比简短性更为重要
6、避免使用语言特有的名字
7、考虑让派生类的名字以基类的名字结尾
8、要让接口名字以字母I开头
9、要确保一对类/接口的名字只差一个“I”前缀,如果该类是该接口的标准实现
10、不要给枚举类型名字添加“Enum”、“Flag”的后缀
11、不要给枚举类型值的名字添加前缀(把枚举类型名作为前缀)
12、方法名必须是动词或动词词组,属性和类型名是名词或形容词词组
13、命名布尔属性,可以有选择性的给布尔属性添加“Is”、“Can”或“Has”等前缀
14、要用动词或动词短语命名事件,并用现在时和过去时来赋予事件名以之前和之后的概念 例:Closing、Closed
15、要在命名事件处理函数时加上“EventHandler”后缀,如ClickedEventHandler(Object sender, ClickedEventArgs e)
16、要在事件处理函数中用sender和e作为两个参数的名字
17、要在命名事件的参数类时加上“EventArgs”后缀,如15项例子中
18、要用名词或名词短语来命名字段,不要给字段添加前缀,命名字段时使用PascalCasing大小写风格
19、要在命名参数时使用camelCasing大小写风格、使用具有描述性的参数名,根据参数意思而不是根据参数类型来命名参数
三、类型设计规范
1、引用类型在堆上分配,有垃圾回收期管理,而值类型要么在栈上分配在栈展开时释放,要么内联在容纳它的类型中并在容纳它的类型释放时释放,因此值类型的分配与释放开销更低
2、引用类型赋值复制引用,而值类型赋值复制整个值,因此对大的引用类型赋值比大的值类型开销要低
3、考虑定义结构的情况:类型实例比较小且生命周期比较短,或经常被内嵌在其他对象中
4、值类型不能自其它类型继承,但它们可以实现借口,通过定义接口来达到与多重继承相类似的效果
5、命名空间把类型组织成一个相关的特性域的层次结构
6、尽量少用静态类,它仅被用作辅助类,来支持框架的面向对象的核心
7、C#不允许结构有默认构造函数
8、一般来说,尽量少用嵌套类型,想让一个类型能够访问外层类型的私有成员时才使用嵌套类型
9、不要用嵌套类型来进行逻辑分组,应该用命名空间来达到此目的
四、成员设计
1、方法、属性、事件、构造函数以及字段通称为成员
2、成员重载,参数数量或参数类型不同
3、如果两个重载中的某个参数表示相同的输入,那么该参数的名字应该相同,顺序一致
4、要把最长的重载做成虚函数,以便可扩展性,较短的重载应该仅仅调用较长的重载
5、不要在重载参数中使用ref或out修饰符,要允许可选参数为null
6、要把静态构造函数声明为私有,不要在静态构造函数中抛出异常
7、不要提供公有的或受保护的实例字段,应该提供属性来访问字段,而不应该使字段为公有的或受保护的
8、要用常量字段来表示永远不会改变的常量
9、要用公有的静态只读字段来定义预定义的对象实例
10、不要把可变类型的实例赋值给只读字段
五、为扩展性而设计
1、密封类(sealed class)既无法派生子类,也无法扩展。与此相反,非密封类
2、子类可以访问保护成员并覆盖虚成员
六、编程风格约定
1、避免使用块注释语法(/* */)
2、不要把注释放在行尾,除非注释非常短