模块化设计

行人识别算法的具有一定的复杂度,在设计系统框架时要处理好以下问题:

  • 单一职责原则
  • 里氏替换原则
  • 依赖倒置原则
  • 接口隔离原则
  • 迪米特法则
  • 开闭原则

单一职责原则

**定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

**实现:**对系统功能模块化,每个模块只负责自己的功能。

里氏替换原则

**定义:**如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化。

**实现:**定义存储函数接口的结构体,在结构体中定义函数接口。不同的模块提供一个构造函数,在构造函数中申明接口实现并返回该结构体。针对不同的实现只需要将结构体中的函数接口指向不同的实现,上层模块的调用不会有感知。

依赖倒置原则

**定义:**高层模块不应该依赖低层模块,且都应该依赖其抽象。

**实现:**高层模块定义接口,底层模块按照接口设计其实现。高层模块通过对象工厂拿到底层模块的实例,不需要依赖底层模块的头文件。

接口隔离原则

**定义:**客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

**实现:**采用多层模块的方式,对内允许模块定义自己的子模块,对外定义统一的操作接口,最小化模块的任务。

迪米特法则

**定义:**一个对象应该对其他对象保持最少的了解。

**实现:**在设计检测引擎的时候,引擎只关注于其定义好的四个子模块,不关心子模块的内部实现。子模块在自己的构造函数中完整自己的初始化。

开闭原则

**定义:**一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

**实现:**在ROI模块中,为避免其他模块存储数据依赖ROI的问题,为ROI模块设计了存储注册机制。遵循先注册后存储的过程,避免对ROI模块的修改。

模块设计的过程

  1. 解耦
  2. 定义接口,标准化代码逻辑
  3. 去除头文件依赖