Это хорошая практика программирования? условие if для метода, который возвращает bool с обратным вызовом

Я использую 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, который принимает блок, как условие для оператора if?

  2. Этот метод [User canPerform] делает две вещи. Во-первых, он проверяет, может ли он выполнить эту конкретную задачу, и если он может, он выполняет эту задачу. Но имя метода не отражает это. Имя метода canPeform, Я мог бы использовать ifCanThenPeformThisTask но это звучит странно и не похоже на метод BOOL. Как лучше всего назвать этот метод?

2 ответа

Это может быть лучше. Название метода вводит в заблуждение, и код трудно читать из-за количества скобок и вложенности везде. Было бы лучше как то так:

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

теперь ясно, что мы одновременно проверяем потенциал и выполняем его, если он доступен, и он четко отделяет это действие от конечного действия на основе доступности выполнения.

Вы можете найти несколько базовых методов, которые выполняют аналогичную работу, но немного с другим именем метода. Чтобы сохранить сигнатуру метода, которая у вас есть, и добиться лучшего понимания - переименуйте метод в 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);

    }
}
Другие вопросы по тегам