国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

怎樣設計合適的接口

2019-11-18 15:44:57
字體:
來源:轉載
供稿:網友

本文轉自IBM Developerworks中國網站
摘要:我們在設計系統接口時,經常會碰到這樣的問題:

  1、我們的接口應該提供多少方法才合適?

  2、我們的接口應該提供"原子方法"還是"復合方法"?

  3、我們的接口是否應該封裝(或者,能否封裝)所有的細節?

  接口的設計需要考慮用戶的使用習慣、使用的方便程度、使用的安全程度,根據我的編程經驗,下面會具體討論接口設計的2個需要權衡的方面:接口的單一化 & 復合化。

  接口

  接口提供了不同系統之間或者系統不同組件之間的界定。在軟件中,接口提供了一個屏障,從而從實現中分離目標,從具體中分離抽象,從作者中分離用戶。

  站在用戶的角度看,一個接口建立并命名了一個目標對象的使用方法。一些約束(例如:編譯時的類型系統、運行時的異常機制及返回值)使得類作者的目的得以體現和加強。供給(affordances)指事物的被感知的真實的屬性,這些屬性可以決定事物使用的可能方法,供給提供了對事物操作的線索。

  類設計者的一個職責便是在接口中減小約束與供給之間的隔閡、匹配目標以及一定程度上的自由度,盡可能減小錯誤使用目標對象的可能。

  封裝

  對于封裝來說,遠不止數據私有那么簡單。在設計中,封裝往往會涉及到自我包含(self-containment)。假如一個類需要你知道如何調用它方法(e.g. 在一個線程的環境中,在一個方法調用后調用另一個方法,你必須明確地同步對象),那么它的封裝性就不如將所有這些全部包含并隱藏的類(e.g. 這個類是thread-safe的)好。前一個設計存在著設計的漏洞,它的許多限定條件是模糊的,而且把部分責任推給了用戶,而不是讓類提供者做這些工作來完成類的設計。

  在空間或者時間上分離方法的執行(例如,線程,遠程方法調用,消息隊列),能夠對設計的正確性和效率產生意義深遠的影響。這種分離帶來的結果是不可忽視的:
  1. 并發引入了不確定性和環境(context)選擇的開銷;
  2. 分布引入了回調的開銷,這些開銷可能不斷增加,而且會導致錯誤。
  這些是設計的問題,修改它們可不是象修改bug那樣簡單。

  假如一個接口主要由存取方法(set和get方法)組成,每個方法都相應的直接指向某個私有域,那么它的封裝性會很差。接口中的域存取方法通常是不會提供信息的:他們在對象的使用中不能通訊、簡單化和抽象化,這通常會導致代碼冗長,并且輕易出錯。

  所以,我們首先考慮接口設計的第一個原則:

  命令與查詢分離(Command-Query Separation)
  要求:保證一個方法不是命令(Command)就是查詢(Query)

定義:
  查詢:當一個方法返回一個值往返應一個問題的時候,它就具有查詢的性質;
  命令:當一個方法要改變對象的狀態的時候,它就具有命令的性質;

  通常,一個方法可能是純的Command模式或者是純的Query模式,或者是兩者的混合體。在設計接口時,假如可能,應該盡量使接口單一化,保證方法的行為嚴格的是命令或者是查詢,這樣查詢方法不會改變對象的狀態,沒有副作用(side effects),而會改變對象的狀態的方法不可能有返回值。也就是說:假如我們要問一個問題,那么就不應該影響到它的答案。實際應用,要視具體情況而定,語義的清楚性和使用的簡單性之間需要權衡。

  例如,在java.util.Iterator中,hasNext可以被看作一種查詢,remove是一種命令,next合并了命令和查詢:
public interface Iterator{boolean hasNext();Object next();void remove();}

  這里,假如不將一個Iterator對象的當前值向前到下一個的話,就不能夠查詢一個Iterator對象。假如沒有提供一個復合方法next,我們將需要定義一系列的命令方法,例如:初始化(initialization)、繼續(continuation)、訪問(access)和前進(advance),它們雖然清楚定義了每個動作,但是,客戶代碼過于復雜:
for(initialization; continuation condition; advance){

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 饶平县| 安陆市| 宜城市| 铜梁县| 绥宁县| 班戈县| 外汇| 嘉义市| 皋兰县| 遵义市| 九江县| 纳雍县| 密山市| 兴国县| 苗栗市| 阜南县| 泰安市| 丘北县| 临颍县| 常德市| 巩义市| 房产| 平凉市| 历史| 竹北市| 镇巴县| 南召县| 育儿| 新密市| 甘肃省| 托克托县| 鄯善县| 东至县| 蒙山县| 满城县| 大同市| 恭城| 浦北县| 玉环县| 金平| 秭归县|