classをMyClass
介して API/Datalayer/external-something と通信する Objective-C クラスが与えられた場合、(周囲のアーチに応じて)コンストラクターで のインスタンスを受け取って受け取るか、 のインスタンスを必要とする各メソッド呼び出しに渡す必要があります。繋がり。この方法では、アプリケーション ロジックをカプセル化し、接続の詳細を無視することができます。Connection
MyClass
Connection
Connection
MyClass
MyClass
さまざまな外部コンポーネントまたは単体テストでロジックを再利用するには、 class の代わりにMyClass
protocol() を使用するのが適切です。このように、さまざまなクラス (たとえば、ConnectionHttp、ConnnectionAPI2、ConnectionTestingEmulateProxyIssue など)を実装している限り、それらを使用できます。ConnectionProtocol
Connection
MyClass
ConnectionProtocol
ここで、開発者が 、 で繰り返されMyClass
、MyOtherClass
で一連の操作を実行するコード ブロックを持っているとしConnectionProtocol
ます。これはDRY原則に違反するため、受け入れられません。
MyClass
、MyOtherClass
、および は (NSObject 以外の) 共通の基底クラスを共有しないため、開発者は単純に機能を基底クラスにマージすることはできません。の各実装で機能を繰り返す必要があるため、DRY
ConnectionProtocol
に再び違反するメソッドを追加します。ConnectionProtocol
メソッドを
@optional
メンバーにするConnectionProtocol
ことはまだ機能しません。- メソッドは頻繁に使用され、各実装で実装する必要があります。
- メソッド ロジックは、 SoCに違反する接続ではなく、アプリケーションに固有のものです。
ConnectionProtocol
開発者は、渡されたオブジェクトがプロトコルを実装しているかどうかを確認し、必要な操作を実行するカテゴリを NSObject に追加することを検討しています。これには欠点があります。- NSObject のメソッド スペースは、カテゴリが使用されているファイル内のすべてのオブジェクトに対して汚染されています。
- カテゴリ メソッドが正しく呼び出されないエラーはランタイムにキャッチされ、開発者は何らかの理由で厳密に型指定された言語を選択しました
ConnectionProtocol
カテゴリを使用して拡張されます。これは DRY 原則に違反せず、SoC を尊重します。ただし、Objective-C 仕様に違反しています。@implementation id< ConnectionProtocol > (AppLogicMethods) -(void)specialMethod:(NSObject*)myParam { // Do Stuff } @end
DRYに違反せず、 SoCを尊重し、Objective-C の制限を満たすことなく、この問題を解決するにはどうすればよいでしょうか?