第10章 简化函数调用
2020-03-16 本文已影响0人
后来丶_a24d
目录
- RenameMethod(函数改名)
- AddParameter(添加参数)
- RemoveParameter(移除参数)
- SeparateQueryfromModifier(将查询函数和修改函数分离)
- ParameterizeMethod(令函数携带参数)
- ReplaceParameterwithExplicitMethods(以明确函数取代参数)
- PreserveWholeObject(保持对象完整)
- IntroduceParameterObject(引入参数对象)
- RemoveSettingMethod(移除设值函数)
- HideMethod(隐藏函数)
- ReplaceConstructorwithFactoryMethod(以工厂函数取代构造函数)
- EncapsulateDowncast(封装向下转型)
- ReplaceErrorCodewithException(以异常取代错误码)
- ReplaceExceptionwithTest(以测试取代异常)
简化函数调用
函数改名
- 函数的名称未能揭示函数的用途,修改函数的名称.
- 函数的名称应该准确表达它的用途。给函数命名有一个好办法,首先考虑应该给这个函数写上一句怎样的注释,然后再想办法将注释变成函数名称。
添加参数
- 某个函数需要从调用端得到更多信息,为此函数添加一个对象参数,让该对象带进函数所需信息
- 只要可能,其他选择都比添加参数要好,因为他们不会增加参数列的长度。过长的参数列是不好的味道,因为程序员很难记住那么多参数,而且长参数列往往伴随着坏味道数据泥团
移除参数
- 程序员可能经常添加参数,却往往不愿意去掉它们。他们打的如意算盘是:无论如何,多余的参数不会引起任何问题,而且以后还可能用上它。
- 如果你不去掉多余参数,就是让你的每一位用户多费一份心。是很不划算的,更何况去掉参数是非常简单的一项重构
将查询函数和修改函数分离
- 某个函数既返回对象状态值,又修改对象状态。建立两个不同的函数,其中一个负责查询,另一个负责修改。
令函数携带参数(类似命令模式)
- 你可能会发现这样的2个函数:它们做着类似的工作,但因少数几个值致使行为略为不同。这种情况下,你可以将这些各自分离的函数统一起来,并通过参数来处理那些变化,用以简化问题。这样的修改可以去除重复代码,并提高灵活性,因为你可以用这个参数处理更多的变化情况。
以明确函数取代参数
- 对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数;让参数接受者去除该项参数,并直接调用前一个参数
- 如果函数可以通过其他途径获得参数值,那么它就不应该通过参数取得该值
保持对象完整
- 你从某个对象中取出若干值,将它们作为某一次函数调用时的参数;改为传递整个对象
- 减小参数列表,提高代码可读性。
- 过度会使依赖结构恶化
引入参数对象
- 你常会看到特定的一组参数总是一起被传递。可能有好几个函数都使用这一组参数,这些参数可能隶属同一个类,也可能隶属不同的类。这样一组参数就是所谓的数据泥团,我们可以运用一个对象包装所有这些数据。
移除设值函数
- 如果你为某个字段提供了设值函数,这就暗示这个字段值可以被改变。如果你不希望在对象创建之后此字段还有机会被改变,那就不要为它提供设值函数。
隐藏函数
- 有一个函数,从来没有被其他任何类用到,将这个函数修改为private。
以工厂函数取代构造函数
- 设计模式中工厂模式
- 你希望在创建对象时不仅仅是做简单的建构工作。将构造函数替换为工厂函数
封装向下转型
- 向下转型也许是一种无法避免的罪恶,但你仍然应该尽可能少做。如果你的某个函数返回一个值,并且你知道所返回的对象类型比函数签名所昭告的更特化,你便是在函数用户身上强加了非必要的工作。这种情况下你不应该要求用户承担向下转型的责任,应该尽量为他们提供准确的类型
以异常取代错误码
- 某个函数返回一个特定的错误码(比如3),用以表示某种错误情况;改用异常
- 代码的可理解性使我们虔诚追求的目标
以测试取代异常
- 面对一个调用者可以预先检查的条件,你抛出了一个异常;修改调用者,使它在调用函数之前先做检查