开发区域

先进与MATLAB软件开发

你有邮件

让我们发送一些电子邮件!

想象你写一个函数,将电子邮件发送给客户。你最初的函数调用可能会看起来像这样:

sendEmail (emailAddress firstName、lastName bodyText)

拥有4输入函数是可以的,但如果我们需要添加更多的客户详细信息就变得难以管理。软件项目上工作时,我们发现某些变量往往是组合在一起的。在我们的例子中,“姓”,“姓”,“电子邮件地址”代表一个客户。我们可能也有“名称”,“描述”和“价格”来代表一个产品,或“客户”,“产品”和“datetime”来表示一个订单。

让我们组前3个输入合并到一个变量中。最简单的方法就是用一个结构体:

客户=结构(“FirstName”, FirstName、LastName,姓,“电子邮件”,emailAddress);

我们的函数调用就变成了:

bodyText sendEmail(客户)

这样做的好处是,我们现在可以通过在与客户相关的所有信息为一个单一的变量。如果他们的邮寄地址添加到结构体,它可以自动可供我们使用sendEmail函数。

客户是什么?

不利时就会出现新的开发人员(或者你从现在开始的几个星期!)再看这个函数。到底是什么“客户”结构体?字段的名字叫做“FirstName”或“FirstName”或“FirstName”?

如果你试图访问一个不存在的领域,你会得到一个错误,但是如果你之前设置一个字段不存在,它将被自动添加到结构体中。也许你可以找出正确的名字从现有代码,如果不太长或复杂的。否则,你将不得不运行测试(因为有人写了一个测试,对吧?),看看是在运行时提供给函数。

与客户,我们至少可以推测的内容。如果采用更通用的名称(“数据”、“metdadata”、“信息”),它可以是不可能的。

这种缺乏清晰浪费一遍又一遍地开发人员的时间,并可能导致微妙的错误,很难追踪。

一个有效的客户是什么?

为了解决这个问题,我们可以定义验证客户输入:我们要确保我们有一个标量结构与正确的字段名称,数据类型是正确的,任何其他的验证规则。例如,格式的电子邮件地址总是“* @ *。*”。

这可能是复杂和艰苦的管理。如果你不小心,它会导致分散重复验证的代码,这是难以阅读。此外,我们可以保证所有这些“客户结构”总是会有效吗?——这是不可能的,或者另一个开发人员,创建一个无效的客户结构,我们不会知道,直到我们再次运行我们的验证或错误的代码。

这种形式的第二个来源错误——不是预期的格式的数据。常见的问题包括变量是空的,但不应该,或者cellstr应该是一个字符串数组。

我们需要从客户什么?

我们经常需要执行的操作在我们的客户结构。例如,构建客户从他们的第一个和最后一个名字的全名:

fullname =客户。FirstName +”“+ customer.LastName;

编写这些代码每次我们需要全名要么导致代码重复(高不一致的可能性),或一个函数的离婚数据和可能很难找到。

定义一个类,而不是

相反,我们可以定义一个类我们的客户!这样做将带来以下好处:

函数使用客户类只需要一行验证参数块-所需的类。验证线告诉你准确的输入是什么,你可以立即打击Ctrl + D类定义。它形成一个明确的调用代码和课堂之间的合同。

块告诉你到底是什么属性所有这个类的对象。为每个属性使得显式验证每个属性将包含什么,它可以设置默认值,保证类的所有对象将是有效的。

依赖属性可以给你添加导出信息,而无需闲逛的内部对象(你好封装!);告诉对象你想要做什么,不要问各个部分的数据。可以添加其他功能相关的类方法。

让你的类处理数组

定制类开始发光,当你让他们兼容数组。而不是让一个客户或一个订单,你可以有一个数组的客户或订单和执行操作。这个本地数组处理是MATLAB的独特功能之一,消除了需要一个像你这样的“集合”对象可能在C。

我总是添加一个基于数组的方法将一个对象数组转换成一个标准的MATLAB。它允许您轻松地看到整个对象数组的内容,也许写数据到一个场上显示或一个电子表格报告的目的。

为什么去创建一个自定义类的所有麻烦就把它回到一个通用的数据类型吗?现在关键的区别是,表派生的从我们的自定义类负责处理所有的验证和计算;表不是真理的源泉。

代码示例

下面是示例代码显示一个客户可能会是什么样子当在MATLAB实现为一个类:

  • 属性名称是固定的,总是出现,在运行时不能改变。
  • 数据类型和大小是固定的,并自动执行类型转换在可能的情况下(如字符字符串)。
  • 电子邮件验证,不管它是改变。
  • FullName依赖财产给调用代码直接访问它真正想要什么。
  • 方法让我们很容易想象的内容以外的客户数据数组,使用我们的应用程序。
classdef客户属性姓(1,1)字符串名(1,1)字符串邮件(1,1)字符串{mustBeValidEmail} =“undefined@domain.com”结束属性(依赖,SetAccess =私人)FullName(1,1)字符串结束方法函数cust =客户(第一,去年,电子邮件)cust。FirstName =第一;cust。LastName =去年;cust。电子邮件=电子邮件;结束函数str = get.FullName(客户)str =客户。FirstName +”“+ customer.LastName;结束函数台=表(客户)参数客户(:1)客户结束fn = [customers.FirstName] ';ln = [customers.LastName] ';电子邮件= [customers.Email] ';台=表(fn、ln、电子邮件、“VariableNames”,(“FirstName”“姓”“电子邮件”]);结束结束结束函数mustBeValidEmail(价值)anyLetterOrNum = alphanumericsPattern ();帕特= anyLetterOrNum +“@”+ anyLetterOrNum +“。”+ anyLetterOrNum;断言(匹配(价值,帕特),“顾客:InvalidEmail”,“无效的电子邮件”)结束

这是我们如何使用它:

c(1) =客户(“米奇”,“码头工人”,“mitch@foo.com”)c(2) =客户(“拉克兰”,“莫顿”,“lachlan@bah.com”);c(3) =客户(“Rigoberto”,“巨蜥”,“rigo@uran.com”);表(c)
c =客户属性:FirstName:“米奇”姓:“码头工人”电子邮件:“mitch@foo.com”FullName:“米奇码头工人”ans FirstName LastName = 3×3表邮件___________ ________ _________________“米奇”“码头工人”“mitch@foo.com”“拉克兰”“莫顿”“lachlan@bah.com”“Rigoberto”“巨蜥”“rigo@uran.com”

我们可以验证输入sendEmail函数用一个简单的参数:

函数bodyText sendEmail(客户)参数(1)客户bodyText(1, 1)字符串结束%其他代码…结束

我什么时候应该定义一个自定义的类?

您可能想知道什么时候你应该去努力和创建自定义类的形式。就像决定从一个脚本函数或类的函数,当你遇到的限制你的当前实现能做什么。如果你发现:

  • 很难理解你的数据结构。
  • 你有验证问题。
  • 密切相关的代码复制,数据分散,或不一致。

是时候考虑定制类。




发表与MATLAB®R2022a

|

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。