嵌入式开发中的抽象、封装与继承
## 1 何从实现?
OOP 是 CPP 的显著特征,尽管它是一种多重范式的语言
第一部分谈的是产品的实现(implement)而非产品的设计,因为对于个人开发者而言,往往是知道如何实现产品,而后才着手做整体设计的。这并不是说实现高于设计,而是承认此类开发者的首要驱动力通常不是用户需求,而是尝试新事物的热情。
对新事物的尝试是以一些原则为基础的。从一年级学习电路原理开始,基尔霍夫定律指导下的‘前后级独立’的分析原则就印刻在每个电子/控制/仪器专业的预备工程师心中。各类软件工程实施原则也时刻提醒我们模块化设计对系统的可维护性与可拓展性的重要意义。这就是说,产品的模块化应当尽早开展,最好在需求分析阶段就将产品拆解成多个需求模块,后续设计时则只需针对各个需求模块之间的衔接关系做出定义即可。
尽管C++(C PLUS PLUS) 是一种多重范式(Multiple paradigms)的语言,但面向对象(Object Oriented Programming)仍不失为它最显著的特征。类似于 CPP,尽管产品设计的原则成千上万,但对需求的抽象仍是并仍将长期是产品实现最关键的预处理。
2 何必抽象?
计算机科学是关于计算机的科学,计算机技术是关于抽象的技术
- 应用
- 编程语言/运行时
- 操作系统
- 处理器
- 计算单元
- 数字逻辑/电路
- 物理布局(VLSI)
- 流片
计算机体系结构中,每一层级的设计者都只需要考虑下一层层级的问题,不需要考虑下一层级的下一层级的问题。所以抽象即是简化,抽象提高效率。
3 何须封装?
尼泊尔军刀或许比电钻功能更多,但我们需要的是电钻
这是某处理器的地址映射图,从中可以看到两条 APB 总线的地址范围。片上所有的外设都挂载在这两条总线上,开发者要操作外设,就得以这两条总线的起始地址为基地址访问外设。
这是 C++ Boost 库主页上的图,一个红色按钮,体现了一键可得的设计哲学。
当然这种对比略显夸张,但良好的封装的却可以屏蔽掉不必要的细节,极大节省开发者的精力。
4 何谈继承?
“寻找别人已经走过的路”(Find a path that others have already traveled)
我们在解决问题或实现目标时,应当寻找已经有人成功探索过的方法和经验。通过借鉴他人的经验,我们可以避免重复的探索和错误,并更有效地达到目标。
以操作系统为例,它将处理器抽象为进程/线程、将主存抽象为内存管理、将磁盘抽象为文件系统,我们可以借鉴/复用操作系统中的这些组件,而不必自行开发。