通往 Embedded World 2021 之路:第 3 篇

编者按:在 Embedded World 2021 举办前推出的 5 篇系列博客中,第 1 篇介绍了 Embedded World 概况。在第 2 篇中,Randy 重温了他的 C 编程语言。本博客为第 3 篇,重点讨论如何使用面向对象编程来降低复杂性。第 4 篇将阐明好的设计的基本衡量指标就要能够根据需求变化重新配置,而不必重新实现构件。最后一篇博客(即第 5 篇)写于 Randall 在 Embedded World 2021 发表主题演讲之前,对操作系统需要的空间不断扩大提出了质疑,并谈到了系统分解问题。

延续上个月的话题,我之所以关注复杂性,是因为我认为我们的行业需要降低复杂性。我所说的复杂性是指电气设备(当我说电气设备时,我主要指电子设备)的使用复杂性。我认为设备内部的复杂性将继续增加。如何管理这种复杂性将是我下一篇文章的主题。

正如我在第一篇文章中提到,电气工程 (EE) 专业的招生人数落后于其他工程学科。尽管如此,我还是相信未来将有更多而不是更少的电气设备。此外,我也相信这些设备将比今天有更大的应用范围。创客运动就是证据。

人们对电气设备有巨大的兴趣,而且所制作东西的种类似乎永无止境。即使没有接受过正规电气工程培训的人,也对此有浓厚的兴趣。截至 2020 年第 46 周,以下网站每月吸引着数以百万计的独立访客:maker.ioMikroEAdafruitSeeedSparkFun 等(参见下方图 1)。这说明人们对电子产品充满兴趣。

图 1:面向电子产品爱好者的网站每月独立访客数

事实上,我相信电气设备的市场更大,超出电气工程师所能满足的范围。虽然电气工程师接受过培训,能够处理或至少知道如何处理最高级别的复杂性,但我相信,我们的机会在于让没有接受过良好培训的人也能开发电气设备。简言之,我认为如果电气工程师可以让电子设备和子系统更简单易用,那么我们就能获得更大的市场。

在上个月文章的结尾,我介绍了面向对象编程 (OOP)。这可以说是 OOP 增加了复杂性,因为其要求掌握的概念要多很多。我以后会讲到这些概念,但我到现在为止还没有指出 OOP 是如何降低功能重复使用的复杂性的。我将举例说明这一点。

我的女婿之前拿的是商科学位,但现在正在就读信息技术专业研究生。他与我分享了他最近的一次作业。他需要实现自己的 3D 视频动作游戏创意。

虽然他没有受过任何 3D 图形或实时编程方面的教育,亦无相关经验,但他还是成功了。根据教授的建议,他使用 Unity 平台实现了他的游戏创意。所以,虽然我一开始讲的是复杂性,但现在在讲关于重复使用的话题。

我最喜欢的一本书书名是《Fundamentals of Object Oriented Design in UML》(UML 面向对象设计基础),作者是 Meilir Page-Jones。我在完成大量 OOP 工作之后买了这本书,但我知道自己不过是个菜鸟,想要提升自我。

来源:Amazon (https://www.amazon.com/gp/product/020169946X/ref=dbs a def rwt bibl vppi i0)

令我高兴的是,Page-Jones 用集成电路作为类比,解释了 OOP 的概念。Page-Jones 说,这个观点来自 Brad Cox 1986 年的著作《Object-Oriented Programming: An Evolutionary Approach》(面向对象编程:一种演进方法)。Page-Jones 还引用了 Merrill Skolnik 的话,后者著有《Introduction to Radar Systems》(雷达系统导论)一书,并在书中指出“电子工程可以根据以下方面进行分类:(1) 元器件;(2) 技术;(3) 系统。”Skolnik 继续解释道:“元器件是基本构件,利用适当的技术将其组合起来,便会产生一个系统。”Page-Jones 建议将“电子”替换为“软件”,将“元器件”替换为“类”,这样我们就得到有关软件系统的有用视角。

Page-Jones 继续解释说,选择哪些有价值的元器件包含在电气系统中取决于电子工程师识别有用抽象的能力。他称,在第一个集成电路诞生之前,工程师们花了数十年时间来发现电子系统所需的有用模式。他利用这一观点来帮助 OOP 开发人员认识到,必须找到“健全、强大、方便”的类。他说,除非这些元器件能够连接在一起(在 Skolnik 的情况下,须通过印刷电路板连接),否则 Skolnik 引述的那些技术都是没有用的。

因此,对于集成电路和面向对象编程,我想指出的是,它们本质上是同一概念的不同实现形式。我承认,软件工程的要求似乎比硬件工程要宽松得多。现在似乎谁都能编个软件。但是,“连接”软件并不是那么容易。

MyHDL 的作者 Jan Decaluwe 在他的博客文章中说,在使用硬件描述语言 (HDL) 进行数字设计的背景下,用 Verilog 或 VHDL 描述算法绝非易事,实际上复杂且混乱。我认为,无论是可编程逻辑还是软件系统,要想进入更大的市场,我们都必须在软件设计方面做得更好。

因此,在本月的文章收尾时,我将介绍“良好” OOP 设计所需的概念。最常见的概念是内聚 (cohesion) 和耦合 (coupling)。内聚是指封装单元(无论是软件类、数字模块还是集成电路)各部分的关联性。高内聚优于低内聚,因为前者使系统更易于理解、测试、维护等等。耦合是一个软件或硬件元件与另一个软件或硬件元件的连接或依赖关系。低耦合优于高耦合,因为在前者的情况下,一个元件的更改对另一个元件的影响极小。

Page-Jones 创造了“共生性”(connascence) 一词来描述耦合的危害。按 Page-Jones 的说法,这个词源于拉丁语,意思是“生在一起”。他补充道,这意味着“命运交织在一起”。他对共生性正式定义如下。

两个软件 [或硬件] 元件 AB 之间的共生性意味着:

  • 可以假定,若更改 A,则为了保持整体的正确性,将需要更改(或至少仔细检查)B
  • 或者可以假定,若发生某种变化,则为了保持整体的正确性,AB 均需要更改。

请注意,上述定义中加括号的内容是我补充的。他接着解释了十种不同的共生性。有一种形式的共生性取决于函数调用中参数的顺序。如果改变顺序,则所有相关函数也必须更改。请注意,他还解释了差异共生性 (contranascence) 的概念,其中保持差异很重要。差异共生性尤其适用于 OOP 继承的情况,即多个对象是同一类型的实例,但必须彼此互不相同。

除了内聚、耦合和共生性之外,还有其他一些概念有助于理解什么是良好的 OOP 设计。在此列出这些概念以供参考:

  • 封装
  • 信息/实现隐藏
  • 状态保留
  • 对象标识
  • 消息
  • 继承
  • 多态
  • 泛型

这些主题在以上提到的 Page-Jones 著作和其他 OOP 相关著述中都有全面的介绍。

好了,再谈下去就会陷入我原本试图避免的复杂性。需要考虑的方面很多,但最根本的是,我们的目标是开发有用的黑盒子,任何人都可以用来制造新的电气设备。这些盒子之所以是黑色的,是因为我们不想也不需要搞清楚其中的任何东西。我们希望其接口尽可能简单,而不关心其内在的复杂性。

现在,我们可能对如何评估目标对象的好坏有了一定的了解,但我还没有分享如何将系统和子系统实际分解为可重复使用的元器件或模块。这将是我下一篇博客的主题。

关于此作者

Image of Randy Restle

Randall Restle 在电子元器件行业从业四十余载,学识渊博、经验丰富。 现处于半退休状态,担任 DigiKey 应用工程副总裁。他曾经领导过多个应用工程、技术人员和管理人员团队,指导他们开发原创、独有的先进技术产品。

其个人擅长数字信号处理、可编程逻辑实现、运动控制改进和软件设计。 他拥有多项专利,横跨多个行业,是 IEEE 的高级会员。 Randall 拥有辛辛那提大学 BSEE、MS 和 MBA 学位。

More posts by Randall Restle
 TechForum

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.

Visit TechForum