这个应用最直接的需求就是: 试验 OpenCV 的算法. 那么最该首要关注的是: 遇到一个新算法, 想加到这个应用上的步骤.
下面简要总结下目前的过程:
- 新建一个 class, 继承 AbstractConvert 类.
- 如果有参数配置, 则重写
initParamsWidget()
方法. 创建参数配置的 UI.
- 重写
applyTo
方法. 将算法逻辑写在里面.
- 增加一个枚举量, 唯一标识此算法.
- 在主页面的
createImageActions
里添加一条 createImageAction
. 绑定枚举与菜单项名称.
- 在 action 对应的 slot 函数中增加工厂逻辑: 在 switch 语句中增加一条 case.
其中 1 ~ 3 比较正常, 完成一个新算法必不可少的两项: 配置参数与算法逻辑.
然而 4, 5, 6 在代码中会显得非常冗长. 每增加一项算法, 因为这三条的原因, 代码长度会增加 3 倍. 如果遇到后期要维护修改, 譬如更改枚举变量名称, 则需要对应着改三处.
由于后期的修改点, 几乎集中在这个流程中. 所以缩减 4 ~ 6 的步骤很有必要. 但无论如何, 创建对象少不了, 增加菜单少不了. 这两者的绑定也少不了.
除此之外, 其实还有一个隐藏的效率要求: 创建对象的过程应该是"动态"的, 即, 只有在点击菜单项的那一刻, 才创建.
最后, 还有一个新需求需要考虑: 不仅需要菜单项, 还需要相对应的工具栏上的工具按钮, 所以还需要多指定一个 icon 名称.