【发布时间】:2015-08-03 20:42:52
【问题描述】:
我正面临一个需要帮助的架构决策。
我正在创建一个可供多个客户使用的库。在这个库中,我有一个名为LibClass 的类,它有一个名为aProperty 的读写属性,还有一个名为LibManager 的类,它包含对Libclass 实例的引用。 LibManager 负责更新LibClass 属性。
客户端可以通过LibManager上的方法获取LibClass实例,我们称之为getLibClassInstanceMethod。
我不希望我的客户能够在LibClass 中更改aProperty,因为这意味着客户可以更改我的库模型。我只希望LibManager 可以更改aProperty 的访问权限。
我一直在考虑几种解决方案:
选项 1
在getLibClassInstanceMethod 内返回对象的深层副本。
优点: 我始终确信只有库才能完全访问模型。
缺点: 内存消耗 - 每次我想获取对象时,我都需要克隆它。
选项 2
使LibClass 不可变;每次我想更改类属性时,我都需要创建一个新类并在指定的初始化程序(构造函数)中传递新值并销毁旧对象。
优点: 我让类变得不可变,这正是我想要的
缺点: 当类变大时,总是因为一个属性改变而重新创建类有点奇怪。
选项 3
创建某种可变/不可变对,例如 NSString/NSMutableString。
优点: 不确定
缺点: 每个类都需要两个对应的类,使类的数量增加一倍。
我真的不知道该走哪条路。你会怎么做?
谢谢
【问题讨论】:
-
我喜欢 3 选项,但您也可以使 LibClass 不可变并创建单独的类来修改它,如 LibEditor。第一次你总是可以重新创建你想要编辑的 LibClass(在 LibEditor 中实现),但之后你可以将实现更改为更高效
-
只是不要暴露设置器。即,因为您正在使用 objC,所以您可以完全控制您在标题中声明的内容。因此,只需将 setter 保持私有,并仅公开 getter,以便这些属性对客户端似乎是只读的
-
Jef,
LibManager需要访问权限,因此我无法将其设为只读。 -
我没有说让它只读,我说让它看起来对客户只读。制作一个私有标头/扩展名/类别,公开您的 libManager 的设置器;)
标签: ios objective-c oop design-patterns shared-libraries