代码整洁之道--函数

举报
i进击的攻城狮 发表于 2022/06/27 21:35:55 2022/06/27
【摘要】 ​ ​编辑函数可能是我们程序员每天面临的最多的东西之一了,但是你有没有去思考过,如何去写好一个函数呢?一、短小顾名思义,我们写的每个函数,应该有可能的不要太长,不要往一个函数里写入到了的代码,尽可能让函数短小;二、只做一件事一个函数要求完成一个功能,往往是分几步完成的,比如说写个函数,功能是把大象放进冰箱,那这个函数需要三步1,打开冰箱;2, 把大象放进去,3,关闭冰箱这三步每一步都是一件事...

 这里写图片描述编辑

函数可能是我们程序员每天面临的最多的东西之一了,但是你有没有去思考过,如何去写好一个函数呢?

一、短小

顾名思义,我们写的每个函数,应该有可能的不要太长,不要往一个函数里写入到了的代码,尽可能让函数短小;

二、只做一件事

一个函数要求完成一个功能,往往是分几步完成的,比如说写个函数,功能是把大象放进冰箱,

那这个函数需要三步

1,打开冰箱;

2, 把大象放进去,

3,关闭冰箱

这三步每一步都是一件事,抽象成代码,那每一步都应该封装到一个函数里去完成,就要用三个函数完成一个功能,而不是一个函数;

public class Client {

    public static void main(String[] args) throws Exception{
        ElephantToRefrigerator();
    }

    public static void ElephantToRefrigerator(){
        openRefrigerator();
        putElephant();
        closeRefrigerator();
    }

    public static void openRefrigerator(){
        System.out.println("打开冰箱");
    }

    public static void putElephant(){
        System.out.println("放入大象");
    }
    public static void closeRefrigerator(){
        System.out.println("打开冰箱");
    }


}

像上面的代码,就是满足函数只做一件事,如果把每一步操作都写在一个函数里,就变成这样

public class Client {

    public static void main(String[] args) throws Exception{
        ElephantToRefrigerator();
    }

    public static void ElephantToRefrigerator(){
        System.out.println("打开冰箱");
        System.out.println("放入大象");
        System.out.println("打开冰箱");
    }

   

}

有的小伙伴可能会说,这不是一样的吗,上面的代码还多一行

是的,这是案例比较简单,在实际开发中,往往''把大象塞进冰箱'',每个步骤都有几十行代码,如果不用函数封装,将会非常影响代码的阅读!




三、函数的层级抽象

一个函数,有时候往往都是会去调用多个其他函数实现去功能,但是在调用其他函数的过程中,需要注意,被调用的函数是哪个层级的,

打个比方,我有一个功能,用户登录后,发送数据,然后退出,代码如下

 public static void doSomeThing(){
        //登录
        login();
        //发送数据
        sentMessage();
        //退出
        logout();
    }

上面的代码是功能的主要流程,接下来需要添加细节,比如发送数据时,需要同时发送登录时间,但是细节添加到哪儿呢?

public static void doSomeThing(){
        //登录
        login();
        String time = TimeUitl.getTime();
        //发送数据
        sentMessage(String time);
        //退出
        logout();
    }

像上面这样就是错误的修改方式,像获取时间这样的细节,不应该放在最顶层的函数模块里面,而是应该放在setMessage()方法里自己去获得

四、减少函数参数

函数的参数应该越少越好,不推荐函数的参数超过三个,如果需要三个及以上的参数,推荐使用对象去封装,或者使用创建者模式去简化参数

 五、无副作用

在一个主要做查询的函数中,不要在这个函数里面做其他的修改操作,这很有可能在其他地方调用的时候导致不可预期的后果


六、函数应该做到复用

不要重复的去写一个相同的函数,函数要做到多次复用

七、异常处理应该单独放在函数里面

推荐不要在try里面写大量的代码,可以试着把可能抛出异常的语句,封装到函数里面,如下

public class Test01 {
    public static void main(String[] args) {
        try {
            fun();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void fun() throws Exception{
        System.out.println("步骤1");
        System.out.println("步骤1");
        System.out.println("步骤1");
    }

    private static void exceptionDeal(){
        System.out.println("处理异常");
    }
}




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。