6

実際のプライベート メソッドを使用する代わりに、ブロックを使用してメソッド内でプライベート メソッドを定義することの欠点は何ですか? 他の場所からメソッドを呼び出せないこと以外に何かありますか?

例:

-(NSDictionary*)serialize
{   
    NSMutableDictionary* serialization = [NSMutableDictionary dictionary];

    TwoArgumentsBlockType serializeItemBlock = ^void(MyItemClass* item, NSString* identifier)
    {       
        if (item)
        {
            // serialization code
        }
    };

    serializeItemBlock(self.someItem1, kSomeIdentifier1);
    serializeItemBlock(self.someItem2, kSomeIdentifier2);
    serializeItemBlock(self.someItem3, kSomeIdentifier3);
    serializeItemBlock(self.someItem4, kSomeIdentifier4);
    serializeItemBlock(self.someItem5, kSomeIdentifier5);
    serializeItemBlock(self.someItem6, kSomeIdentifier6);
    serializeItemBlock(self.someItem7, kSomeIdentifier7);
    serializeItemBlock(self.someItem8, kSomeIdentifier8);
    serializeItemBlock(self.someItem9, kSomeIdentifier9);
    serializeItemBlock(self.someItem10, kSomeIdentifier10);
    serializeItemBlock(self.someItem11, kSomeIdentifier11);

    return serialization;
}
4

3 に答える 3

6

私が思う最大のデメリットは以下の3点です。

  1. あなたが言及したように、ブロックは再利用できません。
  2. ブロックはテスト可能ではありません。ブロックが自分の考えどおりに動作することを検証する単体テストを作成することはできません。
  3. コードが読みにくくなります。このメソッドを読んでいるときに重要なのは、シリアル化の実装方法の詳細ではなく、一連のものがシリアル化されていることです。

このブロックをメソッドに移動すると、これらの問題がすべて解決されます。ブロック コールバックを引数として取る API でブロックが使用されている場合は、いつでもメソッドからブロックを返すことができます。

于 2012-06-12T16:34:24.960 に答える
1

コードをナビゲートするのは間違いなく難しくなります。エントリ ポイントが関数の途中に埋もれてしまいがちで、デバッガーで表示したり検索したりできる関数名がないため、デバッグやトレースが少し難しくなる可能性があります。

于 2012-06-11T18:35:42.830 に答える
1

コードの明快さは重要です。

メソッドを使用すると、コードのセクション全体を互いに分離してカプセル化し、読みやすくすることができます。

ブロックではなくプライベート メソッドを選択するもう 1 つの理由は、メモリ管理です。これはここで議論するにはあまりにも大きな話題ですが、ブロックはメモリ管理において奇妙であり、その点で他のコード構造のように振る舞わないと言えば十分です。

于 2012-06-11T18:36:43.320 に答える