关于方法返回值的两种处理模式

目前在处理返回值方面, 有两种代码风格:

一种是这样:
result = method1();
if (result is error){ //根据返回结果判断是否退出
...//加错误码
return result;
}
result = method2();
if (result is error){ //根据返回结果判断是否退出
...//加错误码
return result;
}
do something...


另一种是:
try{
method1() // 如果有逻辑问题抛出ErrorCodeException

method2() // 如果有逻辑问题抛出ErrorCodeException

do something...
}catch(ErrorCodeException e){
// 将ErrorCodeException异常转换为Result
return result;
}


但是我推荐采用第二种方式, 理由主要有三个方面:
1. 从重构的角度来说, 如果一个方法中有多个return出口, 当方法膨胀之后需要将一块代码抽取出来单独形成一个方法的时候比较困难, 而采用异常的方式则可以很容易的抽取出单独方法.
2. 从代码重用的角度来说, 第一种如果method1, method2方法有多个地方调用, 这些需要调用的地方大部分情况下都要对结果进行判断加错误码并返回结果, 这个是重复的代码, 这样重复性代码在ic中是随处可见的, 我希望通过抛错误码异常的方式来减少这种重复的东西.
3. 从封装的角度来说, 将非正常结果的处理封装在方法的内部, 可以提高内聚性.

这样做的两个缺点:
1. 必须将method1, method2套在一个try...catch中, 然后将ErrorCodeException转换成result.
2. 还有一些方法的确需要根据情况自己处理返回值的, 不希望抛出异常, 你必须提供一个不抛出异常的方法
3. 在性能上, 因为需要使用到异常堆栈, 这个会有一定的性能损失, 如果是分布式应用的话, 尽量改错误码, 而不是异常, 因为异常比简单的错误码方式序列化的成本会更高

我采用第二种方式是来自于对这样的语句变体: 有些方法在开始处都会对参数进行检查的卫语句, 比如非空, 非0检查, 如果参数不合格抛出IllegalArgumentException(如果不是因为要返回错误码, 完全可以抛出IllegalArgumentException).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值