NET设计规范三:类型和类型成员设计的约定和惯用法

继续上两篇未完成的工作 → ① .NET设计规范一:设计规范基础  ② .NET设计规范二:类型成员设计

  上两篇主要是说了类型和类型成员在命名上的规范,对它们的具体设计还没有涉及到,这篇文章是从一个普通开发人员的角度理解,会有很多不足之处,希望能得到大家的指点!

  首先说一下本文只是借助书本做的一些小结,大牛(架构师)们请不要喷我,如果实在憋不住,那就是使劲的喷吧,在喷中成长!

  4.类型设计的约定和惯用法

    4.1类和接口的选择

      ①应该优先使用类

      首先类是用于暴露抽象的优先选择!

      微软开发人员提供给我们的方案是:定义一个接口,然后再定义一个抽象基类实现这个接口!

 1     public interface IComponent  //这是.NET Framework中比较突出的案例
 2     {
 3         void GetID();
 4     }
 5 
 6     public class Component:IComponent
 7     {
 8         public void GetID()
 9         {
10             // To Do.
11         }
12     }

      ②要用抽象类而不是接口来解除协定与实现之间的耦合

      ③如果需要定义一个多态的值类型层次结构的话,要定义一个接口

1     public struct Int32 : IComparable, IFormattable, IConvertible
2     {
3         
4     }
5     public struct Int64 : IComparable, IFormattable, IConvertible
6     {
7 
8     }

      ④考虑使用接口来实现多重继承

        Note:定义一个接口的标志就是它只做一件事。  

    4.2抽象类的设计  

      优点:

      ①灵活性比较大

      ②能通过继承扩展功能

      ③可以对抽象类中的虚方法和抽象方法实现重写达到功能扩展

      设计:

      ①抽象类中的构造函数修饰符因为为“protected”或者为“interal”,不过大多数情况都是“protected”

      ②定义好的抽象类必须要有类去继承它,而不能让它成为孤家寡人,这样有助于验证抽象类的有效性

1     public abstract class Animal
2     {
3         protected Animal()
4         {
5         }
6     }

     4.3接口的设计

      ①接口可以支持多重继承

      ②避免使用记号接口(也就是无成员的接口)

      ③要为接口提供实现的类型,跟上面抽象类一样,不要成为孤家寡人

      ④在大型项目开发中,都会提供一系列的接口供外部调用(这也是设计接口的场景之一)

      ⑤接口一旦定义就不能做改动了

    4.4静态类的设计

      ①尽量少自定义静态类,如果设计的静态类有一种辅助的效果,那么就应该定义一个这样的静态类,如.NET Framework中的“File”类,一种文辅助类

      ②不要在静态类中声明或覆盖实例成员

      ③要把静态类定义为密封的,抽象的,并添加一个私有的构造函数

    4.5结构的设计

      ①不要为结构提供默认的构造函数

      ②一般来说自定义的结构类比较少

    4.6枚举的设计

      ①要用枚举来加强那些表示值的集合的参数,属性或者返回值的类型型

      ②要优先使用枚举而不要使用静态变量

        比如:在定义一些颜色属性的时候,使用枚举是最好的选择。

      ③不要提供为了今后使用的枚举值

      ④不要定义枚举中只有一个值,如果只有一个那还不如定一个常量呢!

      ⑤要为简单的枚举提供“0”值,详细理解“0”值请看 → 从枚举的初始化说起 [C#]

1     public enum Color
2     {
3         Red = 0,  //这是一种规范
4         Yellow = 1,
5         Black = 2
6

      ⑥考虑用“Int32”类型数值作为枚举值的值

      ⑦要使用复数名词或名词词组命名“标记枚举”,用单数名词或名词词组命名简单枚举

    4.7标记枚举

      标记枚举提供对枚举值的位操作!

      ①必须要加上“[Flags]”标志特性

      ②要用2的幂次方作为标记枚举的值(其实这个规则不怎么明白,不过这确实是一个很重要的规范)

1     [Flags]
2     public enum MyEnumTypes
3     {
4         Created = 0x0002,
5         Updated = 0x0004,
6         Deleted = 0x0008
7     }

       ③在合适的情况下要为标记枚举提供特殊的枚举值,也就是组合枚举

1     [Flags]
2     public enum FileAccess
3     {
4         Read = 1,      //这边定义的“int”型的枚举值跟上面使用2的幂次方作为枚举值没有冲突,我们应该在以后的开发中使用2的幂次方作为枚举值
5         ReadWrite = 3,  //提供一个组合值,或者这样 →  ReadWrite = Read | Write
6         Write = 2
7     }

       ④不要定义无效的枚举值

 

  5.成员设计

    5.1方法的重载

      ①避免在重载的时候随意给参数名,应该保持参数名的一致性

      

      ②避免打乱参数的顺序,在多个重载中保持参数顺序的一致性

      ③要把最长的重载做成“虚方法”,这样有助于派生类的重写,增强了扩展性

      ④不要在重载成员中使用“ref”或“out”参数

 1     public class My
 2     {
 3         public void MyOne(string name)
 4         {
 5             MyOne(name, 0);
 6         }
 7 
 8         public void MyOne(string name, int age)
 9         {
10             MyOne(name, age, "");
11         }
12 
13         public virtual void MyOne(string name, int age, string address)
14         {
15 
16         }
17     }

      ⑤要允许引用类型的参数可为“null”,不过需要在方法中对“null”值进行判断

    5.2显式和隐式实现接口

      ①避免显式实现接口

        感觉这个规范在“迭代器”中的运用还是比较多的,可以参照这篇文章:程序猿个人文章目录索引中的迭代器系列

        说实话这个话题我也不敢讲多少,因为我自己对它本质的东西理解的好不够深入,所以就泛泛的说几句!

    5.3属性和方法的选择

      ①属性侧重于数据的体现,而方法侧重于操作,不过话说两者的性能不是很多(虽然书上也讨论过两者性能差异,但是可以忽略不急)

      ②建议多使用属性,如果定义够多的属性,那么相应的就要为属性定义同等的私有变量,也就是对变量的封装

      ③避免方法中参数过多,如果太多建议使用属性来减少方法重载

      ④需要使用方法的一些通用情况

        I,该操作是一个转化操作,如:ToString()方法

        II,该操作每次返回的结果不一样,如:Guid.NewGuid()

        III,该操作返回的是一个数组或集合(这个情况还是蛮实用的)

      ⑤所以说使用属性是它只代表简单的数据操作,过于复杂的操作应该使用方法来完成 

    5.4索引器的设计

      个人理解:索引器就是对集合以及数组的封装!

      索引器可以是单个索引也可以是多个索引,索引器是附加在类级别上的,所以它才使用“this”关键字的,在前面一文中也简单的介绍了这方面的知识!

      ①避免使用一个以上参数的索引器

    5.5构造函数设计

      有两种构造函数:类型构造函数和实例构造函数

      类型构造 → 也就是静态构造函数,必须为静态的,在进行初始化的时候是第一个执行的!

      ①必须为私有构造(编译器会强制规定的)

      ②不要在类型构造中抛出异常

      实例构造 → 也就是普通的构造

      ①考虑提供简单的构造函数,可以默认构造函数

      ②如果使用构造函数重载,那么构造函数的参数作用应该设置为主要属性,而不是“可有可无”的参数

      ③要在构造函数做最少的事

      ④如果要使用构造函数重载,需要提供一个空构造,这样就不会破坏依赖于空构造的类型成员

    5.6事件的设计

      关于事件定义的基本规范可以参考前一篇的文章!

      ①要使用系统自定义的委托 →  EventHandler<T> (可以说这是个通用规范把)

      ②考虑把事件的处理方法设置为虚方法,这样派生类就可以重写,提高扩展性

      如果想深入理解推荐几篇文章:C#委托和事件(2) ,浅谈C#中常见的委托C# 中的委托和事件

    5.7字段的设计

      ①不要提高公共的或受保护的实例字段

      ②要使用属性来访问字段,这样跟直接访问字段是一样的

      ③要用常量字段来表示永远不会改变的常量,大家可以找点资料理解下“const”和“readonly”的差异

      ④不要把可变类型的实例赋值给只读字段

      ⑤要用公有的静态只读字段来定义预定义的对象实例(这个个人理解起来有点不懂)

      

 

  好了就写这么多了,感觉好累,因为本人不是啥架构师,是个小菜鸟(这是从我这个角度看问题的,高度还没有上升上去),写这些东西也是模仿书上的,算是一点小总结,不能算经验的!

  如有问题还请大家多多指教!

 

转载:

http://www.cnblogs.com/yangcaogui/archive/2012/04/24/2461490.html

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **规遵从**:需遵循国家和地区的相关规,如信息安全、数据保护和环境保护等,确保数据中心的合运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值