开发区域

先进与MATLAB软件开发

汉索罗重新审视

很久以前在一篇博客文章中,远…安迪写汉单独封装——让贾”系统作为设计他需要封装系统背后的岩石固体界面”。

中风的好运,或者明智的设计选择取决于你的角度来看,最近的重构工作,我想可能有深远的影响变成了几一个类的变化,最终节约很多时间。让我们看看。

我的情况是,我有一个DataProvider接受一个DataRequest并返回一些数据:

classdefDataProvider方法函数data = getData (dataProvider dataRequest)参数dataProvider (1, 1) dataProvider dataRequest dataRequest (1,1)结束%实现持续…结束结束结束

DataRequest是这样的:

classdefDataRequest属性使(1,1)字符串=缺失的模型(1,1)字符串=失踪ManufacturingYear (1,1) datetime =失踪结束结束

它定义了相关的属性DataProvider需要提供数据。所有的值都是标量,有默认值失踪来表示他们“复原”的用户。

形成其查询DataProvider必须提取每个属性的值。要做到这一点,它需要知道“复原”是由“失踪”,因此它应该被忽略的搜索条件。

这是一个可能的实现DataProvider:

classdefDataProvider方法函数data = getData (dataProvider dataRequest)参数dataProvider (1, 1) dataProvider dataRequest dataRequest (1,1)结束searchTerms = {};propsToGet = [“制造”“ManufacturingYear”“模型”];支持= propsToGet如果~ ismissing (dataRequest。(道具))searchTerms = [searchTerms{道具}{dataRequest。(道具)});结束结束结果= dataProvider.search (searchTerms {:});%实现持续…结束结束结束

这里的问题是DataProvider,任何其他代码让使用DataRequest耦合的方式DataRequest代表“复原”的价值观。这是应该封装内DataRequest。我的DataProvider真正想要的是一个数组的名称-值对non-missing属性名称和值。

(我们也可以描述的一个实例告诉不要问原则因为我们没有隐藏DataRequest的属性与外界的联系。)

让我们重构DataRequest添加一个方法,就是干这个的。我叫它namedargs2cell由于其相似内置的MATLAB函数

classdefDataRequest属性使(1,1)字符串=缺失的模型(1,1)字符串=失踪ManufacturingYear (1,1) datetime =失踪结束方法函数paramCell = namedargs2cell (dataRequest)参数dataRequest dataRequest (1,1)结束paramCell = {};propsToGet = [“制造”“ManufacturingYear”“模型”];支持= propsToGet如果~ ismissing (dataRequest。(道具))paramCell = [paramCell{道具}{dataRequest。(道具)});结束结束结束结束结束

这使得我们的DataProvider简单得多:

classdefDataProvider方法函数data = getData (dataProvider,请求)参数dataProvider (1,1) (1, 1) DataRequest dataProvider请求结束searchTerms = namedargs2cell(请求);结果= dataProvider.search (searchTerms {:});%实现持续…结束结束结束

回到我们的封装原则,我们实现什么?在现实情况下,我想改变DataRequest允许指定多个值对于一个给定的属性,而不仅仅是标量。因此意义代表“复原”空着,而用一个标量失踪。因为所有的知识如何表示包含在“设置”DataRequest,只有改变我需要在内部DataRequest本身。没有其他代码必须感动:

classdefDataRequest属性使(:1)字符串模式(:1)字符串ManufacturingYear 1: datetime结束方法函数paramCell = namedargs2cell (dataRequest)参数dataRequest dataRequest (1,1)结束paramCell = {};propsToGet = [“制造”“ManufacturingYear”“模型”];支持= propsToGet如果~所有(isempty (dataRequest(道具)))paramCell = [paramCell{道具}{dataRequest。(道具)});结束结束结束结束结束

在上面的,请注意ismissing已经成为(isempty (…)

总之,通过提供合适的接口类,代码更改可以变得更加有限范围和容易实现。




发表与MATLAB®R2022b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。