故事背景
最近我写代码的时候在想:如何让将来接手这个项目的人能快速定位到想要修改的代码位置,比如我的这个页面:
这是未登录时展示的占位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