2011-01-21 13 views
3

Iは、以下のいずれかがサービス指向設計のObjective-Cでは正しい使い方/実装されるであろう思っている:Objective-Cでサービス指向アーキテクチャを実装する方法は?

最初のバージョンは、プロトコル(インターフェイス)を使用して、静的言語に固有であります

// 
// get the cloud service from our service provider 
// 
id<CloudServices> myService = [ServiceProvider serviceWithProtocol:@protocol(CloudServices)]; 

第二のバージョンは、プロトコルを使用していないのObjective-Cは、実際に動的であるという事実に依存している:

// 
// get the cloud service from our service provider 
// 
CloudServices *myService = [ServiceProvider serviceWithClass:[CloudServices class]]; 

明らかに差がインタフェースまたはプロトコルであるCloudServices、我々ありますServiceProviderがCloudServicesのさまざまな実装を返すように設定できることを意味します。

私の質問はどのスタイルを選択するのですか、なぜですか?
ありがとうございました。

答えて

1

サービスの仕組みによって異なります。クラスを使用すると、ServiceProviderは必要に応じてクラスをインスタンス化し、オブジェクトの初期化を実行できます。プロトコルを使用することで、ServiceProviderはサービスに使用できるクラスを知る必要があり、誤ったクラスを渡す際のバグを防ぐことができます。また、1つのクラスに複数のプロトコルを実装させることで、serviceWithProtocolへのさまざまな呼び出しに使用することもできます。

短いバージョン:クラスを使用する方が簡単です。プロトコルを使用するほうが柔軟性があり、おそらくより安全です。

+0

回答ありがとう@ughoavgfhw。 obj-cは動的言語であるため、サービスプロバイダで必要なものはすべて実行できます。つまり、要求されたサービスのように動作するインスタンスを返すことさえできます。 したがって、isKindOfClass(および関連するメソッド)をオーバーライドして、必要なオブジェクトを返すことができるので、柔軟性はおそらく問題ではありません。 安全上の注意:正確に何を念頭に置いていますか? – Moszi

+0

@Moszi私は、conformsToProtocol:を使うことができるので、柔軟性はプロトコルで簡単だということを意味しました。安全性については、クラスを使用する場合、誰かが不要なクラスを送信するプログラムに何かをロードする可能性があります。あなたの実装で何とかこれをチェックする必要があります。 – ughoavgfhw

+0

ありがとう:) - 私はプロトコルで行く;) – Moszi

関連する問題