各位道友,进来讨论个接口设计问题!

目前公司关于接口的设计主要有两种形式:

public interface BussinessInterface{

||第一种方式
//此种设计是通过返回Result对象来实现的,客户端通过查看Result来判断
当前的业务操作是否成功,一般会在Result类里面包括resultCode(表示返回
的错误代码)和resultMessage(表示返回的错误信息)
public Result<BussinessModel> bussinessOperation(...);

||第二种方式
//另外一种方式是通过异常的形式,客户端通过捕获异常来了解到接口调用是否成功,
以及失败的原因等信息
public BussinessModel bussinessOperation(....)throws BussinessException1,BussinessException2;

}

以上两种方式各有各的好处:

第一种方式:
优点:因为异常的传递是会有一定的消耗的,因此第一种方式能使得系统节省一定的消耗。

缺点:接口不够明确,客户端需要根据结果码来判断业务操作是否成功。

第二种方式:
优点:接口设计明确,客户端可以很清楚的指导调用此接口可能会出现什么样子的问题

缺点:异常的传递需要一定的消耗
在远程调用的时候,需要客户端也要保持一份关于业务异常的jar,同时也会带来异常序列化开销。

我起个头,大家说说自己的看法。各抒己见。

我比较倾向第二种,抛的就是业务异常,简单明了,以一些性能为代价,值得。

视客户对性能要求而定,客户要求性能高的就采用第一种,反之选第2.

还是返回状态码好,在文档里写清楚就是了。

这两种区别需要从设计源头来看待,不能只是单纯技术谈论技术,对象职责一书有专门一个章节谈Exception设计:Documenting Your Exception-Handling Designs

Exception处理能够作为职责来处理,通过引入权利和利益obligations and benefits将类之间协作调用使用合约来表达,就像签订一个合同一样,合同规定之外都是意外Exception。

根据这段可以推测:最好不要做一个通用的BussinessException,而是每个业务设计时,先按照DBC确立合约,再确立特定的Exception。这个过程虽然通用,但它是一个模式,不能形成有形框架,Exception其实无法通用,通用了可能就无法显式表达个性。

很纠结:

我觉得这2种方式的本质区别在于:异常(错误)是客户对象处理,还是自己处理。

从对象责任和内聚性的角度来看,这个应该是属于对象自己。自己的错误为什么要交给别人处理呢?

还有一点,就是难道说一个客户对象,必须知道调用对象会发生哪些错误,才能调用那个对象。 这显然给客户对象

带来了一些额外的责任了。

但是第二种方式。显然更清楚,更明白。我也比较推第二种。

真纠结。


banq 说的对,要用职责分配这样的思想去设计接口。
因为你要设计的是业务接口,而不是技术接口。
业务的设计要用面向对象的设计思想去解决。
性能的问题要用技术去解决。
业务技术分开。
[该贴被xinchi于2010-07-12 11:13修改过]

为什么客户端要知道异常调用的详细信息???


如果是逻辑错误呢,也要手动抛异常么

客户端就知道调用成功不成功就可以了

知道太多容易被灭口。。。。。

客户端不可信啊


用Exception来返回信息是否有些越俎代庖的感觉?毕竟它不是Event,看起来预定义的状态码不比预定义的业务异常差。

一般而言,异常比return结果要好。

如果该代码调用层次很深,哪么就要考虑不使用异常,因为Throwable#fillInStackTrace()性能消耗大啊。
如果不存在上述问题,可以设计该业务通用异常(不是所有业务的),设计Error Code 规范。

我也做了下实际测试 try catch 加new Exception 和普通的新建对象 效率差别很大 new Exception + try cathch 需要时间是new Integer 的大概100来倍 是HashMap 的几十倍 但是第二种业务更清楚
接口还是分开设计的好 对于性能要求高,和使用频率高的代码 学学struts2 的方式,或者自己实现一个 对于使用频率不是很大的代码 用第二种方式。
这类似这个灵活点好点 代码段效率要求高就 第一种 要求低 当然第二种

异常的意思就是:不知道为什么错了;既然不知道为什么,一般也就不知道怎么处理,不知道怎么处理的问题就没有必要分别处理,统一处理一下就可以了,比如打印一下异常信息;
总之没有必要去费劲定义一些什么业务异常;
参考《J2EE Development Without EJB》

两种都留着,如果客户端注重时间,那就用时间换空间,如果注重空间,那么就用时间换。程序的两种方式!时间换空间,空间换时间

为什么一谈到异常处理,
我就感觉基本上迄今为止看到的处理方式都是有问题的....

[该贴被2102于2013-04-22 22:28修改过]