Simon Shi

放飞梦想,专注于Mobile开发

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

    无论在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

posted on 2011-11-30 16:50  Simon Shi  阅读(207)  评论(0编辑  收藏  举报