以下是回复一位系统设计师的邮件,关于组件和子系统间接口设计,文字略有改动。
*************************
谢谢您的信任,您发的文档我读了,接口设计的要点都涵盖了,我个人觉得不错!!
我是从技术层面提一下我个人的一些不成熟的看法,仅供参考:
===
值对象属性的类型。在资源结果接口的资源结果集属性RsHashMap,是名/值对的集合。文档中定义为HashMap类型,HashMap是已实现的Class,这里我建议改为Map接口(Interface)类型。RsHashMap(或者RsMap)可能会被调用者(Caller)所访问和使用,使用接口或更级别的超类,能降低Caller和Callee(RsMap)之间的耦合级别,这是面向对象设计的基本原则,降低耦合级别在面向过程设计里也是很重要的。对于Callee来说,它可以把Map的真实对象类型实现为HashMap,也可以实现为LinkedHashMap,实现时选择余地就大了。这个问题不是致命的,其实不改也是可以接受的,只是改了后代码质量看起来稍好一点。
Java语言为开发员提供面向对象开发的基础,具体把资源结果类实现为JavaBean,为RsMap属性定义Getter/Mutator方法,实现代码如下:
package com.acme.test;
import java.util.Map;
import java.util.HashMap;
public class Resource{
//... 其他属性
private Map resourceMap = null; //资源结果集合
public Map getResourceMap(){
if (resourceMap == null)
resourceMap = new HashMap(); //实现为HashMap
return this.resourceMap;
}
public void setResourceMap(Map resourceMap){
this.resourceMap = resourceMap;
}
}
===
子系统间接口设计的表达形式。用表格来表达接口设计也是经典选择,这里我结合以前的开发实践和从事UML/OOA&D培训的经验,提出另一种表达方式作为补充,仅供开拓思路。因为已经达到详细设计水平,它可以用UML的类图来表示,或者用Java代码表示,二者是等价的,并且可以相互转换。子系统间设计的关键是接口定义和接口实现分离开。
请参考附件的Java代码示例。因为要看的东西太多,时间紧张,不能展开来写,见谅!
*************************
package com.acme.test;
public interface CRMQuery {
//查询客户信息
public Customer queryCustomer(String custId);
//查询用户信息
public User queryUser(String userId);
}
*************************
package com.acme.test;
public class CRMQueryImp implements CRMQuery{
//查询客户信息实现代码
public Customer queryCustomer(String custId){
Customer customer = new Customer();
//TODO: 查询实现代码
return customer;
}
//查询用户信息实现代码
public User queryUser(String userId){
User user = new User();
//TODO: 查询实现代码
return user;
}
}
*************************
package com.acme.test;
public class Customer {
private String custId ;
private String custName;
//其他属性
public String getCustId() {
return custId;
}
public void setCustId(String custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
}
*************************
package com.acme.test;
public class User {
private String userId ;
private String userName;
//其他属性
public String getCustId() {
return userId;
}
public void setCustId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
*************************
package com.acme.test;
import java.util.Map;
import java.util.HashMap;
public class Resource{
//... 其他属性
private Map resourceMap = null; //资源结果集合
public Map getResourceMap(){
if (resourceMap == null)
resourceMap = new HashMap(); //实现为HashMap
return this.resourceMap;
}
public void setResourceMap(Map resourceMap){
this.resourceMap = resourceMap;
}
}