`
足至迹留
  • 浏览: 485355 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

7. 简化函数调用

 
阅读更多
函数调用再寻常不过了,一再强调的就是好的函数一定是只做一件事情的,只因为一个原因而改变的,因而也是容易命一个好名字的。

7.1 Rename method (函数改名)
极力推荐的一种编程风格就是:将复杂的处理过程分解为小函数。但是,如果做的不好,会费尽周折却弄不清楚这些小函数各自的用途。要避免这种麻烦,关键就在于给函数起一个好名字。函数的名称应该准确表达它的用途。

7.2 Add Parameter (添加参数)
当某个函数需要从调用端得到更多信息,可以为函数添加一个对象参数,让该对象带进函数所需信息。但是这样做经常会走向另一个极端,导致参数太多。所以每增加一个参数都要慎重。或许也可以考虑使用Introduce Parameter Object.

7.3 Remove Parameter (移除参数)
如果函数本体不再需要某个参数,果断将该参数去除。

7.4 Separate Query form Modifier (将查询函数和修改函数分离)
某个函数既返回对象状态值,又修改对象状态。这时可以建立两个不同的函数,其中一个负责查询,另一个负责修改。这条准则并不是说一个函数如果修改了对象状态就不能有返回值,而是如果返回值是要经过一系列查询比较等操作获得的,就需要把这一系列动作封装为一个独立的查询函数,使得查询函数和修改函数逻辑独立分开,但是可以嵌套调用。有一个设计原则就叫:命令查询分离。

7.5 Preserve Whole Object (保持对象完整)
如果从某个对象中取出若干值,将它们作为某一次函数调用时的参数,则可以改为传递整个对象。一个好处是可以减少参数个数,另一个还可以预防以后又需要从这个对象获取其他值。
不过事情总有两面,如果你传的值是数值,而被调用函数就只依赖于这些数值,依赖关系比较稳定,那就坚决不要传递整个对象。
但是如果一个函数依赖另一个对象过多数据时,就要考虑是否Feature Envy,需要把这个函数移到适合它的地方了。

7.6 Introduce Parameter Object (引入参数对象)
如果某些参数总是很自然地同时出现,则以一个对象取代这些参数。


常会看到特定的一组参数总是一起被传递。可能好几个函数都使用这一组参数,这些函数可能隶属同一个类,也可能不隶属同一个类。这样一组参数就是所谓的Data Clumps(数据泥团),我们可以运用一个对象包装所有这些数据,再以该对象取代他们。

7.7 Replace Constructor with Factory Method(以工厂函数取代构造函数)
《effective java》开头也提出了这个准则,可以隐藏构造方法,更清晰、安全的以工厂方法来代为构建对象。

7.8 Repalce Error Code with Exception (以异常取代错误码)
某个函数返回一个指定的代码,用以表示某种错误情况。可以改为异常的形式返回。


程序发生错误时,并不一定知道如何处理错误。所以必须要让调用者知道错误,调用者可能可以解决也可能需要继续向上传递。Java的异常是非常好的报告错误的方式。我们可以根据错误是否可以被修复决定使用受检查异常还是非受检查异常。
但是一定要杜绝异常滥用,异常只用来表示异常的情况,有些校验不通过属于正常的情况,就不需要抛出异常了。
  • 大小: 12.3 KB
  • 大小: 79.7 KB
0
0
分享到:
评论

相关推荐

    简化函数调用

    简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用简化函数调用

    Kotlin实现多函数接口的简化调用

    对于一个声明了多个方法的接口,...对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到object关键字且代码仍会较多。这里,由于Kotlin的语法更为灵活,去实现这种调用应该有其特色的方式

    Python程序设计:函数参数.pptx

    必须参数,即函数调用时必须要传的参数,下面进行举例说明。 def helloWorld(a): print("输出:hello") helloWorld("aaa") # 必须要有参数 运行结果:hello 函数参数 默认参数 在定义函数时,Python支持默认值参数,...

    parallelizer:简化函数调用的并行化

    并行运行多个函数调用而不会超时。 package main import ( "fmt" "github.com/shomali11/parallelizer" ) func main () { group := parallelizer . NewGroup () defer group . Close () group . Add ( func ...

    调用CPLEX求解优化问题的简化方法

    调用CPLEX求解优化问题的简化方法调用CPLEX求解优化问题的简化方法

    PowerShell中简单的自定义函数和调用函数例子

    在PowerShell中,我们可以使用函数(function)来简化编程开发。在PowerShell中使用function这个关键词来标识一个函数。一个自定义的函数,由function关键词开始,然后用一对大括号来包括起整个函数体的内容。 我们...

    defaults.m:用于简化函数中变量的默认值设置的实用函数。-matlab开发

    问题: 通常在函数调用中: 输出 = 函数(Var1,Var2) if (~exist('Var1','var') 变量 1 = 1234; 结尾if (~exist('Var2','var') 变量 2 = 3456; 结尾 这会在一段时间后变得乏味。 使用 DEFAULTS 的解决方案...

    javaScript函数式编程

    6.2 相互关联函数(函数调用其他会再调用回它的函数)110 6.2.1 使用递归深克隆111 6.2.2 遍历嵌套数组112 6.3 太多递归了114 6.3.1 生成器117 6.3.2 蹦床原理以及回调120 6.4 递归是一个底层操作121 6.5 总结122 第...

    jQuery的使用,简化script函数

    jQuery简单几行代码就可以实现script的多行,尤其是对式样进行函数特定调用

    tick:用于延迟函数调用的 Lua 模块

    一个小的 Lua 模块,它简化了在设定的时间间隔或延迟后调用函数。 用法 文件放入现有项目并为其所必需。 tick = require " tick " 在每一帧开始时,应该调用tick.update()并给tick.update()上次调用以来的增量时间...

    Python中函数的初级知识.md

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义...除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

    CoreHook:一个使用托管代码和.NET Core运行时简化拦截应用程序函数调用的库

    一个使用托管代码和.NET Core运行时简化拦截应用程序函数调用的库。 灵感来自于 。 内容 捐献 如果该项目以任何方式为您提供了帮助,并且您想回馈社会,请考虑向诸如和类的大型组织捐款,或者向诸如类志愿者提供...

    C++成员函数指针的应用

    但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。 刚遇到这种语法时也许会让你止步不前...

    PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    前几篇系列文章,我比较关注的是 PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数 但是我觉得我还是没有说清楚,我自己也有很多不理解的地方,而且这篇是我的第一篇这方面的文章,有很多的纰漏,所以我会...

    面向对象与C++试题.doc

    下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )...

    重构-改善既有代码的设计.pdf

    重构-改善既有代码的设计 简化函数表达式 简化函数调用

    C# 使用方法 入门教程

    4.2.3 调用函数的基类版本..... 102 4.2.4 抽象类和抽象函数..... 103 4.2.5 密封类和密封方法..... 103 4.2.6 派生类的构造函数..... 104 4.3 修饰符...... 109 4.3.1 可见性修饰符..... 109 4.3.2 其他修饰符........

Global site tag (gtag.js) - Google Analytics