为了提供一些背景信息,我是第一次接触iOS / Objective-C,具有Web开发(Ruby / JS / C#)背景。我了解这些类的工作原理,但是我不理解为什么原始实现者编写了这两个类(NSKeyedArchiverNSKeyedUnarchiver),而不是将编码和解码逻辑都合并到一个类中。

读取Apple documentation for the abstract class NSCoder NSCoder 可以对进行编码和解码。我唯一能想到的是代码很长,因此原始的实现者将其分成2个……在我看来,对于开发人员来说,只使用一个类会更方便,但也许我我错过了一些与此有关的细微差别。那么,有任何历史原因吗? NSCoder是否在定义编码/解码API的同时,又要分为编码器/解码器,因此是一种“便利”?我是否误解了NSCoder应该做什么?

最佳答案

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

这种设计并不理想,因为现在您有几对通过ojit_a链接的类(即NSArchiver / NSUnarchiverNSKeyedArchiver / NSKeyedUnarchiver),而单类设计将导致这种数据依赖关系被完全封装。这是可可图书馆的设计者可以选择的一种折衷方案。他们似乎选择了单一责任原则,但以引入数据格式依赖性为代价。

10-06 04:09