2

我正在使用 Objective-C 来解决这个问题,但这并不是特定于语言的。

我的用户类中有以下方法,

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

在我的视图控制器中

-(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. 这是一个好的编程习惯吗?使用接受块的 BOOL 方法作为 if 语句的条件?

  2. 这个方法[User canPerform]做了两件事。首先,它检查它是否可以执行此特定任务,如果可以,它确实执行该任务。但是方法名称并不能反映这一点。方法名称是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 回答
3

您可以找到一些 Foundation 方法,它们执行类似的工作,但方法名称略有不同。为了保留您当前拥有的方法签名并更好地理解 - 将您的方法重命名为didPerform. 所以你的方法看起来像这样:

- (void)performTask {
    void(^completion)(BOOL, NSError *) = ^(BOOL success, NSError *error) {
        if (success) {
            // app logic
        } else {
            // app logic
        }
    };
    NSError *error = nil;

    if ([User didPerform:@"My String" error:&error withCompletion:completion(BOOL success, NSError *error)]) {
        NSLog(@"DID perform");
    } else {
        NSLog(@"some kind of error: %@", error.localizedDescription);

    }
}
于 2015-10-02T10:55:18.670 回答