开发区域

MATLAB高级软件开发

重温汉·索罗

很久以前,在很远很远的地方……安迪写了关于Han Solo Encapsulation的文章为了让贾巴的“系统按照设计的那样工作,他需要把他的系统封装在一个坚如磐石的界面后面”。

由于运气好,或者根据您的角度做出明智的设计选择,最近我认为可能产生深远影响的重构工作变成了单个类中的一些更改,最终节省了大量时间。让我们看一看。

我的假设是DataProvider它接受DataRequest并返回一些数据:

classdefDataProvider方法函数data = getData(dataProvider,dataRequest)参数dataProvider (1,1) dataRequest (1,1) dataRequest结束%继续执行…结束结束结束

DataRequest看起来是这样的:

classdefDataRequest属性制造(1,1)字符串=缺失型号(1,1)字符串=缺失制造年份(1,1)日期时间=缺失结束结束

定义的相关属性DataProvider需要提供数据。所有值都是标量,默认值为失踪表示它们被用户“取消设置”的事实。

为了形成它的查询,DataProvider必须提取每个属性的值。要做到这一点,它需要知道“unset”由“missing”表示,因此应该从搜索条件中忽略它。

这里有一个可能的实现DataProvider

classdefDataProvider方法函数data = getData(dataProvider,dataRequest)参数dataProvider (1,1) dataRequest (1,1) dataRequest结束searchTerms = {};propsToGet = [“制造”“ManufacturingYear”“模型”];prop = propsToGet如果~ismissing(dataRequest.(prop)) searchTerms = [searchTerms {prop} {dataRequest.(prop)}];结束结束result = dataProvider.search(searchTerms{:});%继续执行…结束结束结束

这里的问题是DataProvider,其他代码它利用了DataRequest,是耦合到怎样的DataRequest表示其“未设置”值。这是应该被封装在DataRequest.我的DataProvider真正想要的是一个不缺少属性名和值的名称-值对数组。

(我们也可以将此描述为告诉不要问原则因为我们不是真的躲起来DataRequest)

让我们重构DataRequest添加这样一个方法。我把它叫做namedargs2cell由于其与内置MATLAB函数

classdefDataRequest属性制造(1,1)字符串=缺失型号(1,1)字符串=缺失制造年份(1,1)日期时间=缺失结束方法函数paramCell = namedargs2cell(dataRequest)参数dataRequest (1,1)结束paramCell = {};propsToGet = [“制造”“ManufacturingYear”“模型”];prop = propsToGet如果~ismissing(dataRequest.(prop)) paramCell = [paramCell {prop} {dataRequest.(prop)}];结束结束结束结束结束

这使得我们DataProvider简单得多:

classdefDataProvider方法函数data = getData(dataProvider,request)参数dataProvider (1,1) dataProvider请求(1,1)DataRequest结束searchTerms = namedargs2cell(请求);result = dataProvider.search(searchTerms{:});%继续执行…结束结束结束

回到封装原则,我们实现了什么?在我的实际情况中,我想改变DataRequest允许为给定属性指定多个值,而不仅仅是标量。因此,用一个空而不是缺少一个标量来表示“unset”是有意义的。由于所有关于“未设置”如何表示的知识都包含在DataRequest,只有改变我需要做的事情DataRequest本身。没有其他代码需要修改:

classdefDataRequest属性Make (1,:) string型号(1,:)string制造年份(1,:)日期时间结束方法函数paramCell = namedargs2cell(dataRequest)参数dataRequest (1,1)结束paramCell = {};propsToGet = [“制造”“ManufacturingYear”“模型”];prop = propsToGet如果~all(isempty(dataRequest.(prop))) paramCell = [paramCell {prop} {dataRequest.(prop)}];结束结束结束结束结束

在上面,请注意如何操作ismissing已经成为(isempty(…))

总之,通过为类提供正确的接口,代码更改可以在范围上受到更大的限制,并且更容易实现。




由MATLAB®R2022b发布

|
  • 打印
  • 发送电子邮件

댓글

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