欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Deep Module深模塊之軟件設計

 更新時間:2022年07月11日 11:34:54   作者:氫氦  
這篇文章主要介紹了軟件設計之Deep Module深模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

類是不是越小越好?最近在讀John Ousterhout的《A Philosophy of Software Design》,感到作者文筆流暢,書中內(nèi)容具有啟發(fā)性。這里摘要一部分內(nèi)容,以供開發(fā)工作中的參考、學習。

在軟件復雜度的管理當中,最重要的技術之一是通過對系統(tǒng)的設計,使開發(fā)者任何在時候都只需要面對整體復雜度中的一小部分。這個過程被稱為模塊化設計。

復雜度是什么?在本文中,復雜度的定義是:和軟件系統(tǒng)結構有關的、會導致理解和修改系統(tǒng)變困難的東西。

1,模塊化設計

在模塊設計中,軟件系統(tǒng)被分解為相對獨立的模塊集合。模塊的形式多種多樣,可以是類、子系統(tǒng)、或服務等。在理想的世界中,每個模塊都完全獨立于其它模塊:開發(fā)者在任何模塊中工作的時候,都不需要知道有關其它模塊的任何知識。在這種理想狀態(tài)下,系統(tǒng)復雜度取決于系統(tǒng)中復雜度最高的模塊。

當然,實踐與理想不同,系統(tǒng)模塊間總會多少有些依賴。當一個模塊變化時,其它模塊可能也需要隨之而改變。模塊化設計的目標就是最小化模塊間的依賴。

為了管理依賴,我們可以把模塊看成兩部分:接口實現(xiàn)。

接口包含了全部的在調(diào)用該模塊時需要的信息。接口只描述模塊做什么,但不會包含怎么做。

完成接口所做出的承諾的代碼被稱為實現(xiàn)。

在一個特定模塊內(nèi)部進行工作的開發(fā)者必須知道的信息是:當前模塊的接口和實現(xiàn)+其它被該模塊使用的模塊的接口。他不需要理解其它模塊的實現(xiàn)。

在本文中,包含接口/實現(xiàn)的任何代碼單元,都是模塊。面向?qū)ο笳Z言中的類是模塊,類中的方法也是模塊,非面向?qū)ο笳Z言中的函數(shù)也是模塊。高層的子系統(tǒng)和服務也可以被看作模塊,它們的接口也許是多種形式的,比如內(nèi)核調(diào)用或HTTP請求。本文中的大部分內(nèi)容針對的是類,但這些技術和理論對其它類型的模塊也有效。

好模塊的接口遠遠比實現(xiàn)更簡單。這樣的模塊有2個優(yōu)點。首先,簡單的接口最小化了模塊施加給系統(tǒng)其余部分的復雜度。其次,如果修改模塊時可以不修改它的接口,那么其他模塊就不會被修改所影響。如果模塊的接口遠遠比實現(xiàn)簡單,那么就更有可能在不改動接口的情況對模塊進行修改。

2,接口里有什么

接口中包含2種信息:正式的和非正式的。

正式的信息在代碼中被顯式指定,程序語言可以檢查其中的部分正確性。比如,方法的簽名就是正式的信息,它包含參數(shù)的名稱和類型,返回值的類型,異常的信息。很多程序語言可以保證代碼中對方法的調(diào)用提供了與方法定義相匹配的參數(shù)值。

接口里面也包含非正式的元素。非正式部分無法被程序語言理解或強制執(zhí)行。接口的非正式部分包含一些高層行為,比如函數(shù)會根據(jù)某個參數(shù)的內(nèi)容刪除具有相應名字的文件。如果某個類的使用存在某種限制,比如方法的調(diào)用需要符合特定順序,那這也屬于接口的一部分。凡是開發(fā)者在使用模塊時需要了解的信息,都可以算作模塊接口的一部分。接口的非正式信息只能通過注釋等方式描述,程序語言無法確保描述是完整而準確的。大部分接口的非正式信息都比正式信息要更多、更復雜。

清晰的接口定義有助于開發(fā)者了解在使用模塊時需要知道的信息,從而避免一些問題。

3,抽象

 抽象這一術語和模塊設計思想的關系很近。抽象是實體的簡化視圖,省略了不重要的細節(jié)。抽象很有用,它可以使我們對細節(jié)的思考和操縱變簡單。

在模塊化編程中,每個模塊通過接口提供其抽象。抽象代表了函數(shù)功能的簡化視圖。在函數(shù)抽象的立場上,實現(xiàn)的細節(jié)是不重要的,所以它們被省略了。

“不重要”這個詞很關鍵。如果沒有忽略掉不重要的細節(jié),那么抽象會變得復雜,會增加開發(fā)者的認知負擔;如果忽略掉了重要的細節(jié),那么抽象會變得錯誤,失去對實踐的指導意義。設計抽象的關鍵是理解什么是重要的,并尋找最小化重要信息的設計。

依賴抽象來管理復雜度不是編程的專利,它遍布在我們的日常生活中。就像車子會提供一個簡單抽象來讓我們駕駛,并不需要我們理解發(fā)動機、電池、ABS之類的東西。

4,深模塊

最好的模塊提供了強大的功能,又有著簡單的接口。術語“”可以用于描述這種模塊。為了讓深度的概念可視化,試想每個模塊由一個長方形表示,如下圖,

長方形的面積大小和模塊實現(xiàn)的功能多少成比例。頂部邊代表模塊的接口,邊的長度代表它的復雜度。最好的模塊是深的:他們有很多功能隱藏在簡單的接口后。深模塊是好的抽象,因為它只把自己內(nèi)部的一小部分復雜度暴露給了用戶。

淺模塊的接口復雜,功能卻少,它沒有隱藏足夠的復雜度。

可以從成本與收益的角度思考模塊深度。模塊提供的收益是它的功能。模塊的成本(從系統(tǒng)復雜度的角度考慮)是它的接口。接口代表了模塊施加給系統(tǒng)其余部分的復雜度。接口越小而簡單,它引入的復雜度就越少。好的模塊就是那些成本低收益高的模塊。

某些語言中的垃圾回收(GC)是深模塊的例子之一。這個模塊沒有接口,它在需要回收無用內(nèi)存的場景下不可見地工作。在系統(tǒng)中加入垃圾回收的做法,縮小了系統(tǒng)的總接口,因為這種做法消除了用于釋放對象的接口。垃圾回收的具體實現(xiàn)是相當復雜的,但這一復雜度在實際使用程序語言的時候是隱藏的。

5,淺模塊

相對的,淺模塊就是接口相對功能而言很復雜的模塊。下面是個可能有些極端的例子,

private void addNullValueForAttribute(String attribute) {
  data.put(attribute, null);
}

從復雜度管理的角度來看,該方法把事情變糟了。它沒有提供抽象,因為所有的功能都是在接口上可見的。思考這一接口并不會比思考它的完整實現(xiàn)更簡單。如果方法有合適的文檔,文檔也不會比方法的代碼具有更多信息。相比于直接操作data,它的長名字甚至會導致開發(fā)者敲擊鍵盤的次數(shù)變多。這種方法增加了復雜度(引入了一個需要開發(fā)者了解的新接口),但并沒有提供與之相應的收益。注意:小的模塊會更傾向于變淺。

6,Classitis

當今,深模塊的價值并沒有被廣為接受。一般常識是類需要小,而不是深。學生們被告知:類設計中最重要的事情是把大類拆分成更小的類。相似的建議還包括:“要把方法行數(shù)大于N的方法分成多個方法”,有時候N甚至只有10這么小。這會導致大量的淺模塊,增加系統(tǒng)的總復雜度。

極端的“類應該小”的做法是一種綜合癥的表現(xiàn),這種癥狀可以被稱為Classitis。它源于一種錯誤思維:“類是好的,所以越多類越好”。這種思想最終會導致系統(tǒng)層面積累了巨大的復雜度,程序風格也會變得啰嗦。

7,例子

Java類庫可能是Classitis的最明顯例子之一。Java語言本身不需要很多小類,但Classitis文化可能已經(jīng)在Java語言社區(qū)扎了根。比如,為了打開文件讀取其中的序列化對象,你必須創(chuàng)建多種對象:

FileInputStream fileStream =
    new FileInputStream(fileName);
BufferedInputStream bufferedStream =
    new BufferedInputStream(fileStream);
ObjectInputStream objectStream =
    new ObjectInputStream(bufferedStream);

FileInputStream對象只提供初步的I/O,它不具備緩存I/O的能力,也不能讀寫序列化對象。BufferedInputStream和ObjectInputStream分別提供了后面兩項功能。文件打開之后,fileStream和bufferedStream就沒用了,未來的操作只會用到objectStream.。

必須顯式單獨創(chuàng)建BufferedInputStream對象來請求緩存,這很煩人而且易出錯。如果開發(fā)者忘記創(chuàng)建它,就不會有緩存,而且I/O會慢。大概Java開發(fā)者會辯解說,不是所有人都需要緩存,所以它不應該包含在基本讀寫機制中。他們也許會說讓緩存獨立更好,借此用戶可以選擇是否使用它。提供選擇空間當然很好,但接口需要設計為對常用場景盡可能簡單,幾乎所有文件I/O用戶都想使用緩存,所以就應該默認提供它。對于少數(shù)不需要的情況,庫可以提供機制以禁用。禁用緩存的機制應該明確地在接口中分離(例如,為FileInputStream提供不同的構造器,或者通過一個方法禁用/替換緩存機制),這樣大部分開發(fā)者甚至不需要意識到它的存在。

8,結論

通過將模塊的接口和實現(xiàn)分離,我們可以對系統(tǒng)的其它部分隱藏實現(xiàn)的復雜度。模塊的使用者只需要理解接口提供的抽象。在設計類和其它模塊時,最重要的問題是讓它們深,它們要對常見用例有足夠簡單的接口,但同時依然提供強大的功能。這就最大化地隱藏了復雜度。

以上就是Deep Module深模塊之軟件設計的詳細內(nèi)容,更多關于Deep Module深模塊的資料請關注腳本之家其它相關文章!

相關文章

  • SpringCloud之Feign示例詳解

    SpringCloud之Feign示例詳解

    本篇文章主要介紹了SpringCloud之Feign示例詳解,詳細的介紹了Feign簡介和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java實現(xiàn)驗證文件名有效性的方法詳解

    Java實現(xiàn)驗證文件名有效性的方法詳解

    在本文中,我們將討論使用?Java?驗證一個給定的字符串是否具有操作系統(tǒng)的有效文件名的不同方法,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-09-09
  • mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    這篇文章主要介紹了mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 通過ibatis解決sql注入問題

    通過ibatis解決sql注入問題

    這篇文章主要介紹了通過ibatis解決sql注入問題,需要的朋友可以參考下
    2017-09-09
  • Spring入門配置和DL依賴注入實現(xiàn)圖解

    Spring入門配置和DL依賴注入實現(xiàn)圖解

    這篇文章主要介紹了Spring入門配置和DL依賴注入實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java創(chuàng)建,編輯與刪除Excel迷你圖表的實現(xiàn)方法

    Java創(chuàng)建,編輯與刪除Excel迷你圖表的實現(xiàn)方法

    迷你圖是Excel工作表單元格中表示數(shù)據(jù)的微型圖表。本文將通過Java代碼示例介紹如何在Excel中創(chuàng)建迷你圖表,以及編輯和刪除表格中的迷你圖表,需要的可以參考一下
    2022-05-05
  • SpringBoot通過注解注入Bean的幾種方式解析

    SpringBoot通過注解注入Bean的幾種方式解析

    這篇文章主要為大家介紹了SpringBoot注入Bean的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • 解決fcitx輸入法在IDEA中輸入法候選框無法跟隨光標移動的問題

    解決fcitx輸入法在IDEA中輸入法候選框無法跟隨光標移動的問題

    這篇文章主要介紹了解決fcitx輸入法在Intellij IDEA開發(fā)工具中輸入法候選框無法跟隨光標移動的問題,代碼簡單易懂對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • mybatis中大批量數(shù)據(jù)插入解析

    mybatis中大批量數(shù)據(jù)插入解析

    這篇文章主要介紹了mybatis中大批量數(shù)據(jù)插入解析,使用Mybatis框架批量插入的3種方法,分別是多次調(diào)用insert方法、foreach標簽、batch模式,本文來詳細說明一下,需要的朋友可以參考下
    2024-01-01
  • Java結構型模式之橋接模式詳解

    Java結構型模式之橋接模式詳解

    橋接模式是一種很實用的結構型模式,如果系統(tǒng)中某個類存在兩個獨立變化的維度,通過橋接模式將這兩個維度分離出來,使兩者可以獨立擴展
    2023-02-02

最新評論