当NSKeyedArchiver从NSCoder继承时,为什么NSKeyedUnarchiver存在?

时间:2013-12-05 15:48:48

标签: ios objective-c coding-style nskeyedarchiver nskeyedunarchiver

为了给出一些上下文,我是iOS / Objective-C的新手,具有web dev(Ruby / JS / C#)背景。我理解这些类是如何工作的,但我不明白为什么原始实现者编写这两个类(NSKeyedArchiverNSKeyedUnarchiver)而不是将编码和解码逻辑合并到一个类中。

阅读Apple documentation for the abstract class NSCoder一个NSCoder 有编码和解码的方法。我唯一能想到的是代码很长,所以最初的实现者将它分成2个......在我看来,开发人员只使用一个类就更方便了,但也许我我遗漏了一些细微之处。这有什么历史原因吗? NSCoder是“方便”,因为它定义了编码/解码API,但是要分成编码器/解码器?我误解了NSCoder应该做什么吗?

1 个答案:

答案 0 :(得分:3)

我认为在不同的类中保持归档和取消归档功能是应用Single Responsibility Principle的结果,communicational cohesion表示类必须具有单一的,狭窄的责任,应该完全封装在该类中。实际上,当您创建NSCoder子类的实例时,您可以将一组对象归档,或者将数据归档到一组对象中,但不能同时归结为两者。

这种设计并不理想,因为现在您有{{3}}链接的几对类(即NSArchiver / NSUnarchiverNSKeyedArchiver / NSKeyedUnarchiver)虽然单类设计会导致这种数据依赖性被完全封装。这是一个权衡,Cocoa库的设计者可以采取任何方式。看来他们选择单一责任原则,代价是引入数据格式依赖。