创建软件应用程序通常涉及设计应用程序数据和实现对该数据执行的操作。过程式程序将数据传递给函数,函数对数据执行必要的操作。面向对象的软件将数据和操作封装在对象中,通过对象的接口相互交互。
MATLAB®语言使您能够使用过程和面向对象技术创建程序,并在程序中同时使用对象和普通函数。
在过程式编程中,设计的重点是为了达到预期状态而必须执行的步骤。通常,将数据表示为结构中的单个变量或字段。将操作实现为接受变量作为参数的函数。程序通常调用一系列函数,每个函数都传递数据,然后返回修改后的数据。每个函数对数据执行一个或多个操作。
面向对象的程序设计包括:
标识要构建的系统或应用程序的组件
分析和识别模式,以确定哪些组件重复使用或共享特征
根据相似性和差异性对组件进行分类
执行此分析后,您可以定义描述应用程序使用的对象的类。
类描述一组具有共同特征的对象。对象是类的特定实例。对象属性中包含的值使对象不同于同一类的其他对象。类定义的函数(称为方法)实现了类中所有对象的公共对象行为。
您可以将简单的编程任务实现为简单的函数。然而,随着任务的规模和复杂性的增加,函数变得更加复杂和难以管理。
当函数变得太大时,可以将它们分解为更小的函数,并在一个函数和另一个函数之间传递数据。但是,随着函数的数量越来越多,设计和管理传递给函数的数据就变得困难并且容易出错。此时,考虑将MATLAB编程任务转移到面向对象的设计。
对于某些问题来说,用对象来思考更简单、更自然。将问题陈述中的名词看作要定义的对象,而将动词看作要执行的操作。
考虑课程的设计,以代表货币贷款机构(银行,抵押贷款公司,个人货币贷方等)。难以将各种类型的贷款人视为程序。但是,您可以将每个作为执行某些操作并包含某些数据的对象。设计对象的过程涉及识别对您申请很重要的贷方的特征。
确定共性。所有的钱贷款人都有什么共同之处?全部放债人
物体可以有一个贷款
方法和一个贷款利率
例如,属性。
识别差异。每笔钱贷款人有何不同?人们可以向企业提供贷款,而另一个人只提供给个人的贷款。因此,这是贷款
不同类型的贷款机构可能需要采取不同的操作。基类的子类放债人
类可以专注于子类版本贷款
方法。每个贷款人都可以对其具有不同的价值贷款利率
财产。
对于超类的因子,贯穿子类中每种类型的贷方的特定。
只添加必要的东西。这些机构可能会从事申请不感兴趣的活动。在设计阶段,确定对象必须包含的操作和数据基于您的问题定义。
对象提供了一些结构和单元格数组中无法提供的有用特性。例如,对象可以:
约束分配给任何给定属性的数据值
仅在查询时计算属性的值
查询或更改任何属性值时的广播通知
限制对属性和方法的访问
随着程序的复杂性增加,面向对象设计的好处变得更加明显。例如,假设您将以下过程实现为应用程序的一部分:
检查输入
对第一个输入参数执行计算
基于第二个输入参数转换步骤2的结果
检查输出的有效性和返回值
您可以将此过程实现为一个普通函数。但是假设您在应用程序的某个地方再次使用这个过程,除了步骤2必须执行一个不同的计算。您可以复制并粘贴第一个实现,然后重写第2步。或者您可以创建一个函数,该函数接受一个选项,指示要进行哪些计算,等等。但是,这些选项会导致更复杂的代码。
面向对象的设计可以将公共代码归类为所谓的基类。基类将定义使用的算法,并实现任何使用此代码的案例的常见方法。步骤2可以在语法上进行句法,但未实现,将专门的实现留给您从此基类派生的类。
步骤1函数checkInputs()%实际实施结尾步骤2函数结果= computeOnFirstArg ()%仅指定语法结尾步骤3函数TransformResults()%实际实施结尾步骤4函数= checkOutputs ()%实际实施结尾
基类中的代码不会被复制或修改。从基类派生的类继承此代码。继承减少了要测试的代码量,并将程序与对基本过程的更改隔离开来。
在面向对象编程中,使用类作为类似但更专门化的类的基础是一种有用的技术。该类定义了一个公共接口。将这种类整合到你的程序设计中,使你能够:
确定特定目标的要求
将需求作为接口类编码到程序中
对象通过减少使用组件或系统必须知道的东西来降低复杂性:
对象提供了一个隐藏实现细节的接口。
对象强制执行控制对象如何交互的规则。
为了说明这些优点,请考虑执行称为双链接列表的数据结构的实现。看使用类实现链接列表对于实际实施。
下面是一个三元素列表的图表:
要向列表中添加节点,请断开列表中现有节点的连接,插入新节点,并适当地重新连接节点。以下是基本步骤:
首先断开节点:
拆开n2.prev.
从n1
拆开n1。下一个
从n2
现在创建新的节点,连接它,并重新编号原来的节点:
关联new.prev.
到n1
关联新的。下一个
到n3
(是n2
的)
关联n1。下一个
到新
(将n2
的)
关联n3。上一页
到新
(将n2
的)
如何在类设计中封装方法的详细信息。每个节点对象都包含从列表中插入或删除自身的功能。
例如,在这个类中,每个节点对象都有一个插图
方法。若要将节点添加到列表中,请创建节点对象,然后调用其插图
方法:
nnew = nodeConstructor;nnew.insertafter(n1)
因为节点类定义了实现这些操作的代码,所以这段代码是:
由类作者以最佳方式实现
始终与当前版本的类别最新
妥善测试
当对象从mat文件中加载时,可以自动更新旧版本的对象。
对象方法强制执行节点如何交互的规则。此设计删除了对从使用对象的应用程序执行规则的责任。这也意味着应用程序不太可能在自己的过程中生成错误。
当您将一个系统分解为对象(汽车- >发动机- >燃料系统- >氧气传感器)时,您在自然边界周围形成了模块。类提供了对代码模块化的三层控制:
公共 - 任何代码可以访问此特定属性或调用此方法。
Protected -只有这个对象的方法和从这个对象的类派生的对象的方法可以访问这个属性或调用这个方法。
私有 - 只有对象自己的方法可以访问此属性或调用此方法。
定义类时,可以过载现有的MATLAB函数以使用您的新对象。例如,MATLAB串行端口类重载从文件中读
从连接到此对象表示的端口的设备读取数据的功能。您可以定义各种操作,例如平等(eq.
)或增加(+
),对于您定义的类来表示您的数据。