0
点赞
收藏
分享

微信扫一扫

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


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

上面的名称: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;!!!第一次用的时候,可能是因为某种需要,所以需要把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

这样确实可以增加可读性,但是很麻烦,每次用都要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都删除了,以后要得到各种时间格式也可以通过这个类来返回。


举报

相关推荐

0 条评论