• iPhone开发重构:提取方法以调整函数粒度【转】


       无论在iPhone开发还是学习的过程中都会看到一些不是很理想的代码,不可否认自己也在不断“贡献”着这类代码。面对一些代码的“坏味道”,重构显然是 个有效的解决途径。《iPhone开发重构》系列就想总结和补充iPhone开发中经历的一些重构,其间可能会引用一些开源以及实际项目的代码,本着对技 术的探求,冒昧之处还请作者多多见谅。

        记得刚开始做软件开发的时候,我的导师就在一次函数设计的时候说:“函数粒度很重要,但即使我做了接近二十年的软件,有时也无法很好把握粒度。这点就只可 意会不可言传了。”这句话可能一部分是出自谦虚,但更多是道出软件开发的规律。当时我们无法去理解,现在开始慢慢理解。我们设计一个函数的时候,可能有时 就按需设计了,比如需要获取一个对年龄的文字提示的时候就设计一个getAgeTip()的函数,实现代码如下:

    重构前:

    NSString* getAgeTip(int nBornYear, int nBornMonth, int nBornDay)
    {
        NSString* strRet = (@"");
        int nAge = 0;

        int nYear = ServerDate.serverYear;
        int nMonth = ServerDate.serverMonth;
        int nDay = ServerDate.serverDay;
        nAge = nYear - nBornYear - 1;
        if ((nMonth > nBornMonth) || (nMonth == nBornMonth && nDay > nBornDay)) {
            ++nAge;
        }
        nAge = MAX(nAge, 0);
        if (nAge &gt; 0 && nAge < 200) {
            strRet = [NSString stringWithFormat:@"%d", nAge];
            if (bWithUnit) {
                strRet = [strRet stringByAppendingString:NDSTR(@"岁")];
            }
        }
        return strRet;
    }

    但随着开发的深入以及需求的变更,可能就会有一个获取年龄的需求。这时候就会发现原来getAgeTip()函数中就有获取年龄的逻辑,粒度太大了,无法实现复用。面对这种问题的时候就需要重新调整函数粒度,通过提取getAge()方法后重构代码如下:

    重构后:
    NSString* getAgeTip(int nBornYear, int nBornMonth, int nBornDay)
    {
        NSString* strRet = (@"");
        int nAge = getAge(nBornYear, nBornMonth, nBornDay);
        if (nAge > 0 && nAge < 200) {
            strRet = [NSString stringWithFormat:@"%d", nAge];
            if (bWithUnit) {
                strRet = [strRet stringByAppendingString:NDSTR(@"岁")];
            }
        }
        return strRet;
    }

    int getAge(int nBornYear, int nBornMonth, int nBornDay)
    {
        int nAge = 0;

        int nYear = ServerDate.serverYear;
        int nMonth = ServerDate.serverMonth;
        int nDay = ServerDate.serverDay;
        nAge = nYear - nBornYear - 1;
        if ((nMonth > nBornMonth) || (nMonth == nBornMonth && nDay &gt; nBornDay)) {
            ++nAge;
        }
        nAge = MAX(nAge, 0);

        return nAge;
    }

       其中,对内getAgeTip()调用了getAge(),对外用户可以根据需要调用getAgeTip()或者getAge()。粒度细并合理的情况 下,代码的复用性和可读性就大大提供了。但也不能太细了,这样函数的数目就会“爆炸”从而影响了代码维护。粒度的拿捏很重要,但却很难,这需要在实践中慢 慢体会。

    本文出自 “林家男孩” 博客,请务必保留此出处http://bj007.blog.51cto.com/1701577/545530

  • 相关阅读:
    计算器修正代码
    AsEnumrable和AsQueryable的区别
    c# 解释器模式与sping.net表达式的结合应用(金融里经常需要用到公式,这个公式是抽象的需要自己解释)
    Spring.net 间接调用被AOP拦截的方法失效(无法进入aop的拦截方法)
    信息熵公式的由来(转)
    期望风险、经验风险与结构风险之间的关系(转)
    梯度(转)
    奇特的数学问题(转)
    最大似然估计和最大后验估计(转)
    贝叶斯思想以及与最大似然估计、最大后验估计的区别(转)
  • 原文地址:https://www.cnblogs.com/simonshi2012/p/2269351.html
Copyright © 2020-2023  润新知