classをMyClass介して API/Datalayer/external-something と通信する Objective-C クラスが与えられた場合、(周囲のアーチに応じて)コンストラクターで のインスタンスを受け取って受け取るか、 のインスタンスを必要とする各メソッド呼び出しに渡す必要があります。繋がり。この方法では、アプリケーション ロジックをカプセル化し、接続の詳細を無視することができます。ConnectionMyClassConnectionConnectionMyClass
MyClassさまざまな外部コンポーネントまたは単体テストでロジックを再利用するには、 class の代わりにMyClassprotocol() を使用するのが適切です。このように、さまざまなクラス (たとえば、ConnectionHttp、ConnnectionAPI2、ConnectionTestingEmulateProxyIssue など)を実装している限り、それらを使用できます。ConnectionProtocolConnectionMyClassConnectionProtocol
ここで、開発者が 、 で繰り返され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 の制限を満たすことなく、この問題を解決するにはどうすればよいでしょうか?