【问题标题】:Is this a good programming practice? if condition on a method that returns a bool with a callback这是一个好的编程习惯吗?如果方法上的条件返回带有回调的布尔值
【发布时间】:2015-10-02 18:55:18
【问题描述】:

我正在使用 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 方法。命名此方法的最佳方法是什么?

【问题讨论】:

    标签: ios objective-c oop architecture language-concepts


    【解决方案1】:

    可能会更好。该方法的名称具有误导性,并且由于括号数量和到处嵌套,代码难以阅读。最好是这样的:

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

    现在很清楚,我们既在检查潜力,又在执行(如果可用),它清楚地根据执行的可用性将该操作与结果操作区分开来。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-07
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多