Zero Lee的专栏

关于C++中一些基本设计规则和指导方针

   C++是一种大型语言,为更大的设计空间开辟了道路。这里提供一些基本设计规则和指导方针,它们被证明是非常有用的。
   主要设计规则被认为是绝对不能违反的。甚至偶尔的违反也可能危及大型系统的完整性。
   次要设计规则也被认为是遵守的,但也许不必严格地遵守。在一个隔离的实例中违反一个次要规则不大可能产生严重的全局性影响。
   指导方针是作为经验法则提出来的,因此必须遵守,除非有强制性的工程方面的原因要求遵守别的原则。

   把一个类的数据成员暴露给其客户程序违反了封装原则。提供对数据成员的非私有访问意味着表示上的局部改变可能迫使客户重新编写代码。此外,由于允许对数据成员进行可写访问,无法阻止偶尔误用导致数据处在不一致的状态。保护的成员数据像公共成员数据一样,无法限制 因数据改变而可能影响到的客户的数量。

   全局变量会污染全局名称空间,而且会歪曲设计的物理结构,使得实际上不可能进行独立的测试和有选择的重用。在新的C++项目中没有必要使用全局变量。我们可以通过将变量放置在一个类的作用域中作为私有静态成员、并提供公共静态成员函数访问它们的方法来系统消除全部变量。但是,对这种模块的过度依赖是一种不良设计的症状。

   自由函数,特别是那些不在任何用户自定义类型上操作的函数,在系统集成时很可能与别的函数冲突。将这样的函数嵌套在类作用域中作为静态成员基本上可以消除冲突的危险。

   枚举类型、typedef以及常量数据也可能威胁全局名称空间。通过将枚举类型嵌套在类作用域中,任何二义性都可以通过作用域解析来消除。一个在文件作用域中的typedef看起来有点像类,但是在大型项目中急难发现。通过将typedef嵌套在类作用域中,他们就变的相对容易追踪。一个在头文件中定义的整数常量,其最好的表达方式通常是通过在类作用域中的一个枚举值来表达。其它常量类型可以通过使它们成为某个类的静态常量成员来限定其范围。

   预处理宏对于人和机器来说都难以理解。由于宏不是C++的一部分,所以宏不遵守作用域约束,并且,如果将宏放置在一个头文件中,宏可能与系统中的任何文件的任何标识符冲突。因此,宏不应该出现在头文件中,除非是作为包含卫哨。

   总的看来,我们应该避免在一个头文件的文件作用域中引入除了类、结构、联合和自由运算符之外的任何东西。当然,我们允许在头文件中定义内联成员函数。

   一个定义被包含两次会引起编译时错误。因为大多数C++头文件包含定义,我们有必要防止再收敛包含图的可能性。在一个头文件中,用内部包含卫哨围绕定义可以确保每个头文件的内容在任何一个编译单元中最多被加入一次。

   冗余(外部)包含卫哨虽然不是一定必需的,但是它可以确保我们避免编译时的二义包含行为。通过用冗余卫哨围绕头文件的包含指令,我们可以确保每个编译单元最多两次打开一个头文件。

   良好的文档是软件开发必不可少的一部分。缺少文档将降低可用性。文档的一个重要部分是声明什么是没有定义的。否则,客户可能会依赖巧合的行为,这种行为只能来自特定的实现选择。
   

posted on 2007-01-14 15:45 Zero Lee 阅读(488) 评论(0)  编辑 收藏 引用 所属分类: CC++ Programming


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理