开发可维护、易测试和可重用的软件需要全面的物理设计和逻辑设计的知识。物理设计研究组织的问题,超出了逻辑领域的范畴,物理设计很容易影响可测量的特性,例如运行时间、编译时间、连接时间以及可执行文件大小。
一个组件是由一个.c文件和.h文件组成的物理实体,它具体表达了一个逻辑抽象的具体实现。一个组件一般包含一个、两个甚至多个类,已经需要用来支持全部抽象的适当的自由运算符。一个组件(而不是一个类)是逻辑设计和物理设计的适当单位,因为它能够:
1)让若干逻辑实体把一个单一的抽象表现为一个内聚单位;
2)考虑到物理问题和组织问题;
3)在其他程序中选择性地重用编译单元。
一个组件的逻辑接口仅限于指能够被客户程序通过编译访问的部分,而物理接口则包括它的整个头文件。如果在一个组件的物理接口中使用了一个用户自定义类型T,即使T是一个封装的逻辑细节,也可能迫使那个组件的客户程序在编译时依赖T的定义。
组件是自我包含的、内聚的和潜在的可重用的设计单位。在一个组件内部声明的逻辑结构不应该定义在那个组件之外。一个组件的.c文件应该直接包含它的.h文件,以确保.h文件可基于它自己进行语法分析。对于每一个需要的类型定义,都始终包含其头文件,而不是依赖一个头文件去包含另一个,这样,当一个组件允许一个#include 指令从其头文件中被删除时不会出现问题。想要改进可用性、可重用性和可维护性,如果某个带有外部连接的结构没有在一个组件的.h文件声明,那么我们应该避免把该结构放在这个组件的.c文件中。同样的原因,我们应该避免使用局部声明去访问有外部连接的定义。
最后友元关系虽然表面上是一个逻辑关系,但会影响到物理设计。在一个组件内部,(局部的)友元关系是那个组件的一个封装的实现细节。为了改进可用性和用户可扩展性,一个容器类常常会把同一个组件内的迭代器视作友元,不会破坏封装。友元关系只会直接影响访问权限但不会隐含依赖。