我用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方法接受一个block,作为if语句的条件?
这个方法
[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);
}
}