如何定义一个有优良扩展性的服务接口

领域设计里需要从上到下设计所有业务行为的对象以及操作这些对象的接口,但是就算开始的需求分析十分详细,也会有后来客户提出修改或增加新的动作的时候,这时候就要扩展现有的接口,接口下的实现类都要跟着一起改,一旦实现类过多,修改接口将是一个巨大的工程,那怎样才能实现一个有优良扩展性的接口呢?

我看有的项目是在接口里用Hashtable做参数传入,Vector返回结果,这样的确做到了接口的灵活性,但是这样符合软件设计的思想吗?

>改接口将是一个巨大的工程,那怎样才能实现一个有优良扩展性的接口呢?

使用设计模式。

>Hashtable做参数传入,Vector返回结果
这是一个非常愚蠢的做法,接口是业务的代表,说白了,是脱离语言平台也能存在,怎么能混入java语言的Hastable呢?

使用UML来建模对你来说非常迫切,否则你无法搞清楚哪些属于业务设计,哪些属于语言细节设计。而学习GoF设计模式可以帮助我们实现这种锻炼。

所以,学习Evans DDD之间一定要有良好的设计模式基础。
[该贴被banq于2008-05-21 13:52修改过]

多谢benq老师的回复

我还想问一个简单业务的实现如何设计:
一个发布信息的功能,在发布信息前要检查当前角色的是否有发布的权限,涉及到两个功能,信息发布功能InfoService,角色权限查询RoleService
设计方式一:
InfoService接受发布内容Message和用户User,然后调用RoleService查询User的角色权限,没有权限则抛出NoAccessException,有权限则调用DAO保存信息
设计方式二:
增加一个权限控制器RoleManager作为调停者,调用RoleService查询权限,再调用InfoService进行消息的处理

我觉得这两种都不是很好,但是又想不出更好的方式,这种互相关联的业务逻辑应该如何来设计?

role我使用seam的@Restrict来标记方法。
另外既然role和user关联,还需要再次查询么?ManyToMany或ManyToOne的关系载入就可以了,照你的想法role是关键性的作业,是领域的一部分,那就应该让user持有role了。

>是又想不出更好的方式
使用AOP拦截器来实现角色对具体功能权限的操作已经是一个成熟方案,在书写上可以采取XML配置,或使用元注释@实现。

>这是一个非常愚蠢的做法,接口是业务的代表,说白了,是脱离语言平台也能存在,怎么能混入java语言的Hastable呢?

接口如何才能脱离语言平台呢?孤陋寡闻了?

比如定义接口:

interface dbconnect{
public abstract getConn();
}

那么怎么可能既有java实现这个获得db连接的接口,又有c实现的获得db连接的接口??

这不正是web服务要做的吗?小接口,不过没广泛起来。