写给所有程序员_你的函数(方法)还好吗?

来源:互联网 发布:怎么从淘宝店铺看电话 编辑:程序博客网 时间:2024/05/30 05:14

1.关于命名

前面有提到过有关函数的命名问题,这里再讲一次:
函数名(方法名)要使用动词+名词。

public static void main(String []args){    int firstNum = 1;    int secondNum = 2;    System.out.println("sumNum ="+addTwoNums(firstNum,secondNum ));}public static int addTwoNums(int firstNum,int secondNum){    return firstNum + secondNum;}

上面的名称:addTwoNums就是动词+名词格式,不用看代码单独看名字,就知道这个函数(方法)是求两数和的,这就是这种命名方式的好处。单用动词add,绝对不会马上知道这个具体的工作。是添加到数据库?添加到列表?还是求和?要有个识别的过程,这个过程,我称之为浪费时间的过程。

2.关于贪心

例子:

public static void main(String[]args){    int firstNum = 5;    int secondNum = 3;    System.out.println(getSumOfTwoNums(firstNum,secondNum));    //doSomething...    System.out.println(getSumOfTwoNums(5,2));}public static int getSumOfTwoNums(int firstNum,int secondNum){    ++firstNum;    return firstNum + secondNum;}

发现问题了吗?求和函数(方法)里面竟然有一句++firstNum;!!!第一次用的时候,可能是因为某种需要,所以需要把firstNum加一。为了方便,把它和后面的相加写在一起了。这样后面用的时候可能导致错误,因为后面用到的时候你已经忘记了这个函数(方法)里面你居然一时脑抽把加一这样的代码写在里面了。

贪心:你的函数和方法把没提到的事顺便做了。
修改:不要做你的函数(方法)没有提到的事,这可能导致你后面的调用造成隐患。

3.关于参数

public class MethodDothings{    public static void main(String[] args){            MethodDothings methodDothings = new MethodDothings();            int year  = 2017;            int month = 2;            int date = 15;            int hour = 11;            int min = 29;            int sec = 55;            methodDothings.printDateTime(year,month,date,hour,min,sec);   }    public void printDateTime(int year,int month, int date,        int hour, int min, int sec){        System.out.println(year+"年"+month+"月"+date+"日 "+hour+":"+min+":"+sec);    }}

这是我仿照最近重构的代码写的逻辑,这段代码的的确确是把年月日时分秒传进去了,现在看到这段代码的时候,我的感受是:太可怕了,幸好我没有因为它犯错!

如果我一不小心传了两个min,变成:

methodDothings.printDateTime(year,month,date,hour,min,min);

我很容易忽略掉这个错误,为后续的调试工作造成隐患。

函数的参数不要超过三个,尤其是相同类型的时候,否则会给我们传参带来困难:

  • 困难1:记不住顺序,每次都要重新查看形参列表

  • 困难2:很容易搞错顺序,传错了参数可能一时无法发现

  • 困难3:对于传入参数的逻辑相关性很难记忆,或许为了传参,你要重新查一遍这个函数。

更好的做法(增加一个类):

public class MethodDothings{    public static void main(String[] args){            DateTime dateTime = new DateTime();            dateTime.setYear(2017);            dateTime.setMonth(2);            dateTime.setDate(15);            dateTime.setHour(11);            dateTime.setMin(29);            dateTime.setSec(55);            MethodDothings methodDothings = new MethodDothings();            methodDothings.printDateTime(dateTime);   }    public void printDateTime(DateTime dateTime){        System.out.println(        dateTime.getYear()+"年"+dateTime.getMonth()+"月"+dateTime.getDate()+"日 "        +dateTime.getHour()+":"+dateTime.getMin()":"+date.getSec());    }}
public class DateTime{    private int year;    private int month;    private int date;    private int hour;    private int min;    private int sec;    public void setYear(int year){        this.year = year;    }    public int getYear(){        return year;    }    public void setMonth(int month){        this.month = month;    }    public int getMonth(){        return month;    }    public void setDate(int date){        this.date = date;    }    public int getDate(){        return date;    }}

这样确实可以增加可读性,但是很麻烦,每次用都要dateTime.getXX(),有更简单的吗?有!

public class MethodDothings{    public static void main(String[] args){            DateTime dateTime = new DateTime();            dateTime.setYear(2017);            dateTime.setMonth(2);            dateTime.setDate(15);            dateTime.setHour(11);            dateTime.setMin(29);            dateTime.setSec(55);            dateTime .printDateTime(dateTime);   }}
public class DateTime{    private int year;    private int month;    private int date;    private int hour;    private int min;    private int sec;    public void setYear(int year){        this.year = year;    }    public void setMonth(int month){        this.month = month;    }    public void setDate(int date){        this.date = date;    }    public void printDateTime(DateTime dateTime){        System.out.println(        year+"年"+month+"月"+date+"日 "        +hour+":"+min":"+sec);    }}

这样就好多了,优点如下:

  • 不容易传错参数,setXX明确了当前设置的变量。XX和我们设置的数值距离更近,而且只需要设置一次,保证这一次传参正确,以后传递对象的结果都正确。

  • 高封装性。可以注意到把DateTime里面的get都删除了,以后要得到各种时间格式也可以通过这个类来返回。