0

私は非常に単純な TableViewController を持っています。ここでは、データ ソース メソッドと、データ ソースを変更する他の 2 つのメソッドのみを実装しています。テーブルのdataSource配列は、@"dataSourceTableViewController の NSDictionary プロパティのキーから取得された配列classDataです。これは、dataSource私の TableViewController で配列を使用する最良の方法です。

1) .h でプロパティを定義し、そのプロパティを辞書の@"dataSourceキーに設定します。viewDidLoad

@property (strong, nonatomic) NSMutableArray *dataSource;

2) .m インターフェイスで変数を定義する

@interface TableViewController () {
    NSMutableArray *dataSource;
}
@end 

3)必要なすべてのメソッドで配列のインスタンスを作成します

NSMutableArray *dataSource = [self.classData objectForKey: @"dataSource"];

アプリ内のどのクラスも配列にアクセスする必要がないため、オプション 2 に傾いています。ただし、オプション 3 では、さらにカプセル化されたままになります。この単純な状況に対する正しいアプローチを知りたいです。

4

3 に答える 3

1

パブリックインターフェイスではなく、プライベートクラス拡張でプロパティを宣言することもできます。これにより、それを真のプロパティとして維持し(setter / getter methotsの利点を活用して、後でそれが有用になった場合にオーバーロードできます)、値をクラスに対してプライベートに保つことができます。

詳細については、こちらを参照してください: http: //developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW2

補足として、プライベートクラス拡張はプライベートメソッドを作成する方法も提供します。

于 2012-10-11T17:42:33.110 に答える
1

オプション 1 と 2 の間の決定は非常に簡単に解決できます。それはすべて、datasource公開するか非公開にするかによって異なります。プライベートの場合は、オプション 2 を使用します。

一方、オプション 3 は、実際には適切なオプションではないようです (1 または 2 のいずれかが適切である場合)。

あなたdatasourceがローカル変数であることを意図している場合(つまり、変数のライフサイクル全体が含まれているメソッドランタイムによってバインドされている場合)、それは問題ありません。しかし、この場合、その変数をインスタンス変数として宣言することさえ考えないでしょう。

変数をインスタンス変数として宣言するのは、宣言クラスのいくつかのメソッドへの複数の呼び出しでその値を共有する必要がある場合です (同じメソッドが異なる時間に呼び出された場合でも)。これにより、変数がローカルかインスタンスかが決まります。

staticスコープが宣言メソッドに限定されたグローバル変数を使用することを意味する場合、これは表面的にのみ魅力的です。実際、それに関する問題は、将来必要とされる使用を正確に予測できないことですdatasource。何らかの理由で別の方法からアクセスする必要がある場合、その設計は適応しません。自体。

より一般的に言えば、カプセル化に関して言えば、OOP では、カプセル化の正しいレベルはクラス レベル、IMO だと思います。これにより、オプション 3 も除外されます。

于 2012-10-11T15:43:22.327 に答える
0

オプション#3のあなたの声明がわかりません。効率の悪いコードを書くと、どのようにしてよりカプセル化されるのでしょうか? 個人的には、オプション #2 が適切な選択です。

于 2012-10-11T15:43:42.920 に答える