您的位置:首页 > 编程语言 > C语言/C++

C++ 大规模程序设计 之 组件

2015-07-01 08:07 239 查看

概述

组件是物理设计中的最小单位。

它主要的想法是把一定数量的内聚功能组织在一个物理的单元中,以达到轻松部署,轻松复用的目的。

物理组件可能会包含一个或多个逻辑组件,也有可能会跨越多个类。但这些逻辑组件或类一定是在功能上内聚的。



图中DrawShap.dll 为一个组件,它的内部其实包含了多个类。

关于组件的定义

规则 1: 一个组件中声明的任何逻辑结构,如果定义了,则应该全部定义在该组件内部。

图中为一个不妥当的做法:Class A 的实现分别放在了A.cpp和Main.cpp中,如果想要把A独立出来作为一个单独的组件对外提供服务的话,Main.cpp也会受到影响。



规则 2:每个组件的 .c/.cpp文件都应该将include 自己 .h文件的有效语句作为第一行。

这个规则看似是一种形式上的要求,它的主要目的是检查当前代码中是不是有外部的声明或定义,或者声明中是否有遗漏,从而保证组件的相对的独立性。如果仅仅改变一行代码的位置就可以让系统替我们进行检查,简单高效,何乐而不为了。

规则 3:在一个组件的 .c文件中,避免使用有外部连接并且没有在相应的.h文件中明确声明的定义。

辅以图示,一个不好的例子



A中使用了B中的一个函数: TestingB(),但这个函数并没有声明在B的头文件中,这是规则3主要描述的场景。如果仅从头文件引用来看,这里无法看出A与B间存在着关系,但此时在另一模块中单独复用A,编译时就会被告知TestingB()不知道哪里去了,在大规模的程序中烟波浩渺,找这种错误着实令人非常的恼火。

组件间的依赖

组件的存在是为了更好的对外提供服务,组件间的依赖也是定义组件要考虑的非常重要的问题。

一些简单的概念

如果编译x.c 文件时需要用到y.h那么x.c对于y.h有一个编译时依赖

如果生成对象文件x.o时需要y.o时,那么x.o对于y.o有依赖链接时依赖

一个编译时依赖通常隐含着一个链接时依赖。

依赖具有传递关系。

规则 1:提取依赖关系。

这一条本质上不能算是一个严格的规则,它是一个很好的建议,通过划分出逻辑上的依赖关系,可以整理出物理上各个组件的依赖关系,从而划定系统个部分的边界,能够使整个设计更加的合理。

规则 2:注意友元关系对组件的影响。

友元本身属于逻辑设计上的范畴,但不能忽视它对组件的影响。它会影响把逻辑结果收集到物理组件的方式。甚至导致重构逻辑设计。基本的原则是尽量避免把远距离的友元关系定义在另一个组件的逻辑关系中。当然有时不可避免的会破坏这样的原则,但好在友元关系并不会造成隐含依赖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: