溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

The Principles of OOD 面向?qū)ο笤O(shè)計(jì)原則

發(fā)布時(shí)間:2020-07-04 08:52:19 來(lái)源:網(wǎng)絡(luò) 閱讀:352 作者:vivo互聯(lián)網(wǎng) 欄目:開(kāi)發(fā)技術(shù)

本文首發(fā)于vivo互聯(lián)網(wǎng)技術(shù)微信公眾號(hào)
作者:Robert C. Martin
翻譯:張碩
本文由來(lái)自美國(guó)業(yè)界大?!猂obert C. Martin(俗稱“Bob大叔) 發(fā)布在 butunclebob.com 上,已獲得翻譯授權(quán)。
英文原文鏈接:http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
本篇概括性的介紹了OOD的設(shè)計(jì)原則,后續(xù)還有更多文章會(huì)詳細(xì)剖析、吃透面向?qū)ο髽I(yè)務(wù)設(shè)計(jì)的原則。

The Principles of OOD 面向?qū)ο笤O(shè)計(jì)原則

什么是面向?qū)ο笤O(shè)計(jì)?它是怎么一回事?使用它會(huì)有什么利弊得失?似乎問(wèn)出這些問(wèn)題顯得有些愚蠢,特別是在一個(gè)幾乎每個(gè)開(kāi)發(fā)者都會(huì)使用某種面向?qū)ο笳Z(yǔ)言的時(shí)代中。

然而在我看來(lái),這些問(wèn)題即極為重要,因?yàn)槲覀冎械拇蠖鄶?shù)使用者并不知道答案,當(dāng)然也不知道如何發(fā)揮面向?qū)ο笳Z(yǔ)言的最大價(jià)值。

在我們這個(gè)行業(yè)發(fā)生的所有變革中,有兩場(chǎng)是非常成功的,以至于它們已經(jīng)***到我們的思維中,以至于我們認(rèn)為它們是理所當(dāng)然的。那就是"結(jié)構(gòu)化設(shè)計(jì)\編程"(也叫面向過(guò)程設(shè)計(jì))與"面向?qū)ο笤O(shè)計(jì)\編程"。所有主流的現(xiàn)代編程語(yǔ)言都被這兩種編程范式深刻影響。甚至是,我們很難摒棄這兩種編程范式去寫(xiě)任何一個(gè)程序。

我們的主流編程語(yǔ)言中沒(méi)有“GOTO”,因此似乎是遵守了著名的結(jié)構(gòu)化編程"禁令";我們大多數(shù)的主流編程語(yǔ)言是基于類(lèi)并且不支持使用沒(méi)有寫(xiě)入任何一個(gè)類(lèi)中的變量、函數(shù)(方法),因此他們似乎是遵守了面向?qū)ο笤O(shè)計(jì)中最明顯的特點(diǎn)。

用這些語(yǔ)言(主流結(jié)構(gòu)化語(yǔ)言或面向?qū)ο笳Z(yǔ)言)寫(xiě)出的程序也許看上去是結(jié)構(gòu)化的或面向?qū)ο蟮?,但是外表也可以是虛假的。今天的程序員常常不知道這些語(yǔ)言產(chǎn)生的原因以及其中的基礎(chǔ)原則。在另一篇博客中,我會(huì)討論結(jié)構(gòu)化編程的設(shè)計(jì)原則,而在這篇文章中我想要聊聊面向?qū)ο笤O(shè)計(jì)原則。

在1995年3月,在comp.object上,我寫(xiě)過(guò)一篇文章,這篇文章也成為我日后眾多OOD設(shè)計(jì)原則文章中的×××作。你們將會(huì)在我的PPP書(shū)籍中以及發(fā)表了我多篇文章的objectmentor網(wǎng)站上看到這些文章,當(dāng)然也包括那個(gè)廣為人知的那篇摘要文章。(譯者注:PPP指——“Agile Software Development: Principles, Patterns, and Practice,中文即—敏捷軟件開(kāi)發(fā):原則、模式與實(shí)踐”

這些原則揭示了OOD依賴管理方面的內(nèi)涵,而在概念化和建模方面并沒(méi)有深入涉及。然而這并不代表OO在對(duì)問(wèn)題領(lǐng)域的概念化上很薄弱,也不代表OO在建模能力上很薄弱。我很確定在這兩方面上,很多從OO設(shè)計(jì)原則中獲得價(jià)值。需要注意的是,這些原則非常關(guān)注依賴關(guān)系管理。

譯者注:此處指寬泛概念的依賴關(guān)系管理,如系統(tǒng)與系統(tǒng)之間的依賴,模塊與模塊之間的依賴,類(lèi)方法直接的依賴

依賴管理是一個(gè)大多數(shù)架構(gòu)師需要面對(duì)的問(wèn)題。每當(dāng)我們?cè)谄聊簧峡吹揭欢褋y七八糟的遺留代碼時(shí),我們都在經(jīng)歷依賴管理不善的結(jié)果。糟糕的依賴關(guān)系管理導(dǎo)致代碼難以更改、脆弱和不可重用。實(shí)際上,在我的PPP書(shū)中談到了幾種不同的設(shè)計(jì)風(fēng)格,都與依賴管理有關(guān)。另一方面,當(dāng)依賴關(guān)系得到很好的管理時(shí),代碼仍然是靈活可擴(kuò)展的、健壯的和可重用的。因此,依賴關(guān)系管理的思考,以及這些原則的使用,是軟件開(kāi)發(fā)人員設(shè)計(jì)靈活性系統(tǒng)的基礎(chǔ)。

以下5個(gè)原則是階級(jí)設(shè)計(jì)原則:

* SRP單一職責(zé)原則 指一個(gè)類(lèi)\模塊\包甚至系統(tǒng) 都應(yīng)該有單一的原則。

  • OCP開(kāi)閉原則 你應(yīng)該能夠擴(kuò)展類(lèi)的行為,而不需要修改它。

如果軟件系統(tǒng)想要更容易被改變,其設(shè)計(jì)就必須允許新增代碼來(lái)修改,而非修改原來(lái)代碼。

  • LSP 里氏替換原則
    簡(jiǎn)答理解就是 如果想要可替換的組件來(lái)構(gòu)建軟件系統(tǒng),那么這些組件就必須遵守共同一個(gè)約定,以便讓這些組件可以相互替換。

* ISP 接口隔離原則
使細(xì)粒度接口特定于客戶端,主要告誡設(shè)計(jì)師應(yīng)該在設(shè)計(jì)中避免不必要的依賴。

  • DIP 依賴倒置原則
    依賴抽象,而非具體實(shí)現(xiàn)。此原則指出高層策略性代碼不應(yīng)該依賴實(shí)現(xiàn)的代碼,相反,那些底層實(shí)現(xiàn)應(yīng)該依賴于高層策略代碼。(譯者注:這里的“類(lèi)”泛指:方法和數(shù)據(jù)的耦合分組

接下來(lái)的六條原則是關(guān)于包(譯者注:指jar、war,而非package)的。在這個(gè)上下文中,包是二進(jìn)制的可交付文件,比如:jar文件,或者dll,而不是java包或c++命名空間。前三個(gè)包原則是關(guān)于包內(nèi)聚的,它們告訴我們?cè)诎蟹湃胧裁矗?/p>

  • REP 重用發(fā)布等價(jià)原則 重用的顆粒就是釋放的顆粒。

  • CCP 共同封閉原則 一起更改的類(lèi)被打包在一起。

  • CRP 共同重用原則 一起使用的類(lèi)被打包在一起。

  • ADP 無(wú)環(huán)依賴原則 包的依賴關(guān)系圖必須沒(méi)有循環(huán)。

  • SDP 穩(wěn)定依賴原則 依賴于穩(wěn)定性的方向,特別是(變化更多的)具體的元素應(yīng)該取決于是否要完全依賴于(更穩(wěn)定的)抽象成分。

  • SAP 穩(wěn)定抽象原則 抽象性隨穩(wěn)定性而增加。
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI