以下是回複一位系統設計師的郵件,關於組件和子系統間介面設計,文字略有改動。
*************************
謝謝您的信任,您發的文檔我讀了,介面設計的要點都涵蓋了,我個人覺得不錯!!
我是從技術層面提一下我個人的一些不成熟的看法,僅供參考:
===
值對象屬性的類型。在資源結果介面的資源結果集屬性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;
}
}