为了给出一些上下文,我是iOS / Objective-C的新手,具有web dev(Ruby / JS / C#)背景。我理解这些类是如何工作的,但我不明白为什么原始实现者编写这两个类(NSKeyedArchiver
和NSKeyedUnarchiver
)而不是将编码和解码逻辑合并到一个类中。
阅读Apple documentation for the abstract class NSCoder
一个NSCoder
有编码和解码的方法。我唯一能想到的是代码很长,所以最初的实现者将它分成2个......在我看来,开发人员只使用一个类就更方便了,但也许我我遗漏了一些细微之处。这有什么历史原因吗? NSCoder
是“方便”,因为它定义了编码/解码API,但是要分成编码器/解码器?我误解了NSCoder
应该做什么吗?
答案 0 :(得分:3)
我认为在不同的类中保持归档和取消归档功能是应用Single Responsibility Principle的结果,communicational cohesion表示类必须具有单一的,狭窄的责任,应该完全封装在该类中。实际上,当您创建NSCoder
子类的实例时,您可以将一组对象归档,或者将数据归档到一组对象中,但不能同时归结为两者。
这种设计并不理想,因为现在您有{{3}}链接的几对类(即NSArchiver
/ NSUnarchiver
和NSKeyedArchiver
/ NSKeyedUnarchiver
)虽然单类设计会导致这种数据依赖性被完全封装。这是一个权衡,Cocoa库的设计者可以采取任何方式。看来他们选择单一责任原则,代价是引入数据格式依赖。