設計原則的簡單理解

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...