无论在iPhone开发还是学习的过程中都会看到一些不是很理想的代码,不可否认自己也在不断“贡献”着这类代码。面对一些代码的“坏味道”,重构显然是 个有效的解决途径。《iPhone开发重构》系列就想总结和补充iPhone开发中经历的一些重构,其间可能会引用一些开源以及实际项目的代码,本着对技 术的探求,冒昧之处还请作者多多见谅。
在代码实现的过程中经常会遇到这样的情况:有些条件分支的判断中最初还比较简单,但随着需求不断修改以及检查不断细化,分支条件会不断地变复杂,以至于开始影响到主要代码流程。面对这种情况,就应该将分支条件进行提取来实现其固化。重构前后代码如下:
重构前:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"about"]) {
return YES;
}
if([[URL host] isEqualToString:@"www.wikihow.com"] &&
![path hasPrefix:@"index.php"] &&
![path hasPrefix:@"Category:"] &&
![path hasPrefix:@"Image:"] &&
![path hasPrefix:@"wikiHow:"] &&
![path hasPrefix:@"Category:"] &&
![path hasPrefix:@"wikiHow_talk:"] &&
![path hasPrefix:@"User:"] &&
![path hasPrefix:@"Special:"];) {
// Do something here
}
return NO;
}
其中对URL的判断感觉有点“喧宾夺主”了,以至于影响到了逻辑流程的表现。
重构后:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"about"]) {
return YES;
}
if ([URL isWikiHowArticleURL]) {
// Do something here
}
return NO;
}
- (BOOL)isWikiHowArticleURL {
NSString *path = [self path];
return [[self host] isEqualToString:@"www.wikihow.com"] &&
![path hasPrefix:@"index.php"] &&
![path hasPrefix:@"Category:"] &&
![path hasPrefix:@"Image:"] &&
![path hasPrefix:@"wikiHow:"] &&
![path hasPrefix:@"Category:"] &&
![path hasPrefix:@"wikiHow_talk:"] &&
![path hasPrefix:@"User:"] &&
![path hasPrefix:@"Special:"];
}
这样URL的判断就封装和固化在了isWikiHowArticleURL函数中。如果项目只有在一处地方使用该函数就可以将其放在当前类;如果有多个地方调用那就应该适当“转移”了,NSString或NSURL的Category都是比较合适的去处。
本文出自 “林家男孩” 博客,请务必保留此出处http://bj007.blog.51cto.com/1701577/545535