💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 第7章:高质量的子程序 ### 创建子程序的理由 - 降低复杂度 - 引入中间的、易懂的抽象 - 避免代码重复 - 支持子类化 - 隐藏顺序 - 隐藏指针操作 - 提高可移植性 - 简化复杂的逻辑判断 - 改善性能 ### 除此之外,创建类的很多理由也是创建子程序的理由 - 隔离复杂度 - 隐藏实现细节 - 限制变化所带来的影响 - 隐藏全局数据 - 形成中央控制点 - 促成可复用的代码 - 达到特定的重构目的 ### 在子程序层上设计:功能上的内聚性 - 顺序上的内聚性 - 通信上的内聚性 - 临时的内聚性 - 过程上的内聚性 - 逻辑上的内聚性 ### 好的子程序的名字 - 描述子程序所做的所有事情 - 避免使用无意义的、模糊或表示不清的动词 - 不要仅通过数字来形成不同的子程序名字 - 根据需要确定子程序的名字的长度 - 给函数命名时要对返回值有所描述 - 给过程起名时要使用语气强烈的动词加宾语的形式 - 准确使用对仗词 ```java add/remove increment/decrement open/close begin/end insert/delete show/hide create/destory lock/unlock source/target first/last min/max start/stop get/put next/previous up/down get/set old/new attack/detach initial/done ensureCapacity dispose current / past new/create/construct/generate update/refresh/alter/modify get/find/load/obtain open/draw/display/show/mark process/execute/handle/dispose/deal base on / depend on / convert to / transfer to retrieve(判断) / indicate(表明,证明) ``` ### 过程命名注意: - 一个具有功能内聚性的过程通常是指对一个对象执行一种操作. - 过程的名字应该能够反映出该过程所做的事. - 你不用再过程中加入对象的名字(宾语). - 常用的操作确立命名规则 ### 7.5 如何使用子程序的参数 - 按照输入-修改-输出的顺序排列参数 - 考虑自己创建in和out关键字 - 如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致:因为子程序的参数顺序可以产生记忆效应. - 使用所有的参数 - 把状态或出错变量放到最后 - 不要把子程序的参数用到工作变量 - 在接口中队参数的假定加以说明 - 把子程序的参数个数限制在大约7个以内 - 考虑对参数采用某种表示输入、修改、输出的命名规则 - 为子程序传递用以维持其接口抽象的变量或对象 - 使用具名参数 - 确保实际参数与形式参数相匹配 > checklist For High-Quality Routines ### 核对表:高质量的子程序 ------- ### 大局事项 - 创建的子程序的理由充分吗? - 一个子程序中所有适于单独提出的部分是不是已经被提出到单独的子程序中了? - 过程的名字是否用了强烈、清晰的“动词+宾语”词组?函数的名字是否描述了其返回值? - 子程序的名字是否描述了它所做的全部事情? - 是否给常用的操作建立了命名规则? - 子程序是否具有强烈的功能上的内聚性?即它是否做且只做一件事,并且把它做好? - 子程序之间是否有较松的耦合?子程序与其他子程序之间的连接是否是小的,明确的,可见的和灵活的? - 子程序的长度是否是有其功能和逻辑自然确定,而非遵循任何人为的编码标准? ### 参数传递事宜 - 整体来看,子程序的参数是否表现出一种具有整体性且一致的接口抽象? - 子程序参数的排列顺序是否合理?是否与类似的子程序的参数排列顺序相符? - 接口假定是否已在文档中说明? - 子程序的参数个数是否没有超过7个? - 是否用到了每一个输入参数? - 是否用到了每一个输入参数? - 子程序是否避免了吧输入参数用做工作变量? - 如果子程序是一个函数,那么它是否在所有可能的情况下都能够返回一个合法的值? ### 中文要点: - 创建子程序最主要的目的是提高程序的可管理性,当然也有其他一些好的理由。其中,节省代空间只是一个次要原因:提高可读性、可靠性和可修改性等原因都更重要一些。 - 有时候,把一些简单的操作写成独立的子程序也非常有价值。 - 子程序可以按照其内聚性分为很多类,而你应该让大多数程序具有功能上的内聚性,这是最佳的一种内聚性。 - 子程序的名字是它的质量的指示器。如果名字糟糕但恰如其分,那就说明这个子程序设计得很差劲。如果名字糟糕而且又不准确,那么它就反映不出程序是干什么的。不管怎样,糟糕的名字都意味着程序需要修改。 - 只有在某个子程序的主要目的是返回由其名字所描述的特定结果时,才应该使用函数。 - 细心的程序员会非常谨慎地使用宏,而且只在万不得已时才用。 ### English Key Points: - The most important reason to create a routine is to improve the intellectual manageability of a program, and you can create a routine for many other good reasons. Saving space is a minor reason; - improved readability, reliability, and modifiability are better reasons. - Sometimes the operation that most benefits from being put into a routine of its own is a simple one. - The name of a routine is an indication of its quality. If the name is bad and it’s accurate, the routine might be poorly designed. If the name is bad and it’s inaccurate, it’s not telling you what the program does. Either way, a bad name means that the program needs to be changed. - Functions should be used only when the primary purpose of the function is to return the specific value described by the function’s name. - Careful programmers use macro routines and inline routines with care, and only as a last resort.