模块化设计
行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题:
- 单一职责原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 迪米特法则
- 开闭原则
单一职责原则
**定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
**实现:**对系统功能模块化,每个模块只负责自己的功能。
里氏替换原则
**定义:**如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化。
**实现:**定义存储函数接口的结构体,在结构体中定义函数接口。不同的模块提供一个构造函数,在构造函数中申明接口实现并返回该结构体。针对不同的实现只需要将结构体中的函数接口指向不同的实现,上层模块的调用不会有感知。
依赖倒置原则
**定义:**高层模块不应该依赖低层模块,且都应该依赖其抽象。
**实现:**高层模块定义接口,底层模块按照接口设计其实现。高层模块通过对象工厂拿到底层模块的实例,不需要依赖底层模块的头文件。
接口隔离原则
**定义:**客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
**实现:**采用多层模块的方式,对内允许模块定义自己的子模块,对外定义统一的操作接口,最小化模块的任务。
迪米特法则
**定义:**一个对象应该对其他对象保持最少的了解。
**实现:**在设计检测引擎的时候,引擎只关注于其定义好的四个子模块,不关心子模块的内部实现。子模块在自己的构造函数中完整自己的初始化。
开闭原则
**定义:**一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
**实现:**在ROI模块中,为避免其他模块存储数据依赖ROI的问题,为ROI模块设计了存储注册机制。遵循先注册后存储的过程,避免对ROI模块的修改。
模块设计的过程
- 解耦
- 定义接口,标准化代码逻辑
- 去除头文件依赖