【发布时间】:2014-07-28 23:42:22
【问题描述】:
我已经阅读了整个Swift book,并观看了所有WWDC videos(我衷心推荐所有这些)。我担心的一件事是数据封装。
考虑以下(完全人为的)示例:
class Stack<T>
{
var items : T[] = []
func push( newItem: T ) {
items.insert( newItem, atIndex: 0 )
}
func pop() -> T? {
if items.count == 0 {
return nil;
}
return items.removeAtIndex( 0 );
}
}
这个类实现了一个堆栈,并使用一个数组来实现它。问题是,items(就像 Swift 中的所有属性一样)是公共的,所以没有什么可以阻止任何人直接访问(甚至变异)它,而不是公共 API。作为一个脾气暴躁的老 C++ 人,这让我很不爽。
我看到人们抱怨缺少访问修饰符,虽然我同意他们会直接解决这个问题(我听说他们可能很快就会实施(TM)),但我想知道数据隐藏的一些策略是什么他们的缺席。
我是否遗漏了什么,或者这只是语言中的一个遗漏?
【问题讨论】:
-
实际上有一种方法可以进行某种数据隐藏——协议。只需使您的类符合您的协议,并包含您希望对外界可见的所有功能和内容,并传递它而不是类本身。正如我所说,这不是替代品,但会一直工作到可见性修饰符结束。这也是一个很好的设计模式——依赖注入
-
" 所以没有什么能阻止任何人直接访问(甚至变异)它与公共 API 分开” - 除了成为一个“脾气暴躁的老 C++ 家伙” :-) 你认为会发生什么伤害如果您不强制阻止人们以他们想要的方式使用您的代码?例如,Python 有一句谚语“我们在这里都是成年人”。公共/私有基于文档和约定。如果有人想摆弄课堂内部的东西,请注意购买者。没有人会假装他们可以永远知道没有人有充分的理由访问内部对象。
标签: encapsulation swift