2011-02-06 2 views
6

「扱うすべて」タイプの方法があるかどうか...iPhone、isKindOfClassを使用していますか?例えば

if ([obj isKindOfClass:class1]) { 
    // ... 
} else if ([obj isKindOfClass:class2]) { 
    // etc.. 

はこの悪い習慣ですか?コードを構造化するためのより良い代替方法またはよりよい方法はありますか?

ランタイム、可読性、保守性など何か不利な点がありますか?

答えて

7

何かがとみなされるときは、良い/悪い練習であると、多かれ少なかれ主観的です。 何かをするとき、本来的に正しい/間違っている、それは多かれ少なかれ目的です。

isKindOfClass:は、クラスの継承をチェックするのに便利なメソッドです。それは唯一の質問に答えます。「与えられたクラスの(サブクラス)クラスのオブジェクトですか?」 「このオブジェクトは独自の方法でそのメソッドを実装していますか?」といった他の質問には答えません。または "XまたはYのためにオブジェクトを使用できますか?" isKindOfClass:を意図どおりに使用すると、問題は発生しません。結局のところ、動的型指定言語では、オブジェクトに関するメタ情報を抽出するツールが必要です。 isKindOfClass:は利用可能なツールの1つに過ぎません。

特定のオブジェクトがクラスについて嘘をついているかもしれないという事実は、実際にあなたを止めてはいけません。彼らは何も壊すことなく、自分自身を別のクラスのオブジェクトとして偽装します。それが何かを壊さないなら、どうして私は気にする必要がありますか?

主な点は、特定の目的のために、の正しいツールを必ず使用してください。たとえば、isKindOfClass:は、respondsToSelector:またはconformsToProtocol:に代わるものではありません。

1

並べ替えこの質問は基本的にあなたが求めていることを網羅しています:Is it safe to use isKindOfClass: against an NSString instance to determine type?

あなたが心に留めておく必要がある警告がありますが(上記のリンクを参照)、個人的にはわかりやすい方法だと思います。あなたは、あなたの条件テストの中であなたがやっていることが適切であることを確認する必要があります(Appleが "オブジェクトの行に沿っている例はと言います。NSMutableArrayの一種ですが、 )。

0

私はあなたがアンチパターンにした例を考えています。だから、それは有害だと言います。そのようなisKindOfを使用すると、多態性とオブジェクトの向きが崩れます。

私はこれまで、あなたが呼び出すことを好む:

[obj doTheThing]; 

をして、あなたのサブクラスで異なるdoTheThingを実装します。

objが制御できないクラスに属する場合は、カテゴリを使用してdoTheThingメソッドを追加します。デフォルトの動作が必要な場合は、NSObjectにカテゴリを追加します。

これは私の意見ではよりクリーンな解決策であり、ロジック(実行していること)と実装の詳細(オブジェクトの特定の種類に対して行う方法)を分離するのに役立ちます。

+0

イントロスペクションツールを使用する必要性を避けるために、カテゴリ内でメソッドを実装すると、私にとってはより悪くなります。 NSJSONSerializationの 'JSONObjectWithData:options:error:'は異なる型を返すかもしれません。 (配列、辞書)。辞書のハッキング方法を配列に変換し、その逆も私にとっては非常に愚かなものにします。 – vikingosegundo

+0

サブクラスにメソッドが必要な場合はどうなりますか? –

+0

サブクラスのみにメソッドが必要な場合は、何もしないデフォルトの実装と、何かを行うサブクラスでオーバーライドされたメソッドを持つ基本クラスにメソッドを持たせます。 –

関連する問題