为可重用的软件模块创建一致且合适的接口是嵌入式软件设计中最关键也是最容易被忽视的方面之一。接口通常是动态开发的,很少甚至没有预先考虑。但是,为了确保软件可以轻松地从一个应用程序使用到下一个应用程序,每个嵌入式开发人员都应该记住五个技巧。
技巧1——从所需操作的列表开始
在开始为软件模块编写接口之前,开发人员应该花一些时间写出接口需要执行的操作的简单列表。这个列表就像一个便笺簿,让开发人员思考界面到底需要做什么。模块的操作是什么?它需要哪些输入?它将产生哪些输出?这三个问题都需要回答。列表和问题将作为设计界面的起点。
技巧2——使用UML类图
UML类图用于表示一个类,但它也可以用于表示一个模块,更重要的是,模块接口。类图的基本组件是一个由三部分组成的盒子。第一部分(顶部)包含模块的名称。第二部分(中间)包含模块的属性。第三部分也是最后一部分用于定义接口公开公开的操作和方法。
模块的属性可以被认为是接口操作将操纵的私有和公共变量。属性前面的加号表示它是公共的,直接作为接口的一部分公开。减号表示该属性是私有的,嵌入式开发人员只能通过使用接口公开的操作在幕后操作。将这些操作视为技巧1中列出的相同操作。
技巧3——将接口与实现分离
当开始开发一个模块的接口时,开发人员应该尽一切努力将接口从模块的实现中分离出来。接口的公共部分的细节都应该包含在头文件中,在这种情况下,头文件定义了模块的接口。实现细节应该保存在源文件中。将实现的细节与接口分开,开始为开发人员提供隐藏实现的能力。这种隐藏导致了模块类的抽象,并提供了以后重新定义实现而不影响接口的能力。
技巧4——使用抽象数据类型
需求总是变化的,预测需求将如何变化通常是徒劳的,即使你配备了水晶球。抽象数据类型旨在帮助开发人员处理不断变化的需求。以头文件中定义为接口一部分的数据结构为例。任何引用头文件的模块都能够基于该数据结构创建和修改数据。当需求和数据结构发生变化时,就需要对使用头文件的任何文件进行更新。
如果嵌入式开发人员创建了一个抽象数据类型,其中数据结构的细节隐藏在实现中,那么只需要更新源文件实现。任何使用头文件的模块将简单地继续使用公共接口,底层实现将处理改变的数据类型。
技巧5——封装数据
计算机科学课程中教授的第一个概念是,变量或对象应该限制在尽可能小的程序范围内。类似地,接口如何实现的细节应该限于需要知道的基础上。开发人员应该尝试对模块的用户隐藏尽可能多的数据和实现。隐藏细节有助于防止用户直接操作模块的内部数据,这可能会导致模块进入未知或不一致的状态。
总结
开发充满了不断变化的需求和短的开发周期。使用适当的界面设计技术可以改进软件的整体设计,并最小化不断变化的需求目标的影响。我们研究了设计界面的五个简单技巧。嵌入式开发人员在开发一个经得起时间考验的界面时,还需要考虑哪些因素?