4

为了提供一些背景信息,我是 iOS/Objective-C 的新手,具有 Web 开发(Ruby/JS/C#)背景。我了解这些类是如何工作的,但我不明白为什么最初的实现者编写这两个类 (NSKeyedArchiverNSKeyedUnarchiver) 而不是将编码和解码逻辑合并到一个类中。

阅读抽象类NSCodera的 Apple 文档NSCoder 具有编码和解码的方法。我唯一能想到的是代码很长,所以最初的实现者把它分成了2个......在我看来,开发人员只使用一个类会更方便,但也许我'我错过了一些细微的差别。那么这有什么历史原因吗?NSCoder它定义了编码/解码API,但意味着被分成编码器/解码器,这是一种“方便”吗?我是否误解了 aNSCoder应该做什么?

4

1 回答 1

3

我认为将归档和取消归档功能保留在单独的类中是应用单一职责原则的结果,该原则说一个类必须具有单一的、狭窄的职责,应该完全封装在该类中。实际上,当您创建NSCoder的子类的实例时,您这样做是为了归档一组对象,或者将数据取消归档到一组对象中,但不能同时进行。

这种设计并不理想,因为现在您有几对类(即NSArchiver/NSUnarchiverNSKeyedArchiver/ NSKeyedUnarchiver)通过通信内聚链接在一起,而单类设计会导致这种数据依赖关系被完全封装。这是 Cocoa 库的设计者本可以采取任何一种方式的折衷方案。看来他们选择了单一责任原则,代价是引入了数据格式依赖性。

于 2013-12-05T16:08:34.843 回答