2

は、私は2つのモデルクラス、UserPlaceを持っています。iPhone - モデルクラス内部のネットワークコード - コード設計上の問題

私は自分のサーバーから取得したユーザーの近くの場所を取得する必要があります。 ユーザーはcurrentLocationのプロパティを持っています。

PlaceクラスはgetNearByPlacesForLocationのようなメソッドを持つ方が適切だと感じましたので、私はPlaceクラス内の静的メソッドとして考えました。

私は約2事を思ったんだけど:

  1. は、右のアーキテクチャのようなこの音をしていますか?
  2. 私のモデル(この例ではgetNearByPlacesForLocation)の中にネットワークコードを入れてもいいですか?またはおそらく私は 'NetworkManager'のようなシングルトンを使うべきですか?この場合、私のモデルはこの 'NetworkManager'クラスに依存しているので再利用できません。 どうすれば解決できますか?私はこのデザインになったいくつかの思考の後

User.m

@implementation User 

@synthesize currentLocation; 

- (NSArray*) getNearbyPlaceForCurrentLocation 
{ 
    [Place getNearByPlacesForLocation:currentLocation]; 
} 

@end 

Place.m

#import "Place.h" 
#import "NetworkServicesDataSource.h" 

@implementation Place 

static id<NetworkServicesDataSource> _networkDataSource; 

+(void) setNetworkManager:(id<NetworkServicesDataSource>)networkDataSource 
{ 
    _networkDataSource = networkDataSource; 
} 

+(NSArray*) getNearByPlacesForLocation:(CLLocationCoordinate2D) loc 
{ 
    return [_networkDataSource getNearByPlacesForLocation:loc]; 
} 

@end 

NetworkServicesDataSource.h

​​

私は何らかの依存性注入を行うことができ、Placeクラス内の特定のネットワーキング実装に依存しません。

私はまだ興味がありますが、それぞれのモデルクラス内にこれらのメソッドを持たせることは、単なる責任である 'NetworkManager'シングルトンを持っているよりも、私がサーバーから要求するデータを取得することよりも優れています。 「UIViewControllers」内に「NetworkManager」と表示されます。 UIViewControllerのモデルオブジェクトとやりとりして、そこからデータを聞くのがよりクリーンで構造化されているように感じますが、他の人の意見を聞いてうれしいです。

答えて

0

あなたは完璧だと言っています。あなたのUIコードとコントローラコードは別のものにする必要があります。他のアプリケーションに入れたい場合、または別のiPad/iPhoneバージョンのアプリケーションを作成したい場合は、同じコードを再入力してください。 UI設定を変更するだけで済みますし、ネットワークマネージャクラスを開発する場合は、他のアプリに簡単に配置することができます。コードは独立したものになり、管理しやすくなります。