3

Чтобы дать некоторый контекст, я новичок в iOS/Objective-C с веб-дизайном (Ruby/JS/C#). Я понимаю, как работают классы, но я не понимаю, почему первоначальные разработчики написали эти два класса (NSKeyedArchiver и NSKeyedUnarchiver) вместо того, чтобы объединить логику кодирования и декодирования в один класс.Почему NSKeyedUnarchiver существует, когда NSKeyedArchiver наследуется от NSCoder?

Чтение Apple documentation for the abstract class NSCoder a NSCoderимеет методы как для кодирования, так и для декодирования. Единственное, что я могу придумать, это то, что код был длинным, поэтому первоначальный разработчик разделил его на 2 ... Мне кажется, что разработчику было бы более удобно использовать только один класс, но, возможно, m пропустил что-то нюансированное об этом. Так есть ли исторические причины для этого? Было ли «NSCoder» «удобством» в том, что оно определяет оба API кодирования/декодирования, но предназначено для разделения на кодировщик/декодеры? Я не понимаю, что должен делать NSCoder?

ответ

3

Я считаю, что сохранение функций архивирования и разборки в отдельных классах является результатом применения Single Responsibility Principle, в котором говорится, что класс должен иметь единую, узкую ответственность, которая должна быть полностью инкапсулирована внутри этого класса. Действительно, когда вы создаете экземпляр подкласса NSCoder, вы делаете это либо для архивирования группы объектов, либо для разблокирования данных в группу объектов, но не для обоих.

Эта конструкция не идеальна, потому что теперь у вас есть несколько пар классов (т.е. NSArchiver/NSUnarchiver и NSKeyedArchiver/NSKeyedUnarchiver) связаны communicational cohesion, в то время как дизайн одного класса привело бы к этой зависимости от данных в полной мере инкапсулированные. Это компромисс, по которому дизайнеры библиотеки Cocoa могли пойти в любом случае. Похоже, что они выбрали принцип единой ответственности, ценой введения зависимости формата данных.

+1

Может быть правдой, а затем Apple создала NSPortCoder, который фактически реализует как кодирование, так и функцию декодирования. Если я правильно понимаю документацию Apple, методы кодирования и декодирования иногда были разбиты на разные классы по соображениям производительности (см. Последние 2 параграфа): https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/Archiving /Articles/subclassing.html#//apple_ref/doc/uid/20000951 –

+0

@WolfgangSchreurs Это то, что я пытался сделать, - что нет идеального дизайнерского решения этой проблемы, поэтому дизайнеры Cocoa должны были взять один или другой , Благодаря! – dasblinkenlight

+0

Спасибо @dasblinkenlight за ответ, оценили концептуальные ссылки :) Но я все еще немного запутался с NSCoder, так как он, кажется, нарушает SRP, имея методы как для кодирования/декодирования (как NSArchiver, так и NSUnarchiver наследуют от него). Почему бы не выделить два отдельных абстрактных класса: NSEncoder и NSDecoder? Мне кажется странным, что NSArchiver расшифровывает методы для этого ... Но опять же, я все еще ObjC noob :) –

Смежные вопросы