优雅编程之这样简化函数,你就“正常”了(二十四)

开心一笑

【甲:我用什么词都会造句。
乙:那么你用“希望”找一个句子。
甲:我不会用希望造句。
乙:你怎么又不会了呢?
甲:我照的就是:“我不会用希望造句”。】

提出问题

项目开发中如何简化函数调用???

解决问题

优雅编程之这样简化函数,你就“正常”了(二十四)_第1张图片
励志图片

以下来自《重构》的简单总结:

Rename Method(函数改名)

函数的名称皆是函数的用途。一个好的函数名称可以体现一个程序员的水平和素养。

Add Parameter(添加参数)

某个函数需要从调用端得到更多信息。为此函数添加一个对象参数。让该对象带进函数所需信息。

请记住,在之前的文章中有提到,如果一个函数的参数超过3个,那么这个函数就需要重构

Remove Parameter(移除参数)

函数本体不再需要这个参数,将该参数去除。(将多余参数删除,不要留下坏味道)

Separate Query from Modifier(将查询函数和修改函数分离)

某个函数既返回对象状态值,又修改对象状态。建立两个不同的函数,其中一个负责查询,另一个负责修改。

Parameterize Method(令函数携带参数)

若干函数做了类似的工作,但在函数主体中却包含了不同的值,建立单一函数,以参数表达那些不同的值

重构前:

class Employee{
    void tenPercentRaise(){
        salary *= 1.1;
    }
    
    void fivePercentRaise(){
        salary *= 1.05;
    }
}

重构后:

void raise(double factor){
    salary *= (1 + factor)
}

Replace Parameter with Explicit Methods(以明确函数取代参数)

你有一个函数,其中完全取决于参数值而采取不同行为。针对该参数的每一个可能值,建立一个独立函数。

Preserve Whole Object(保存对象完整)

你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。改为传递整个对象。

重构前:

int low = daysTempRange().getLow();
int high = daysTempRange().getHigh();
withinPlan = plan.withinRange(low,high)

重构后:

withinPlan = plan.withinRange(daysTempRange())

Replace Parameter with Methods(以函数取代参数)

对象调用某个函数,并将所得结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数。让参数接受者去除该线参数,并直接调用前一个函数。

重构前

int basePrice = _quantity * _itemPrice;
discountLevel = getDiscountLevel();
double finalPrice = discountedPrice(basePrice,discountLevel);

重构后:

int basePrice = _quantity * _itemPrice;
double finalPrice = discountedPrice(basePrice);

Introduce Parameter Object(引入参数对象)

某些参数总是很自然地同时出现,以一个对象取代这些参数。

代码用一对值来表示一个范围。例如表示日期范围的开始和结束,表示数值范围的upper和lower等等。

Remove Setting Method(移除设置函数)

类中的某个字段应该在对象创建时被设置,然后就不再改变。

Hide Method(隐藏函数)

有一个函数,从来没有被其他任何类用到,将这个函数修改为private

Replace Contructor with Factory Method(以工厂函数取代构造函数)

你希望在创建对象时不仅仅是做简单的,建构动作,将构建函数替换为工厂函数。

Encapsulate Downcast(封装向下转型)

某个函数返回的对象,需要由函数调用者执行向下转型,将向下转型动作移到函数中。

Replace Error Code With Exception(以异常取代错误码)

某个函数返回一个特定的代码,用以表示某种错误情况。改用异常。

Replace Exception with Test(以测试取代异常)

面对一个调用者可以预先检查的条件,你抛出了一个异常。修改调用者,使它在调用函数之前先做检查。

重构前:

double getValueForPeriod(int periodNumber){
try{
    _values(periodNumber);
}catch(ArrayIndexOutOfBoundsException e){
    return 0;
}
    
}

重构后:
double getValueForPeriod(int periodNumber){
//在这里提前检查条件,而不是滥用异常
if(periodNumber >= _values.length) return 0
return _values(periodNumber);
}

不是一种意料外的事件,并不应该抛异常

读书感悟

来自史铁生《病隙碎笔》

  • 人有一种坏习惯,记得住倒霉,记不住走运,这实在有失厚道。
  • 生命就是这样一个过程,一个不断超越自身局限的过程,这就是命运,任何人都是一样,在这过程中我们遭遇痛苦、超越局限、从而感受幸福。所以一切人都是平等的,我们毫不特殊。
  • 人可以走向天堂,不可以走到天堂。走向,意味彼岸的成立。走到,岂非彼岸的消失?彼岸的消失即信仰的终结、拯救的放弃。因而天堂不是一处空间,不是一种物质性存在,而是道路,是精神的恒途。
  • 彻底的圆满只不过是彻底的无路可走。
  • 相信爱才是人类唯一的救助。 这爱,不单是友善、慈悲、助人为乐,它根本是你自己的福。 这爱,非居高的施舍,乃谦恭地仰望,接受苦难,从而走向精神的超越。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

你可能感兴趣的:(优雅编程之这样简化函数,你就“正常”了(二十四))