精美艺术的美感不仅来源于创造,也来源于规范。编程也是如此。C++是一种大型语言,有充分的空间进行创造。但是,由于设计空间太大,如果没有规范——也就是说设计结构上没有一些适当的约束——大型项目很容易变得难以控制并很难维护。本书将从设计规则、指南和原理三个方面介绍这些约束。
设计规则:经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝不能用于大型项目环境中。断然禁止或无一例外地需要某个特定实践的建议在本书中被称为设计规则。检验是否遵守这些规则不能是一个主观的过程。设计规则必须足够精确、详尽和定义明确,以便客观地检验是否遵守设计规则。为了有效性,设计规则必须适合于自动工具进行非人为的、机械的验证。
指南:经验也告诉我们,有某些做法应该尽可能地避免,这种具有更抽象特性的建议规程称为指南,有时,这些规程有例外情况。指南就像经验法则,除非出现例外的、更令人信服的、工程上的原因,否则必须遵守。
原理:有某些观察和事实在设计过程中经常被证明是有用的,但必须在设计的具体情境中得到评估。这些观察和事实被称为原理。
使不同的独立编程者对软件编码标准取得共识,有相当大的难度。每个程序员都有一系列自己扩展的惯例。我给自己强加的规则比我能和读者分享的规则更多,但是,这些规则主要涉及风格,而不是本质。如果我们对这些规则中的10%达成一致意见,并因此获得90%的实际利益,我们就做得很好了。
本书包含许多建议。在本章中,我介绍了一系列非常基础的设计规则,我称它们为基本规则,并对(我希望是)每一条都进行了解释和证明。起初,读者也许不完全赞同这些基本规则,但是这些规则都已被证明对于非常大型的项目是有效和切实可行的。
我们把设计规则细分成两类:主要和次要。主要设计规则是指那些必须一直遵守的规程。偏离主要设计规则不仅影响所涉及组件的质量,而且很可能会影响系统中其他组件的质量。甚至,偶尔违反这些规则也可能破坏一个大型项目。本书中,我始终认为不能违反主要设计规则。如前所述,不能不意味着绝不。如果特定环境和常识要求违反一个或者多个主要设计规则,那么设计者有义务完全理解和评估他们的行为所隐含的意义和可能的后果。次要设计规则是指那些我们强烈推荐,但对于一个项目的整体成功并不具有决定性的规则——例如只在实现中使用的结构所涉及的问题,这不可能影响其他开发者,而且相对地包含在孤立的实例中,容易解决。严格遵守次要设计规则没有达到至关紧要的地步(不像遵守主要规则会影响项目的成功基础),因为每个次要规则的违反可能只会大量增加项目的成本。
因为我们不希望以工程方面的理由违反任何设计规则(包括主要设计规则和次要设计规则),任何设计规则,如果禁止一种方法,则必须同时提供一个将在所有情况下都可以工作的替代方案。