7

プロパティまたはメソッドを介して特定のデータを公開する必要があるかどうかを判断するのに苦労することがよくあります。「オブジェクトの状態にプロパティを使用する」と言うことができますが、それはあまり満足のいくものではありません。たとえば、次の例を見てください。

- (NSString *)stringOne
{
    return _stringOne;
}

- (NSString *)stringTwo
{
    return _stringTwo;
}

- (NSString *)mainString
{
    return [_stringOne length] > 0 ? _stringOne : _stringTwo;
}

stringOneおよびstringTwoがプロパティであることは明らかです。これらは明らかにオブジェクトの状態だからです。mainStringただし、プロパティにする必要があるかどうかは明確ではありません。エンドユーザーにとってはmainString状態のように振る舞います。あなたのオブジェクトにmainString は、状態ではありません

この例は不自然ですが、理解していただければ幸いです。はい、プロパティはゲッターとセッターを作成するための便利な方法にすぎませんが、ユーザーに何かを伝えるものでもあります。プロパティとメソッドをいつ使用するかを決定するための適切なガイドラインはありますか?

4

3 に答える 3

5

「真の」状態(string1およびstring2あなたの例では)と「動的な」状態(mainString)の間の分割を隠すことは、まさにプロパティの目的です。

標準的な例は、おそらく「状態」として与えられた姓名を持つ人を表すオブジェクトでしょう。状態の 3 番目の部分である「フル ネーム」は、これら 2 つの部分から提示できますが、フル ネームがオンデマンドで構築されるのか、それとも両方の部分が設定されたときに作成および保存されるのかをクライアントが知る理由はまったくありません。それは単に問題ではありません。

プロパティはインターフェイスです。このクラスがクライアントに提供するデータのビット (およびクライアントがクラスについて構成できるもの) は何ですか? 各プロパティの実装はカプセル化されており、プロパティとしてのステータスには影響しません。

もちろん、ObjC ではメソッドを使用してプロパティにアクセスします。ただし、他のメソッドは、オブジェクトが実行できるアクションを表し、操作するデータの一部が渡される可能性があります。

于 2012-08-19T21:11:01.947 に答える
1

考慮すべきもう 1 つの考慮事項: プロパティの値を保存しますか? (たとえば、NSCodingまたはCore Dataを介して)「保存」する必要があるもののプロパティを作成する必要があると思います(たとえば、「encodeWithCoder」で。encodeWithCoderに何を入れたいかを決めると、どちらの方法を使用するかを決めるのに役立ちますものを定義します)。

保存する必要がなく、簡単に再計算できるものについては、メソッドと読み取り専用プロパティのどちらかを選択できます (内部的には同等です。読み取り専用プロパティは getter アクセサー メソッドを作成するだけで、インスタンス変数はありません)。それをバックアップします)。つまり、それはスタイルの問題です。

スタイルについて言えば、(私のように) プロパティのみにドット表記を使用する場合、疑問に思うかもしれません:と foo.lastName ? - または、[foo fullName] でフルネームにアクセスして、これが計算されていることを世界に示すことで違いを生み出したいですか?

株価を追跡するためのアプリを作成しました。このモデルは、Objective C に関する Big Nerd Ranch の本の例から着想を得ました (ちなみに、よく読んでください)。プロパティとメソッドの定義方法は次のとおりです。

// properties
@property (nonatomic, copy)   NSString *name;
@property (nonatomic, copy)   NSString *symbol;
@property (nonatomic, copy)   NSString *currency;
@property (nonatomic, copy)   NSString *market;
@property (nonatomic)         int    numberOfShares;
@property (nonatomic)         double purchaseSharePrice;
@property (nonatomic)         double currentSharePrice;

// Stock Calculation methods
- (double)costInLocalCurrency; // purchaseSharePrice * numberOfShares
- (double)valueInLocalCurrency; // currentSharePrice * numberOfShares
- (double)gainOrLossInLocalCurrency // valueInLocalCurrency - costInLocalCurrency

明確に区別されていることがわかります。BNR は本でドット表記をまったく使用しないため、[foo currentSharePrice] または [foo valueInLocalCurrency] のようにすべて同じように見えますが、プロパティにドット表記を使用しているため、foo 間でスタイルに違いが生じます。 currentSharePrice と [foo valueInLocalCurrency]。

これが役に立てば幸いです。

于 2013-12-28T10:42:42.150 に答える
0

設計上、常にエンド ユーザーを尊重する必要があります。それがクラスのユーザーのオブジェクト状態であると思われる場合 (明らかにそうです)、先に進んでそれからプロパティを作成してください。

于 2012-08-19T20:58:44.003 に答える