转载

iOS开发细节 | 使用block时如何保障代码的可读性?

原文

iOS开发细节 | 使用block时如何保障代码的可读性?

故事背景

最近我写代码的时候在想:如何让将来接手这个项目的人能快速定位到想要修改的代码位置,比如我的这个页面:

iOS开发细节 | 使用block时如何保障代码的可读性?

这是未登录时展示的占位view,点击登录按钮会跳转到登录页面。如果我们想定位登录按钮点击回调的相关代码位置——

delegate

如果用delegate,代码是这样的(我这里只写了C层的代码):

#pragma mark - Delegate - 登录占位图view
#pragma mark -- 登录按钮点击时回调
- (void)loginView:(CQPointHUD *)loginView loginButtonDidClick:(UIButton *)sender{
    CQLoginViewController *loginVC = [[CQLoginViewController alloc]init];
    [self.navigationController pushViewController:loginVC animated:YES];
}

这样的代码非常清晰可读,我相信将来任何来维护的人都可以快速定位到具体代码位置。

block

如果用block,代码是这样的:

self.loginView = [[CQPointHUD alloc]initWithLoginViewFrame:self.view.bounds loginButtonClickedBlock:^{
        CQLoginViewController *loginVC = [[CQLoginViewController alloc]init];
        [self.navigationController pushViewController:loginVC animated:NO];
}];

如果将来要修改登录按钮点击事件的逻辑,还要去登录占位图view的初始化方法里寻找,相对delegate来言确实没那么直观了。

那么如何打破这种局面呢?

目前我想到的方法是将block回调里的代码抽离出来,然后给出具体注释,如下:

self.loginView = [[CQPointHUD alloc]initWithLoginViewFrame:self.view.bounds loginButtonClickedBlock:^{
        // 登录按钮点击
        [self loginButtonClicked];
}];
#pragma mark - 登录按钮点击
/** 登录按钮点击 */
- (void)loginButtonClicked{
    CQLoginViewController *loginVC = [[CQLoginViewController alloc]init];
    [self.navigationController pushViewController:loginVC animated:NO];
}

这样修改后定位代码位置就和delegate一样快速了。虽然只是简单的修改,但是对于将来更好的维护还是具有一定帮助的。

总结:

相对delegate,block的优势是使用快捷方便,但如果处理不当时弊端也很明显:可读性相对较低。写代码的时候多换位思考下,这样可以有效的保障自己写的代码的可读性。

附两个占位图view的demo

正文到此结束
Loading...