設計原則的簡單理解

来源:https://www.cnblogs.com/yizui/archive/2019/03/27/10605859.html
-Advertisement-
Play Games

前言 好的代碼需要有高內聚、低耦合、易擴展且擴展改動小等特點。說實話,我入行很久之後,才知道這些設計原則的名字,但是我並不覺得陌生,反而有一種理所當然的感覺。這得感謝自學時網路上前輩們推薦的書籍,培養了自己的代碼潔癖,還得感謝轉行後的第一個東家!以下只是我的理解,如有錯誤,請指正。 單一職責原則 顧 ...


前言

好的代碼需要有高內聚、低耦合、易擴展且擴展改動小等特點。說實話,我入行很久之後,才知道這些設計原則的名字,但是我並不覺得陌生,反而有一種理所當然的感覺。這得感謝自學時網路上前輩們推薦的書籍,培養了自己的代碼潔癖,還得感謝轉行後的第一個東家!以下只是我的理解,如有錯誤,請指正。

單一職責原則

顧名思義,單一職責就是函數或類只做一件事,但是"只做一件事"肯定是針對不同抽象層次的。
舉個例子,我要寫一個文件,於是我定義了write()這麼一個函數,它確實只做一件事。但是這個write()對於寫一個文件來說是不夠的,我肯定還需要open()close(),自然這兩個函數也只做了一件事。
但我要真正寫一個文件,希望得到的是下麵的函數

int write_file()
{
    open();
    write();
    close();
}

對於write_file()的調用者來說,write_file()確實只做了一件事,它幫我寫了一個文件。但對於寫write_file()的程式員來說,write_file()明明做了三件事。
單一職責的職責是對外抽象後的職責,只要函數或類所做的事不超過這個抽象定義,那就不算違背單一職責。

越底層的函數越容易確定職責,甚至只需要這個函數寫的足夠短小,其職責一般就能保證單一。高層的函數或者類就需要考驗程式員的抽象能力了。一個簡單的檢查該抽象是否能做到單一職責的方法,就是看看函數內是否只做了函數名要求的事,類內所有成員函數和成員變數是否只是為了做到類名要求的事。

當我們長期遵循單一職責原則時,我們會習慣於將一個任務拆分為多個最小步驟,而這通常意味著可以通過流水線,並行等方式來執行這些最小步驟,達到提升性能的目的。

里氏替換

里氏替換就是指子類可以出現在父類出現的任何地方。這是一個指導我們何時使用繼承的原則。A繼承B,我們說"A是一個B",既然"A是一個B",A自然能替換到B出現的任何地方。如果無法替換的話,說明A不應繼承B。

依賴倒置

依賴倒置就是為了做到面向介面編程。
那為什麼叫倒置呢?原本高層A直接調用底層B的介面,當高層A想用底層C時就可能需要修改大量代碼,原因是C和B是沒有約束的,C的介面與B可能完全不一樣。為了避免替換底層需要修改大量代碼的情況,高層A自己定義了抽象層D,讓底層B和底層C都依賴抽象層D的介面去實現。因為抽象層D是高層定義的,而底層B和C是依賴D去實現的,所以就叫依賴倒置。在C++中,這通過定義虛基類,並繼承該虛基類來實現。

依賴倒置可以使得高層切換底層實現類時,減少代碼修改量,只需要修改一下實例化的代碼即可,更靈活。

class D
{
public:
    virtual foo1() = 0;
    ...
    virtual foon() = 0;
}
class B : public D;
class C : public D;
void A()
{
    D* a = new B; // 切換為C時,只需要修改這一行代碼。
    a->foo1();
    ...
    a->foon();
}

介面隔離原則

介面隔離是針對介面調用者做的隔離,只讓調用者看到其能調用的介面,本質上是最小許可權。大部分IT公司都會宣講信息安全,而為了保證信息安全的一個原則就是最小化原則。介面隔離就是為了程式安全,如果提供了超過調用者許可權的介面,那可能就會引發問題。

迪米特法則

迪米特法則就是最小依賴,依賴更少的類,更少的介面,這樣可以降低類之間的耦合和減少代碼複雜度。如果某個類依賴了很多類,很多介面,那以後其代碼就有更大的可能因為其依賴項的改動而改動,變得不穩定。

開閉原則

對擴展開放,對修改閉合。擴展可以是函數的擴展,也可以是類的擴展,這裡的對修改閉合指的是對本層的修改閉合,因為對於高層來說肯定是需要修改的,比如調用新介面,使用新類的實例。之所以對修改閉合,是為了避免修改引入BUG。

後話

總是遵頊這些設計原則,對自己的代碼能力是有很大益處的。再者設計原則是道,設計模式是術,如果對道理解通透的話,術是可以自行推演的,可能不知不覺中你已經用了某種設計模式了,甚至創造了新的設計模式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於一個的坐擁1.4億多用戶,平均日活躍用戶量超過 3400 萬,人均日訪問時長 1 小時,月累計頁面訪問量達到 230 億的大廠來說(數據截止2018年 3 月),知乎的AI都到底應用在了哪些領域,這中間應用到了哪些技術和模型,又產生了哪些作用?今日第1期數智方法論將從內容生產、內容消費與分發、內... ...
  • 那個時候初入java這個大家庭,學習的方向很亂。畢業後,在公司磨練了一年,總想著是該交一份答卷了,可能成績不會很好,但求及格!那麼考試題目呢,我計劃搭建一個橫向可擴展的項目,可以在平臺自擴展各種子項目,包括 後臺許可權控制,日誌分析,秒殺,微信小程式,愛代客(www.idaike.com)項目等等,所 ...
  • OO第一單元作業總結 在第一單元作業中,我們只做了一件事情:求導,對多項式求導,對帶三角函數的表達式求導,對有括弧嵌套的表達式求導。作業難度依次遞增,讓我們熟悉面向對象編程方法,開始從面向過程向面向對象轉變。本文中,我將介紹我個人每一次作業的做法,以及三次作業的分析,互測時策略。 第一次作業 第一次 ...
  • 第一次OO博客作業 前言 面向對象課程已經經過了4周的時間。前三次作業全部是關於多項式求導的相關內容,內容由易到難,同時我也開始逐漸深入感受學習面向對象的各項特征,逐漸將自己的編程風格從C向真正的面向對象語言轉換。同時我還接觸了DEBUG和互測屋這樣嶄新的學習方式,在閱讀別人代碼的過程中不斷增強自己 ...
  • 一、由於項目需要進行手機看板展示設計及開發展示效果圖如下: 上圖為概況(點擊相應模塊進入詳情頁面) 上圖為運營統計(一些統計類圖標狀圖折線圖等......) 車輛分佈狀況(展示在地圖上分佈) 上圖為點擊一輛車的軌跡和運行情況 此產品唯一亮點在於完全可以把利用HTML5和echarts開發大數據大屏展 ...
  • 本文是BUAA OO課程Unit1在課程講授、三次作業完成、自測和互測時發現的問題,以及傾聽別人的思路分享所引起個人的一些思考的總結性博客。本文第二部分介紹三次作業的設計思路,主要以類圖的形式展現,並有簡單的優劣分析;第三部分為程式代碼複雜度的分析(二、三兩部分為基於度量的對自己程式結構的分析);第... ...
  • 一、前言 經過一個月來的學習,我從對面向對象一無所知到逐漸入門,圍繞著“多項式求導”,對面向對象的特性進行了探索。 我對面向對象印象最深的兩句話就是“萬物皆對象”和“高內聚、低耦合”,這三次作業也是儘量貫徹了這兩句話。 我們的作業從第一次的僅含冪函數的求導,到第二次包含正餘弦函數,再到最後函數可以嵌 ...
  • 一. 基於度量的程式結構分析 1. 第一次作業 這次作業是我上手的第一個java程式,使用了4個類來實現功能。多項式採用兩個arraylist來存,繫數和冪指數一一對應。 四個類分別為 Poly類,代表表達式; PolyDiff類,代表求導運算; PolyParse類,封裝了格式檢查,encodin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...