0

私はiPhoneアプリをプログラミングしており、この質問で推奨されているように定数をConstants.hおよびConstants.mファイルに配置しています: Constants in Objective-C

私の質問は、Constants.h で typedef 列挙型を定義し、classes .h ファイルの 1 つでその typedef 列挙型のプロパティを宣言したい場合、それを実装するための正しい方法論は何ですか? typedef 列挙型を Constants.h から、classes .h ファイルに移動する必要がありますか? グローバル定数ファイルを持つ目的を無効にしているようです...

4

2 に答える 2

8

これらのスコープに関する質問に対する私の答えは、宣言を必要な最小のスコープに制限することです。

実装で列挙のみが必要な場合は、宣言を .m に入れます。列挙型がインターフェイスでのみ必要な場合は、宣言をインターフェイスの .h に入れます。列挙型が複数の独立したインターフェイスで必要な場合は、それをグローバル .h ファイルに入れることに頼ります。

これを行う理由は 2 つあります。1) スコープを制限すると、マージが減少します。2) スコープを制限すると、変更によって影響を受けるファイルの数が減ります。

すべての typedef が 1 つのファイルにある場合、2 人の開発者がいずれかのタイプを更新するたびに、そのうちの 1 人がコミット時にマージする必要があります。これまでの人生で、不適切なマージによって作成された十分なエラーに対処してきました。私はそれらを避けようとします。

プログラム内のすべてのファイルに含まれるファイルがある場合、そのファイルへの変更はプログラム内のすべてのファイルに影響します。コミットのないモジュールにバグのある製品コードを出荷しました。グローバルインクルードへの変更は、モジュールが変更されていないように見えたため、誰も予期せず、誰もテストしなかった問題を引き起こしました。

于 2012-05-14T04:37:43.233 に答える
3

は、 、、またはその他の型のような型として使用できる名前を作成します。これは型 _def_initionですtypedef。コンパイラは、その型の変数を宣言したい場所を認識できる必要があります。つまり、型を使用するファイルに Constants.h をインポートするだけで済みます。intBOOLtypedef

// Constants.h
typedef unsigned int Nimitz;

#import "Constants.h"

@interface Excelsior : NSObject

@property (assign) Nimitz numPlanes;

@end
于 2012-05-14T03:38:45.000 に答える