4

コンテキストを提供するために、私は iOS/Objective-C を初めて使用し、Web 開発 (Ruby/JS/C#) のバックグラウンドを持っています。クラスがどのように機能するかは理解していますが、元の実装者が、エンコードとデコードの両方のロジックを 1 つのクラスに統合する代わりに、これら 2 つのクラス (NSKeyedArchiverと) を作成した理由がわかりません。NSKeyedUnarchiver

抽象クラスaのApple ドキュメントをNSCoder読むにはNSCoder 、エンコードとデコードの両方のメソッドがあります。私が考えることができる唯一のことは、コードが長いため、元の実装者が2つに分割したことです...単一のクラスのみを使用する方が開発者にとって便利だと思われますが、多分私は'これについて何か微妙なところがありません。では、これには何か歴史的な理由があるのでしょうか? NSCoderエンコード/デコード API の両方を定義するという点で「便利」でしたが、エンコーダー/デコーダーに分離することを意図していましたか? aNSCoderが何をすべきか誤解していますか?

4

1 に答える 1

3

アーカイブ機能とアーカイブ解除機能を別々のクラスに保持することは、単一の責任の原則を適用した結果だと思います。これは、クラスには単一の狭い責任が必要であり、その責任はそのクラス内に完全にカプセル化する必要があるというものです。実際、 のサブクラスのインスタンスを作成するときはNSCoder、オブジェクトのグループをアーカイブするか、データをオブジェクトのグループにアーカイブ解除するかのいずれかを行いますが、両方を行うわけではありません。

この設計は理想的ではありません。これは、コミュニケーションの結束によってリンクされた複数のクラス (つまりNSArchiver/NSUnarchiverNSKeyedArchiver/ ) のペアがあるためです。一方、単一クラスの設計では、このデータ依存関係が完全にカプセル化されます。これは、Cocoa ライブラリの設計者がどちらの方法でも取り得るトレードオフです。彼らは、データ形式の依存関係を導入するという代償を払って、単一責任の原則を選択したようです。NSKeyedUnarchiver

于 2013-12-05T16:08:34.843 に答える