私はこのようなデザインの選択に頻繁に遭遇し、少し苦労します。私は他のいくつかの視点を探しています。
私はしばしば、基本的に単なる値のセットである状態のリストを保持したり、状態のチャンクを渡したりしたいと思います。値はプリミティブ型になる傾向があります:float、NSTimeIntervals、CGPointsなど。
私の最初の傾向は、これらのプロパティのセットに対してC構造体を作成することです。
typedef struct _STATE {
float foo;
NSTimeInterval elapsed;
CGPoint point;
} STATE;
等
しかし、C構造体はネイティブのCocoaコレクションクラス(NSArray
、、 )NSSet
とNSDictionary
うまく連携せず、それらの多くを使用して多くの状態を追跡すると、Cocoaに適した残りのコードの粒子に反するように感じます。構造体の配列を直接管理し、メッセージなどで構造体ポインタを渡します。
一方、生のパフォーマンスは必ずしも重要ではないため、これらの値をNSDictionaryにエンコードして、すべてをNSValue
またはNSNumber
でラップすることはできますが、結果の構文はほとんど簡潔ではなく、少し壊れやすく、実行時に型と名前の正確さが要求されます。挿入とルックアップの両方:
[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
...
float something = [[stateDict objectForKey:@"bar"] floatValue];
また、NSTimeIntervalなどの一部のタイプは、一部の(議論の余地のある)ハッカーでのみ使用できます(この場合は2倍に型キャストされます)。
最後に、プライベートメンバーデータとゲッター/セッターのみを使用して、データのみのコンテナーオブジェクトを作成できました。(これらはJavaでは「beans」と呼ばれます。)これらは辞書よりもアクセスが簡単で、構造体よりもCocoaですが、特に状態管理に使用される「内部クラス」としてのみ必要な場合は、やり過ぎのように感じます。単一のオブジェクトタイプの内部。
ココアプログラミングの大衆であるあなたはどうやってこれをしますか?