程序员刘杨

———没有写不出的程序,只有不努力的程序员。

2019年01月27日   管理之路   1,435 次浏览

祝大家新年快乐,有任何问题可与我联系:点击这里给我发消息

作为一个程序员的你,总会说过或者听过这么一句话——这是谁写的代码呀?!为什么会说这句话?因为看不懂别人写的代码啊。为什么看不懂?难道是因为看不懂别人写的算法吗?NO!NO!NO!大部分业务代码都不会涉及到算法。那到底是为什么?还不是因为别人写的代码太烂了。那烂的表现具体有哪些?没有注释,变量名看不懂,没有做基础的验证,格式糟糕等等。也可以说是代码不好看,下面我总结了常用的五个方法,来教大家写一手漂亮的代码,提高代码质量。

1、定义好变量名、方法名,写好注释

首先我们需要为方法和方法入参取一个见名思义、简单易懂的名称,名称是门面,好的名称能让别人知道你要做什么。其次需要为方法、入参字段、重要的逻辑添加必要的注释说明。

	/**
	 * 描述这个方法的作用:比如定义一个方法,方法有若干个参数
	 * @param argName1	参数1,参数1说明
	 * @param argName2	参数2,参数2说明
	 * @return Object 一般来说方法的返回结果为正常数据,异常数据通过异常抛出
	 */
	public Object aDemoMethod(String argName1, Object argName2) {

	}

2、对所有的入参出参都要进行校验,尤其是空校验

防御式编程中强调,所有的外部数据(本方法入参,调用其他方法返回结果等)都是不可靠的,所以需要对外部数据进行有效验校验,这样才能保证业务按照自己预想的流程走下去,减少不必要的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 或者其他一些业务校验
	}

3、非主流程的结果返回使用异常

一般我们在设计方法的时候,返回结果为实体类,那么对于各种异常流程或者错误码就需要通过异常返回,而不是返回一个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");
		}
	}

4、将大段同一功能的代码封装成一个方法

一般来说一个方法的代码行数不能超过屏幕的大小,也有些公司强制的要求不要超过多少行。虽然我不建议强制要求,但是功能可以独立或者模块化的代码一定要独立的子方法。比如我们把第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;
	}

5、格式化代码

将所有代码写完后,记得不要忘记格式化(如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;
	}

以上就是最后写出来的代码,是不是比较清晰明了。虽然实际业务代码比这复杂,但只要遵循这简单的五点,我相信写出来的代码质量也不会太差。

赞 赏
申明:除非注明,本站文章均为原创,转载请以链接形式标明本文地址。 如有问题,请于一周内与本站联系,本站将在第一时间对相关内容进行处理。
本文地址: http://www.yyjjssnn.cn/articles/846.html

>>> Hello World <<<

这篇内容是否帮助到你了呢?

如果你有任何疑问或有建议留给其他朋友,都可以给我留言。

:wink: :twisted: :surprised: :smile: :smile9: :smile8: :smile7: :smile6: :smile5: :smile56: :smile55: :smile54: :smile53: :smile52: :smile51: :smile50: :smile4: :smile49: :smile48: :smile47: :smile46: :smile45: :smile44: :smile43: :smile42: :smile41: :smile40: :smile3: :smile39: :smile38: :smile37: :smile36: :smile35: :smile34: :smile33: :smile32: :smile31: :smile30: :smile2: :smile29: :smile28: :smile27: :smile26: :smile25: :smile24: :smile23: :smile22: :smile21: :smile20: :smile1: :smile19: :smile18: :smile17: :smile16: :smile15: :smile14: :smile13: :smile12: :smile11: :smile10: :smile0: :sad: :rolleyes1: :redface: :razz: :question: :neutral: :mrgreen: :mad: :lol: :idea: :exclaim: :evil: :eek: :cry: :cool: :confused: :biggrin: :arrow:

友情链接: 程序员刘杨 刘杨
Copyright 2003~2018 保留所有权利 | 网站地图
备案号:湘ICP备14001005号-2

湘公网安备 43011102001322号