开发区域

先进与MATLAB软件开发

封装的糖

汉索罗是一个好人。然而他是不幸的。

图片来源:https://flic.kr/p/h8jDb

是的,没错,你可能知道Han Solo包裹,封装在carbonite臭名昭著的黑帮贾小屋。你看到贾教授在太空流氓学校,为了保持他的系统做设计他需要封装系统背后的一个坚如磐石的接口。通过他丰富的经验收集债务来知道carbonite符合要求。然而,不幸的是,贾霸他没有真正理解封装。他把他获得的最佳实践在学校和直接应用它们,没有把握的原则。这最终导致了他的垮台的下层社会的人士在Sarlacc坑。

这里的教训吗?让我们理解原则封装的,不仅仅是战术的最佳实践和习语。例如,我记得教我们总是让属性(或数据成员、字段等)只供私人,然后操作通过setter和getter方法。问“为什么?”是一个有趣的讨论。如果你有一个类的属性,你想要访问和修改的财产公开给任何人使用你的类,那么为什么不公开财产?

认为第二个。我发现许多人从来没有。

一个想法是,分配一个setter促进做错误检查属性的能力。这是真的,但不完整。即使对于属性,不需要任何验证钻进入我们的脑袋,我们应该empty-boiler-plate-pass-through setter和getter。

好吧,那么为什么别的吗?我不否认在许多语言中需要有这些方法来封装私有数据。然而,对我来说,原则在起作用,这样做是封装背后的原则,这是信息隐藏。在许多语言中,这些锅炉钢板setter和getter允许软件分离出其实现的接口。这使软件从当前实现进化到另一个实现符合未来的需要我,当然我还不知道(即使有人做)。如果我们公开字段或属性等语言c++或Java®这种灵活性。是的,这是我们的接口,我们可以访问和修改给定的属性,但是当我们公开财产直接作为公共这也暴露的实现。具体地说,它使马上几件事:

  1. 房地产是存储在对象(物体甚至!),在内存中。
  2. 属性不会(也不能)时需输入验证修改和访问时不经过预处理。

即使今天没有输入验证,或者对象属性保存在内存中,添加这些setter和getter是重要的,允许灵活地改变我们的思想。也许在未来我们重构,愿委托财产的所有权转移到另一个对象。也许我们想计算结果每次访问它。如果我们有正确属性封装这种改变不是一个问题。

所以,在MATLAB一样,我们应该让所有私人和写自己的getter和setter属性访问器方法?绝对不是!事实上,与其他语言不同,在MATLAB已经封装的属性。例如,看到下面的类:

classdefCarbonite属性(SetAccess =私人)HanSolo结束结束

正如您可以看到的,HanSolo属性限制修改,但允许访问的属性。这是唯一的接口。注意以下不同的实现仍然忠实于作者的基本界面没有客户端代码是明智的。的接口是什么什么,什么是封装的如何

例子:

代表团——给别人来分配工作:

classdefCarbonite%这个实现委托给其他的类。属性(依赖,SetAccess =私人)HanSolo结束属性(访问=私人)HanSoloAccessor = HanSoloDelegate;结束方法函数独奏= get.HanSolo (carbonite) = carbonite.HanSoloAccessor.HanSolo独奏;结束结束结束

计算——不要存储任何东西,每次重新计算:

classdefCarbonite%这个实现每次都创建一个新的HanSolo属性(依赖,SetAccess =私人)HanSolo结束方法函数独奏= get.HanSolo (carbonite) = utils.createNewHanSolo独奏;结束结束结束

预处理getter -添加一点味道,做一些错误检查setter:

classdefCarbonite%这个实现预处理HanSolo的存储价值%给它回来,这一次带着他标志性的帽子从一个不同的组%的电影。如果属性是可修改的,你可以添加setter当修改值%执行错误检查。属性(SetAccess =私人)HanSolo结束属性(访问=私人)IndyHat = IndianaJonesFedora;结束方法函数独奏= get.HanSolo (carbonite) = carbonite.HanSolo独奏;solo.add (carbonite.IndyHat);结束结束结束

好吧你明白了吧。不打破封装MATLAB模型的属性,所以不需要锅炉钢板的setter和getter。你可以公开属性的设置和获取匹配是否你想要访问或修改,你可以这样做没有暴露的实现细节,因为你可以随时添加set.Propertyget.Property方法改变实现。实现仍然是,跟我说这....封装!

贾霸式的错误是什么?他不明白一个漏水的抽象的概念。他仍然暴露了他的一些实现,因为他是如此的骄傲他的HanSolo奖,他展示了Han Solo是他最喜欢的装饰。贾认为他是封装在天然焦的时候,他没有利用封装实现信息隐藏。胶囊的每个人都知道里面是什么,包括一个新崛起的绝地武士和他的朋友们(其中一个是一个非常忠诚的wookie我可能添加)。如果贾藏他的奖金,或者如果他carbonite有点厚,所以没人能区分汉族独奏板和所有其他的走私者在他们的债务支付,也许他可能还活着很久以前在一个遥远的银河系遥远。

…或什么if he used this implementation?

classdefCarbonite%这个实现克隆HanSolo每次作为诱饵来烦人的绝地。属性(依赖,SetAccess =私人)HanSolo结束属性(访问=私人)RealHanSolo结束方法函数独奏= get.HanSolo (carbonite)独奏=克隆(carbonite.RealHanSolo);结束结束结束

会有不错的效果的惩罚真正的汉独奏虽然让他的朋友了。

收获,我们应该理解封装,背后的原则不仅仅是公式。我们不要像贾,他的软件没有任何好。




发表与MATLAB®R2016a

|

评论

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