【0718作業】收集和整理面向對象的六大設計原則

面向對象的六大設計原則

(1)單一職責原則——SRP

(2)開閉原則——OCP

(3)里式替換原則——LSP

(4)依賴倒置原則——DIP

(5)接口隔離原則——ISP

(6)迪米特原則——LOD

——————————————————————————————

單一職責原則

一個類,只有一個引起它變化的原因,只有一個職責。

如果一個類承擔的職責過多,就等于把這些職責耦合在一起了。一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當發生變化時,設計會遭受到意想不到的破壞。而如果想要避免這種現象的發生,就要盡可能的遵守單一職責原則。此原則的核心就是解耦和增強內聚性

?

(1)可以降低類的復雜度(2)提高類的可讀性,和系統的維護性(3)當發生變化的時候,能將變化的影響降到最小,因為只會在這個類中做出修改。

?

開閉原則

開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對于擴展是開放的,但是對于修改是封閉的,這意味著一個實體是允許在不改變它的源代碼的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源代碼需要代碼審查,單元測試以及諸如此類的用以確保產品使用質量的過程。遵循這種原則的代碼在擴展時并不發生改變,因此無需上述的過程。

當需求發生改變的時候,我們需要對代碼進行修改,這個時候我們應該盡量去擴展原來的代碼,而不是去修改原來的代碼,用抽象去構建框架,用實現擴展細節。這樣當發生修改的時候,我們就直接用抽象了派生一個具體類去實現修改。

?

里氏替換原則

在面向對象的程序設計中,里氏替換原則是對子類型的特別定義。“派生類(子類)對象可以在程式中代替其基類(超類)對象。”子類可以去擴展父類的功能,但是不能改變父類原有的功能。【里氏替換原則和開閉原則往往是相互依存的。】

?

1)子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。

2)子類可以增加自己獨有的方法。

3)當子類的方法重載父類的方法時候,方法的形參要比父類的方法的輸入參數更加寬松。

4)當子類的方法實現父類的抽象方法時,方法的返回值要比父類更嚴格。

?

依賴倒置原則

是指一種特定的解耦(傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于低層次的模塊的實現細節,依賴關系被顛倒(反轉),從而使得低層次模塊依賴于高層次模塊的需求抽象。高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。依賴于抽象,不要依賴于具體。

?

?接口隔離原則

客戶端應該不依賴于它不使用的方法。使用多個隔離的接口,比使用單個接口要好。目的是系統解開耦合,從而容易重構,更改和重新部署。在面向對象設計中,接口(interface)提供了便于代碼在概念上解釋的抽象層,并創建了避免依賴的一個屏障。

建立單一接口,不要建立龐大臃腫的接口,盡量細化接口,接口中的方法盡量少

?△接口隔離原則使用注意:

1)接口盡量小,但是要有限度。對接口進行細化可以提高程序設計靈活性是不掙的事實,但是如果過小,則會造成接口數量過多,使設計復雜化。所以一定要適度。
2)為依賴接口的類定制服務,只暴露給調用的類它需要的方法,它不需要的方法則隱藏起來。只有專注地為一個模塊提供定制服務,才能建立最小的依賴關系。
3)提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。

?

迪米特原則

一個對象應該對其他對象保持最少的了解因為類與類之間的關系越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大,所以這也是我們提倡的軟件編程的總的原則:低耦合,高內聚。一個類對自己依賴的類知道的越少越好。也就是說,對于被依賴的類來說,無論邏輯多么復雜,都盡量地的將邏輯封裝在類的內部,對外除了提供的public方法,不對外泄漏任何信息。

?

轉載于:https://www.cnblogs.com/yanglanlan/p/11222995.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據科學 python_適用于數據科學的Python vs(和)R

數據科學 pythonChoosing the right programming language when taking on a new project is perhaps one of the most daunting decisions programmers often make.在進行新項目時選擇正確的編程語言可能是程序員經常做出的最艱巨的決定之一。 Python and R are no doubt amon…

如何進行有效的需求調研

一、什么是需求調研?需求調研對于一個應用軟件開發來說,是一個系統開發的開始階段,它的輸出“軟件需求分析報告”是設計階段的輸入,需求調研的質量對于一個應用軟件來說,是一個極其重要的階段,它的質量在一…

java中直角三角形第三條邊,Java編程,根據輸入三角形的三個邊邊長,程序能判斷三角形類型為:等邊、等腰、斜角、直角三角形,求代碼...

private static Scanner sc;private static int edge[] new int[3];public static void main(String[] args) {System.out.println("請輸入三角形的三條邊");sc new Scanner(System.in);input();}public static void input() {int index 0;//數組下標while (sc.ha…

react中使用構建緩存_使用React和Netlify從頭開始構建電子商務網站

react中使用構建緩存In this step-by-step, 6-hour tutorial from Coding Addict, you will learn to build an e-commerce site from scratch using React and create-react-app.在這個Coding Addict的分步,為時6小時的教程中,您將學習使用React和creat…

Django+Vue前后端分離項目的部署

部署靜態文件: 靜態文件有兩種方式 1:通過django路由訪問 2:通過nginx直接訪問 方式1: 需要在根目錄的URL文件中增加 url(r^$, TemplateView.as_view(template_name"index.html")),作為入口,在setting中更改…

leetcode 547. 省份數量(bfs)

有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那么城市 a 與城市 c 間接相連。 省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。 給你一…

r怎么對兩組數據統計檢驗_數據科學中最常用的統計檢驗是什么

r怎么對兩組數據統計檢驗Business analytics and data science is a convergence of many fields of expertise. Professionals form multiple domains and educational backgrounds are joining the analytics industry in the pursuit of becoming data scientists.業務分析和…

win10專業版激活(cmd方式)

轉載于:https://www.cnblogs.com/bug-baba/p/11225322.html

mit景觀生成技術_永遠不會再為工作感到不知所措:如何使用MIT技術

mit景觀生成技術by Sihui Huang黃思慧 永遠不會再為工作感到不知所措:如何使用MIT技術 (Never feel overwhelmed at work again: how to use the M.I.T. technique) Have you ever felt exhausted after a day at work? At the end of a busy day, you couldn’t …

leetcode 189. 旋轉數組

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,1,2,3,4,5] 向右旋轉 3 步: [5,6,7,1,2,3,4] 代碼 cla…

aws ec2 php,如何使用php aws sdk啟動和停止ec2實例

以下是從定義的AMI啟動計算機的基本示例:$image_id ami-3d4ff254; //Ubuntu 12.04$min 1; //the minimum number of instances to start$max 1; //the maximum number of instances to start$options array(SecurityGroupId > default, //replace with your …

python3 遞歸

遞歸調用:  在調用一個函數的過程中,直接或者簡介調用了該函數本身 必須有一個明確的結束條件 遞歸特性:  1. 必須有一個明確的結束條件  2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少  3. 遞歸效率不高,…

深度學習概述_深度感測框架概述

深度學習概述I have found the DeepSense framework as one of the promising deep learning architectures for processing Time-Series sensing data. In this brief and intuitive overview, I’ll present the main ideas of the original paper titled “Deep Sense: A Un…

css響應式網格布局生成器_如何使用網格布局模塊使用純CSS創建響應表

css響應式網格布局生成器TL; DR (TL;DR) The most popular way to display a collection of similar data is to use tables, but HTML tables have the drawback of being difficult to make responsive.顯示相似數據集合的最流行方法是使用表,但是HTML表具有難以響…

Axure注冊碼

適用版本 Axure 8.1.0.3377 zdfans.com gP5uuK2gHiIVO3YFZwoKyxAdHpXRGNnZWN8Obntqv7FF3pAz7dTu8B61ySxli 轉載于:https://www.cnblogs.com/mengjianzhou/p/11226260.html

命令行窗口常用的一些小技巧

一. 打開命令行窗口的方式 1. 按住【shift】鍵,在桌面右擊,選擇“在此處打開命令行窗口(W)”,如下圖所示: 2. 按住【開始】 R快捷鍵,彈出運行窗口,輸入cmd,回車(確定)即可。 二. 常用…

php soapserver 參數,PHP SoapServer – 節點中的屬性

PHP肥皂功能是如此瘋狂,我從來沒有發現它的錯誤.我試圖通過SOAP API連接和更新數據到zimbra,并且有很多問題.所以我使用了SimpleXMLElement&卷曲:)在那里你可以像這樣構建你的XML:$xml new SimpleXMLElement(); // create your base$xml $xml->addChild(ta…

leetcode 123. 買賣股票的最佳時機 III(dp)

給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 示例 1: 輸入&…

為什么即使在班級均衡的情況下,準確度仍然令人困擾

Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that many people are too comfo…

filebeat向kafka傳輸數據,無數據現象

通過netstat 能夠看到filebeat確實是有向kafka傳輸數據, filebeat 日志顯示 那就需要修改 /etc/hosts文件 將kafka主機的名字和ip寫入filebeat主機的hosts文件中。 轉載于:https://www.cnblogs.com/liuYGoo/p/11226272.html