函数调用再寻常不过了,一再强调的就是好的函数一定是只做一件事情的,只因为一个原因而改变的,因而也是容易命一个好名字的。
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
分享到:
相关推荐
"简化函数调用"这一主题主要关注如何高效、简洁地使用和设计函数,以提升代码的清晰度和效率。以下是一些关于简化函数调用的关键知识点: 1. **高阶函数**:高阶函数是指可以接收其他函数作为参数或返回一个函数的...
本文将讨论如何通过一系列重构技巧来简化函数调用。 首先,`Rename Method` 是一个基础但至关重要的重构方法。当函数的名称无法清晰地反映其功能时,应当修改为更具描述性的名称。一个好的函数名应当能够自解释,就...
- **客户端(Client)**:发起RPC请求的程序,它通常包含一个本地函数,该函数调用远程过程。 - **服务器(Server)**:接收并处理RPC请求的程序,它实现了远程过程。 - **RPC库**:提供客户端和服务器之间的通信...
在C/C++编程语言中,函数调用方式是程序设计中的关键概念之...而`thiscall`则是C++中成员函数调用的标准方式,简化了对象方法的调用过程。理解这些调用约定不仅有助于编写更高效的代码,还能加深对底层运行机制的理解。
`__thiscall` 用于C++虚函数调用,简化了`this` 指针的管理;`naked call` 则为开发者提供了最低级别的控制权。在实际开发过程中,根据项目的需求选择合适的调用约定,可以在保证程序功能的同时提高程序的执行效率。
3. **回调函数**:在C/C++编程中,回调函数是指被其他函数调用的函数。在Java通过JNA调用DLL时,如果DLL函数需要一个回调函数作为参数,那么Java需要定义一个接口,该接口的方法将作为回调函数的实现,JNA会处理这个...
在C语言编程中,理解函数调用关系是调试和优化代码的关键步骤。本文将详细介绍如何利用egypt工具和GCC编译器的-fdump-rtl-expand选项生成Graphviz图形,以便直观地展示函数间的调用关系。 首先,让我们了解egypt。...
递归是一种函数调用自身的技术,通常用于解决那些可以通过简化问题规模来解决的问题。在阶乘的例子中,当`x`等于1时,返回1(因为1的阶乘是1)。否则,函数会递归调用自身,将`x`减1并乘以`x`的阶乘,直到达到基本...
在提供的 "dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑.md" 文档中,可能会包含详细的示例代码和步骤,指导开发者如何使用 `CsWin32` 实现特定的 Win32 API 调用。文档通常会涵盖创建、打开文件、处理窗口消息等...
### 函数调用编码知识点解析 #### 一、概述 在计算机编程中,函数是程序设计的基本单位之一,用于执行特定任务。通过定义函数并进行调用,可以提高代码的复用性和模块化程度,使得程序更加清晰易读。本文将通过对...
以下是一个简化的示例代码片段,展示了如何在VB中调用上述API函数来设计一个“关于”窗口: ```vb Private Sub Command1_Click() Dim hinst As Long Dim icons As Long Dim abouts As Long ' 获取当前窗体的...
这样,客户端代码无需直接使用`LoadLibrary()`和`GetProcAddress()`,而是通过头文件直接调用函数,简化了调用过程。 总之,动态调用DLL函数是Windows编程中的重要技巧,它可以提高代码的复用性和灵活性。通过`...
"Linux+系统函数调用大全"这个资源旨在为开发者提供一个详尽的参考指南,帮助他们更好地理解和使用这些系统函数。下面,我们将深入探讨Linux下的系统函数调用以及如何利用makefile文件来组织和编译C程序。 1. **...
MFC函数调用遵循C++的常规语法,包括对象实例化、成员访问、虚函数调用等。例如,通过`.`或`->`运算符调用成员函数,如`myObject.OnFunction()`或`myPointer->OnFunction()`。 综上所述,MFC中函数的调用涉及到...
这一过程涉及到动态链接库(DLL)的加载、函数地址获取以及函数调用等技术。下面将详细阐述这些知识点。 首先,`load_so`通常指的是加载共享对象(Shared Object),在Linux系统中,动态链接库文件的扩展名为`.so`...
除了将已定义好的函数作为参数传递外,还可以直接在函数调用时定义并传递一个匿名函数。匿名函数是指没有名称的函数,通常用于一次性的功能实现,可以简化代码结构。 **示例2:** ```javascript function execute...
除了上述方法,还可以使用TLibLoader组件,它是Delphi中的一个控件,简化了动态加载和调用BPL中函数的过程。TLibLoader自动处理加载、查找函数和卸载BPL的细节,使得代码更简洁,如下所示: ```delphi uses ...
函数调用与参数传递是C语言编程中的核心概念之一,理解它们的工作原理对于掌握C语言至关重要。函数调用是指主调函数调用被调函数的过程,通过这种方式,程序可以按模块化进行设计和组织。参数传递是函数调用过程中不...
在探讨“函数之间调用同一个对象方法”的主题时,我们首先需要理解几个核心概念:函数、对象、方法以及事件监听器。这些概念是现代编程语言,尤其是面向对象编程语言中的基石,它们共同构建了复杂软件系统的逻辑框架...