2

この質問にはObjective-Cを使用していますが、これは実際には言語固有ではありません。

User クラスに次のメソッドがあります。

+(BOOL)canPerform:(NSString *)string
    withCompletion:(void(^)(BOOL success,NSError *error))block;

私のViewControllerで

-(void)performTask{

        if([User canPerform:@"My String" withCompletion:^(BOOL success, NSError *error) {
            if (success) {
            NSLog(@"Task success!");

            }
            else{
            NSLog(@"Task Failed with error : %@,error.localizedDescription");
            }
        }])
        {
            NSLog(@"Can perform task");

        }
        else{
            NSLog(@"Can not perform task");

        }    
    }

私が実行しているタスクについて言及する必要はありません。それは私の質問ではありません。

私の質問は次のとおりです。

  1. これは良いプログラミングの実践ですか?if ステートメントの条件として、ブロックを受け入れる BOOL メソッドを使用しますか?

  2. このメソッド[User canPerform]は 2 つのことを行います。まず、この特定のタスクを実行できるかどうかを確認し、実行できる場合はそのタスクを実行します。しかし、メソッド名はこれを反映していません。メソッド名はcanPeform. 私は使用できifCanThenPeformThisTaskましたが、それは奇妙に聞こえ、BOOL メソッドのようには感じません。このメソッドに名前を付けるための最良のアプローチは何ですか?

4

2 に答える 2

4

それはより良いことができます。メソッドの名前は誤解を招きやすく、コードはかっこの数とあちこちにネストされているため読みにくいです。次のような方が良いでしょう:

+(BOOL)checkAndPerform:(NSString *)string
        withCompletion:(void(^)(BOOL success,NSError *error))block;

次のように使用されます。

-(void)performTask {
    BOOL available = [User checkAndPerform:@"My String" withCompletion:^(BOOL success, NSError *error) {
        if (success) {
            NSLog(@"Task success!");
        } else {
            NSLog(@"Task Failed with error : %@,error.localizedDescription");
        }
    }];

    if(available)
    {
        NSLog(@"Can perform task");
    } else {
        NSLog(@"Can not perform task");
    }    
}

これで、可能性をチェックし、可能であれば実行することの両方を行っていることが明らかになりました。また、実行可能性に基づいて、そのアクションを結果として生じるアクションから明確に分離しています。

于 2015-10-02T10:53:27.770 に答える