2019年01月27日   管理之路   4,084 次浏览
作为一个程序员的你,总会说过或者听过这么一句话——这是谁写的代码呀?!为什么会说这句话?因为看不懂别人写的代码啊。为什么看不懂?难道是因为看不懂别人写的算法吗?NO!NO!NO!大部分业务代码都不会涉及到算法。那到底是为什么?还不是因为别人写的代码太烂了。那烂的表现具体有哪些?没有注释,变量名看不懂,没有做基础的验证,格式糟糕等等。也可以说是代码不好看,下面我总结了常用的五个方法,来教大家写一手漂亮的代码,提高代码质量。
首先我们需要为方法和方法入参取一个见名思义、简单易懂的名称,名称是门面,好的名称能让别人知道你要做什么。其次需要为方法、入参字段、重要的逻辑添加必要的注释说明。
/**
* 描述这个方法的作用:比如定义一个方法,方法有若干个参数
* @param argName1 参数1,参数1说明
* @param argName2 参数2,参数2说明
* @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
*/
public Object aDemoMethod(String argName1, Object argName2) {
}
防御式编程中强调,所有的外部数据(本方法入参,调用其他方法返回结果等)都是不可靠的,所以需要对外部数据进行有效验校验,这样才能保证业务按照自己预想的流程走下去,减少不必要的bug。
/**
* 描述这个方法的作用:比如定义一个方法,方法有若干个参数
* @param argName1 参数1,参数1说明
* @param argName2 参数2,参数2说明
* @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
*/
public Object aDemoMethod(String argName1, Object argName2) {
// 防御式编程强调需要对所有的外部数据都要进行校验,尤其是空校验
// 大部分校验都可以用断言来处理
Assert.notEmpty(argName1, "参数1不能为空");
Assert.notNull(argName1, "参数2不能为空");
// 某些校验也可以自行实现,如:格式校验,值校验,范围校验等等
// TODO 各种校验处理
// 调用其他方法
Object result = callInterfaceMethod();
// 对调用其他方法的返回结果进行校验
Assert.notNull(result, "返回结果不能为空");
// TODO 或者其他一些业务校验
}
一般我们在设计方法的时候,返回结果为实体类,那么对于各种异常流程或者错误码就需要通过异常返回,而不是返回一个MAP(包含错误码),然后根据MAP的错误码来取不同的值。
/**
* 描述这个方法的作用:比如定义一个方法,方法有若干个参数
* @param argName1 参数1,参数1说明
* @param argName2 参数2,参数2说明
* @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
*/
public Object aDemoMethod(String argName1, Object argName2) {
// 防御式编程强调需要对所有的外部数据都要进行校验,尤其是空校验
// 大部分校验都可以用断言来处理
Assert.notEmpty(argName1, "参数1不能为空");
Assert.notNull(argName1, "参数2不能为空");
// 某些校验也可以自行实现,如:格式校验,值校验,范围校验等等
// TODO 各种校验处理
// 调用其他接口或方法
Object result = callInterfaceMethod();
// 对调用其他方法的返回结果进行校验
Assert.notNull(result, "返回结果不能为空");
// TODO 或者其他一些业务校验
// 通过异常返回错误码,这样调用者只需要处理异常就可以了
if(业务判断1) {
// 自定义异常
throw new SelfException("错误码1", "异常说明1");
}
if(业务判断2) {
// 自定义异常
throw new SelfException("错误码2", "异常说明2");
}
}
一般来说一个方法的代码行数不能超过屏幕的大小,也有些公司强制的要求不要超过多少行。虽然我不建议强制要求,但是功能可以独立或者模块化的代码一定要独立的子方法。比如我们把第3点中的调用其他接口的代码独立成子方法。
/**
* 描述这个方法的作用:比如定义一个方法,方法有若干个参数
* @param argName1 参数1,参数1说明
* @param argName2 参数2,参数2说明
* @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
*/
public Object aDemoMethod(String argName1, Object argName2) {
// 防御式编程强调需要对所有的入参出参都要进行校验,尤其是空校验
// 大部分校验都可以用断言来处理
Assert.notEmpty(argName1, "参数1不能为空");
Assert.notNull(argName1, "参数2不能为空");
// 某些校验也可以自行实现,如:格式校验,值校验,范围校验
// TODO 各种校验处理
// 将调用接口的代码独立成子方法,这样主方法流程更加清晰,也容易阅读
Object result = callInterfaceMethod();
return result;
}
// 调用接口并对接口返回数据进行校验
private Object callInterfaceMethod() {
// 调用其他接口或方法
Object result = callInterface();
// 对调用其他方法的返回结果进行校验
Assert.notNull(result, "返回结果不能为空");
// TODO 或者其他一些业务校验
// 通过异常返回错误码,这样调用者只需要处理异常就可以了
if(业务判断1) {
// 自定义异常
throw new SelfException("错误码1", "异常说明1");
}
if(业务判断2) {
// 自定义异常
throw new SelfException("错误码2", "异常说明2");
}
return result;
}
将所有代码写完后,记得不要忘记格式化(如myeclipse快捷键为:ctrl+shift+f)下,这样就能保证整个团队成员的格式都是一样的,在阅读他人代码的时候就跟看自己所写代码一样。
/**
* 描述这个方法的作用:比如定义一个方法,方法有若干个参数
*
* @param argName1
* 参数1,参数1说明
* @param argName2
* 参数2,参数2说明
* @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
*/
public Object aDemoMethod(String argName1, Object argName2) {
// 防御式编程强调需要对所有的入参出参都要进行校验,尤其是空校验
// 大部分校验都可以用断言来处理
Assert.notEmpty(argName1, "参数1不能为空");
Assert.notNull(argName1, "参数2不能为空");
// 某些校验也可以自行实现,如:格式校验,值校验,范围校验
// TODO 各种校验处理
// 将调用接口的代码独立成子方法,这样主方法流程更加清晰,也容易阅读
Object result = callInterfaceMethod();
return result;
}
// 调用接口并对接口返回数据进行校验
private Object callInterfaceMethod() {
// 调用其他接口或方法
Object result = callInterface();
// 对调用其他方法的返回结果进行校验
Assert.notNull(result, "返回结果不能为空");
// TODO 或者其他一些业务校验
// 通过异常返回错误码,这样调用者只需要处理异常就可以了
if (业务判断1) {
// 自定义异常
throw new SelfException("错误码1", "异常说明1");
}
if (业务判断2) {
// 自定义异常
throw new SelfException("错误码2", "异常说明2");
}
return result;
}
以上就是最后写出来的代码,是不是比较清晰明了。虽然实际业务代码比这复杂,但只要遵循这简单的五点,我相信写出来的代码质量也不会太差。
>>> Hello World <<<
这篇内容是否帮助到你了呢?
如果你有任何疑问或有建议留给其他朋友,都可以给我留言。