【问题标题】:To Encapsulate or Not To Encapsulate封装或不封装
【发布时间】:2015-01-07 18:44:21
【问题描述】:

我的最新项目有一个很好的 MVC 设置,该项目很快就会扩展到需要更多人来处理我创建的代码。我的项目在 Swift 中。

因此,我对从事大型项目的人感到好奇,在给定场景中封装对象的最简洁方法是什么。

  1. 我有一个自定义图像类:MyImage
  2. 我有一些特殊的对象,其中包含一个 MyImage 对象和各种其他数据位。让我们称之为 DataObject。

我的问题是关于嵌套。让DataObject用自己的函数封装所有MyImage函数是否更好。

DataObject.doSomething()

或者将所有这些 MyImage 函数留在 MyImage 对象上并让 MyImage 对象可以从 DataObject 访问是更好的做法(尤其是在与他人合作时):

DataObject.myImage.doSomething()

【问题讨论】:

  • 你好。 :) 我首先要问为什么你有一个自定义图像类。你实际上已经继承了 UIImage?这是一件非常奇怪的事情。你为什么这样做?
  • 我的想法和马特提到的一样。查看一些代码以更好地了解上下文可能很有用。
  • 我没有继承 UIImage,我用它创建了一个超类。所以它是一个带有 UIScrollView、UImageView 和一堆其他东西(比如手势)的 UIView,这让我可以轻松地做很多有趣的事情。比如缩放、平移、旋转等
  • 那么您没有为任何人提供足够的信息来给出有意义的答案。您需要有关您的架构的建议,但您没有揭示您的架构。在此基础上投票结束。

标签: oop swift encapsulation


【解决方案1】:

这取决于您希望人们如何使用您的软件。他们需要MyImage 的知识吗?如果没有,MyImage 的所有功能都应该封装在DataObject 中,因此他们不知道DataObject 对它做了什么。在我看来,使MyImage 可访问打破了封装,因为它让用户对DataObject 幕后发生的事情有太多的了解。

【讨论】:

  • 但是我的想法是这样的。我们最终需要说,DataObject2、DataObject3 等都是不同的。有些可能有也可能没有 MyImage,所以我觉得我会通过不断编写包装函数来做很多多余的工作,不是吗?
  • 那为什么不让MyImage成为一个完全由用户管理的独立实体,然后有一个DataObject.setMyImage(MyImage)函数呢?