2009-05-14 8 views
4

は、あなたがこのコード行を考える何を参照してください:Obj-Cでのドット演算子の過剰使用の代替方法は何ですか?

if ([pickerViewController.picker.bvc.currentResolve.name isEqualToString:message]) 
    ... 

あなたは、これは、ドット演算子の過度の使用であると考えますか?

もしそうでなければ、私はそのままにしておくことができます。

もしそうなら、好ましい選択肢は何ですか?

答えて

10

これは、ドット演算子の問題よりも多く、Law of Demeter違反です。これを行うには、「クリーン」な方法は、あなたがそこにドット演算子を使用するたびに、本当に財産をフェッチしている限り、

if ([pickerViewController hasPickedName:message]) 
+0

私はこれを2番目にします。あなたはそれを深刻に悪用するために熱心で厳格なユーザーまたはLoDのファンである必要はなく、おそらくこうした種類のものをコード化する努力を払う必要があります。 –

+1

合意。トップレベルのオブジェクトは、プライベートであるはずのプロパティを公開する可能性のある、あまりにも多くの下位レベルのオブジェクトの内部動作について、あまりにも多くの知識を持っています。 パブリックプロパティは、 "bvc"のような名前であってはなりません(別のビューコントローラと似ているかもしれませんが、おそらくMVCを迷っているかもしれません)。 Objective-Cは、文章の簡潔さではなく、読みやすさに基づいています。強力なコンパイラチェックの欠如は、バグに対する最も強力な保護手段の1つを残酷に一貫して命名します。 –

0

私はプロパティ表記の過剰使用は考えられません。オブジェクトにプロパティがある場合は、そのオブジェクトにアクセスします。それはプログラマーが何を意味するかを読者に実証している。

ああ、「構造体のように見える」旅団を先制する。あなたのコード内のオブジェクトからstrucを伝えることができない場合は、あなたのコードをリファクタリングしてください。

0

ような何かを行うことができるように、自分自身をこれを理解するために、オブジェクトにロジックを与えることであろう(つまり、主に価値を返す以外の目的で仕事をすることに関係する方法ではない)、それは問題ありません。実際、Wil Shipleyのブログをチェックすると、実際には、必要に応じて多くの関数呼び出しを1行にまとめることができます(ローカル変数の過度の使用を嫌う)。

0

私は、この種のデバッグは常に価値があるよりも問題であることが分かります。したがって、私は各プロパティアクセスの中間変数を作成する傾向があります。または、他の人が示唆しているように、これをリファクタリングすることで、(スマートをメソッドに入れて)使用サイトで簡単に見えます。

0

私はChuckとコメント投稿者に同意します。あなたの方法は他の多くのオブジェクトに依存していますが、pickerViewControllerhasPickedName:を入れても、何とかは[picker.bvc.currentResolve.name isEqualToString:message]となります。

代わりに、Interface Builderのを使用して、トップレベルのオブジェクトに(多分id<NamePickerDelegate>を入力)bvchasPickedName:を入れて、デリゲートとしてbvcを注入できます。本当にデメテルに準拠するには、currentResolveというメソッドをnameMatches:というショートカット[currentResolve.name isEqualToString:message]にするようにしてください。

問題によって引き起こされる複雑さと、各ソリューションで導入される複雑さを注意深く見てください。元のコードが代替コードより簡単でメンテナンスが簡単であると判断した場合は、そのまま使用してください。

関連する問題