2009-06-19 9 views
8

私がココアについて最も気に入っていることの1つは、可読性の要素です。便利なコンストラクタを "with"で起動してみませんか?

私を悩ますことの1つは、繰り返しを強制する便利なコンストラクタのコンベンションです。ここで

は例です:

[NSString stringWithString:s] 

[NSNumber numberWithDouble:d] 

[NSValue valueWithInt:i] 

[NSDictionary dictionaryWithObjectsAndKeys:<blah>] 

など

なぜ規則は、単に「と」言葉でコンビニエンスコンストラクタを起動しませんか?そう、我々は持っているでしょう:

[NSString withString:s] 

[NSNumber withDouble:d] 

[NSValue withInt:i] 

[NSDictionary withObjectsAndKeys:<blah>] 

など

をそれはマイナーな論点だが、一つは、私はちょうどそこに投げると、私よりも多くの影響力を持つ誰もが内のすべてのエコーを説明できるかどうかを確認するだろうと思いました私の頭。

明らかに、私は私の提案に賛成してappKitを書き直すようにAAPLに請願するつもりはありませんが、私自身の便利なコンストラクターをそのように命名することに対して何らかの議論がありますか?

私は自分のコードでどんな慣習を使っても構いませんが、私は盲目的に上流で泳ぐことはできません。

答えて

13

実際にはそのような技術的理由があります。 shoelaceWithString:のメソッドがすべてwithString:に変更された場合、同じ名前のメソッドと異なるシグネチャを持つ恐ろしい数のクラスになります。これは、コンパイラの静的型チェックの意味を持ち、あらゆる種類の厄介で不必要な警告をスローする可能性があります。

開発者が自分のコードを好きなときに自己文書化するというココア文化の側面もあります。これは、メソッド名が、引数が何であるか、そしてそれらが返すものの両方を示すことを意味します。 Appleのコーディングガイドラインでは、あまりにも曖昧な名前のメソッドについて実際に警告しています。名前に単語を追加することで、メソッドが何をするのかが明確になることが推奨されます。

+0

ありがとう、チャック。これは非常に有益な情報です。私はあなたの応答に感謝します。 – kent

-2

あなたが好きではない場合は、すべてのプロジェクトに含める#define文の束を書き上げてみませんか?

+0

これは間違いなく私がしかし、多くの時間が不思議に思っています。しかし、はい、頻繁に使用されるconv-contrの型をはるかに短くて簡単にするマクロをいくつか持っています...技術的に言えば、それらの定義はアンチパターンを表していませんか? – kent

+5

これはひどい考えだと思います。たとえそれがあなたにとって理にかなっていても、他の人がそれを維持しなければならない場合、あなたのコードは読みにくくなります。 –

+1

したがって、アンチパターン。 – kent

3

私はそれが、ココアフレームワークの語義哲学の一般的な「ちょうどあなたの言いたいことを言う」の一部だと思います。いくつかの選択肢の選択:

[UIView setAnimationBeginsFromCurrentState] 
[UITableView scrollToNearestSelectedRowAtScrollPosition] 
[UIApplication didRegisterForRemoteNotificationsWithDeviceToken] 

など

ETA:

、具体的なコンストラクタについての質問に答えるために、それらが行われる方法についての私の好きなことの一つは、それがX-コード内で簡単だということですどのメソッドがコンストラクタ型メソッドであるかを識別します。

[NSString string 

そして「インテリセンスは、」もちろん、すべてのコンストラクタ・メソッド(およびすべてが便利なだけでなく、一緒にグループ化)されている「文字列」で始まるものにメソッドのリストを下にwhittles:たとえば、あなたが入力を開始します。同じことが "init"の規則に当てはまります。

+1

C#から来て、int、a、b、c; ...: -/ – balexandre

+0

@eric:私は同意する、笑。あなたの例では、実装ファイルを読むのが良いです。しかし、この "ローガーローガー"のケースでは、実装は吃音ですが、宣言は賢明に見えます。あなたが宣言を一度入力することになるので、皮肉なことですが、残りの人生のために実装してください... – kent

10

これは一貫しているためです。

のような方法があります。withまでのすべて退治

[NSDictionary dictionary] 
[NSArray array] 

は、ここでは明らかにオプションではありません。これらを維持するが、他のものを短縮すると、便利な方法の命名に矛盾が生じる。

そして便利な方法は、initおよびinitWith…の方法と一致する。

+0

...... roger、roger。 – kent

3

最終的に、Objective-Cの哲学は、Cocoaフレームワーク(およびその前のNextStepフレームワーク)によって具体化され、明示的であり、保守が容易であると信じています。この哲学の主な証拠は、Objective-Cセレクタに名前付き引数(例:-[NSObject performSelector:withObject:])があることです。

+[NSString stringWithString:]などのファクトリメソッドの場合、サブクラスはこれらのクラスメソッドをオーバーライドしてサブクラス(たとえば、NSNumberなどのクラスクラスタ)を返すことがあることを覚えておく必要があります。のような呼び出しで終了することがあります。その場合、多くのファクトリメソッドがタイプidを返すことを思い出して、-[MyPoorlyNamedSubclass withString:]は、返されるオブジェクトの型に関して明らかに有益ではありません。一方、stringWithString:は、メソッドが文字列(またはそのサブクラス)を返すことが明らかになります。

2

また、1つの余分な単語を使って、オブジェクトがオートリリースされているかどうかを確認します。 initWithFormatはオートレリースされていないもので、stringWithFormatがオートレリースされている場合は...オブジェクトが使用するメモリ管理の種類を読者に伝えるようになったと思います...