美文网首页
代码整洁之道-<函数>

代码整洁之道-<函数>

作者: 不思进取的码农 | 来源:发表于2019-11-13 17:29 被阅读0次

代码整洁之道-<函数>

  • 代码整洁之道 一书相关读书笔记,整洁的代码是自解释的,阅读代码应该如同阅读一篇优秀的文章,见字知意,能够一下子明白大概的代码功能。代码首先要能读懂,其次才去要求功能实现。

  • 作为开发者来说,在现在基本都讲究团队合作的工作方式下,规范远比功能重要,开发的功能也许在版本迭代中就不复存在了,但是规范却是一直存在的。

  • 为了整洁的代码,就必须遵循一些统一的团队规范。混乱不堪连命名都无法取好的代码,只会给增加后续接手人员维护的成本

1.短小

函数的第一个规则就是要短小,第二条规则时还要更短小。

一个长达3000行的函数,你读着读着自己都厌恶了

代码块和缩进

if语句、else语句、while语句等,其中的代码块应该只有一行,该行大抵应该是一个函数调用语句,这样不但能保持函数短小,而且,因为块内调用的函数拥有较具有说明性的名称,从而增加了文档的价值

2.只做一件事

函数应该做一件事,做好这件事。只做这一件事

3.每个函数的一个抽象层级

要确保函数只做一件事,函数中语句都要在同一抽象层级上。一眼就能看出。

函数中不同抽象层级,往往让人迷惑,可能无法判断某个表达式是基础概念还是细节

自顶向下读代码:向下规则

我们想要让代码拥有自顶向下的阅读顺序。我们想要让每个函数后面都跟着位于下一个抽象层级的函数,这样以来,在查看函数列表时,就能循环抽象层级向下阅读了

4.switch语句

写出短小的switch语句很难,写出只做一件事的switch语句也很难,它天生就要做N件事。我们无法避开switch语句,不过还是可以确保每个switch都放在较低的抽象层级,而且永远不重复

根据雇员类型计算薪资:


public Money calculatePay(Employee e) throws InvalidEmployeeType{
    switch (e.type){
        case COMMISSIONED:
            return calculateCommissionedPay(e);
        case HOURLY:
            return calculateHourlyPay(e);
        case SALARIED:
            return calculateSalariedPay(e);
        default:
            throw new InvalidEmployeeType(e.type);
    }
}

这里仅仅依赖了雇员类型一种操作,就有好几个问题了:

  1. 函数太长,当有新的雇员类型,还会更长
  2. 违反开闭原则,每添加新类型,就必须修改它
  3. 违反了单一权责原则,它做了多件事情
    更麻烦的是:
    到处都有类似的调用函数,比如可能多处调用
    isPayday(Employee e, Date date);

    deliverPay(Employee e, Money pay);

对每个类都会有同样的操作,比如isPayday(), deliverPay()等,不如把类的行为抽象出来到一个抽象类Employee中。在抽象工厂中使用switch语句为Employee的派生物创建适当的实体。

对于switch语句,我们的规矩是如果只出现一次,用于创建多态对象,而且隐藏在某个继承关系中,在其他系统看不到,就还能容忍。当然也要就事论事。


public abstract class Employee{
    public abstract boolean isPayday();
    public abstract Money calculatePay();
    public abstract void deliverPay(Money pay);
}

public interface EmployeeFactory{
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}


public class EmployeeFactoryImpl implements EmployeeFactory{
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType{
        switch (r.type){
            case COMMISSIONED:
                return new CommissionedEmployee(r);
            case HOURLY:
                return new HourlyEmployee(r);
            case SALARIED:
                return new SalariedEmployee(r);
            default:
                throw new InvalidEmployeeType(r.type);
        }
    }
}

可以想象,用优化后的代码,再有新的类型加入时,业务程序是不用修改的,因为类型已隐藏在了抽象类中,返回给业务的都是抽象的Employee,无需考虑类型的变化,只是调用抽象类的方法即可。我们需要改动的只是再创建一个抽象类的实体类,在EmployeeFactoryImpl中多加一个switch分支。

5.函数参数

最理想的参数时零(零参数),其次时一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。有足够特殊的理由才能用三个以上的参数(多参数函数)如果参数特别多就传入对象来作为参数

相关文章

  • 代码整洁之道-<函数>

    代码整洁之道-<函数> 代码整洁之道 一书相关读书笔记,整洁的代码是自解释的,阅读代码应该如同阅读一篇优秀的文章,...

  • 代码整洁之道 - 函数

    快速指南 以下是文中关于写好函数的几个关键点 短小 只做一件事 每个函数一个抽象层级 使用描述性的名称 函数参数,...

  • TypeScript 代码整洁之道 - 函数

    将 Clean Code 的概念适用到 TypeScript,灵感来自 clean-code-javascript...

  • 代码整洁之道【2】--函数

    代码整洁之道,关于函数部分的总结 一、函数只做一件事 函数应该只做一件事、做好这件事、只做这件事。判断函数是否不止...

  • 简洁代码--命名

    代码整洁之道笔记 [TOC] 命名 代码的整洁,从命名开始 名副其实、准确 名称应该能够说明该(变量、类、函数)存...

  • 代码整洁笔记——整洁代码的函数书写准则

    1.0整洁代码的函数书写准则 1.1短小 函数的第一规则是要短小。第二规则还是要短小。 《代码整洁之道》一书作者B...

  • [代码整洁之道]-整洁代码

    前段时间,看了代码整洁之道,顺手做了些笔记,分享给大家,和大家一起探讨整洁代码之道。 1.1要有代码 代码是我们最...

  • 代码整洁之道(整理二:函数)

    背景:接上回,上回说的是变量。 1、函数不能太长。抽离方法和重命名操作,会让函数更清晰。 2、短小。函数第一条规则...

  • 代码整洁之道

    01、有意义的命名 在团队开发中,团队小伙伴编码风格各不相同,一个统一的规范就显得尤为重要,最近在做Code Re...

  • 代码整洁之道

    整洁代码 Leblanc : Later equals never.(勒布朗法则:稍后等于永不) 对代码的每次修改...

网友评论

      本文标题:代码整洁之道-<函数>

      本文链接:https://www.haomeiwen.com/subject/rxhkictx.html