这是一个好的编程实践吗?返回带有回调函数的bool值的方法的If条件



我用Objective-C来做这个问题,但这不是语言特有的

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

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

  2. 这个方法[User canPerform]做两件事。首先,它检查它是否可以执行这个特定的任务如果可以,它就执行那个任务。但是方法名并不能反映这一点。方法名称为canPeform。我可以使用ifCanThenPeformThisTask,但这听起来很奇怪,不像一个BOOL方法。这个方法最好的命名方法是什么?

还可以更好。这个方法的名字容易引起误解,而且由于到处都是括号和嵌套,代码很难阅读。最好是这样:

+(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");
    }    
}

现在很清楚,我们既检查潜在的,也执行可用的,并且它清楚地将该操作与基于执行的可用性的结果操作分开。

您可以找到一些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);
    }
}

相关内容

  • 没有找到相关文章

最新更新