Это хорошая практика программирования? условие 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");
}
}
Нет необходимости упоминать, какую задачу я выполняю. Это не совсем мой вопрос.
Мои вопросы:
Это хорошая практика программирования? Использование метода BOOL, который принимает блок, как условие для оператора if?
Этот метод
[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);
}
}