深入理解設計模式(終):總結--設計模式是藥,沒病就不要吃藥

来源:https://www.cnblogs.com/xuwendong/archive/2019/04/15/10284143.html
-Advertisement-
Play Games

系列鏈接地址: 深入理解設計模式 系列目錄 一、產品汪的神助攻,代碼狗的安慰劑 定義:設計模式,指的是一個場景(context)下的一種解決方法(Solution),只要大家都認可某種模式,那麼就只需要很短的一個名字,就可以代替很多很多的語言和文字交流,如果你覺得設計模式降低生產效率,那隻能說你在這 ...


系列鏈接地址: 深入理解設計模式---系列目錄

一、產品汪的神助攻,代碼狗的安慰劑

定義:設計模式,指的是一個場景(context)下的一種解決方法(Solution),只要大家都認可某種模式,那麼就只需要很短的一個名字,就可以代替很多很多的語言和文字交流,如果你覺得設計模式降低生產效率,那隻能說你在這一行還要繼續修煉。

宗旨:保證系統的低耦合高內聚,指導它們的原則無非就是封裝變化,責任單一,面向介面編程等設計原則

目的:就是為了讓代碼變得更容易理解和維護

精髓:將複雜的邏輯抽離出來,讓開發人員真正專註於業務代碼,系統,那麼設計模式會加大理解難度。但當你看懂之後,你會發現這麼做真是太巧妙了!

 

設計模式無非就是把代碼抽象出一個更高的層次,再來實現原先想要實現的功能,設計模式是有代價的,以複雜度換取靈活性,,說到底是為了給自己留條後路,在代碼走向可能發生變化的點上留下靈活性的種子。

二、設計模式是黏合劑

我最初在學習設計模式的過程中由一種困惑,“這樣繼承封裝多態亂七八糟的繞來繞去的幹嘛?”後來慢慢的隨著經驗的積累才知道是迫不得已,這種迫不得已,有很多種原因。個人覺得最容易理解的就是“適配器模式”,因為出現了介面的衝突,所以我們不得不進行適配。但一個很自然的問題就是:為什麼不直接改介面讓他們自然融洽呢?這不是一種更自然更直觀的解決方案嗎?答案很有可能就是因為架構,大的架構已經確立,局部必須服從整體

那麼,如果一個完全理想化的架構,是不是根本就不應該出現這種問題介面衝突的問題,因而根本就不需要這種設計模式?

不是的,設計模式是黏合劑,它的作用是彌補架構的局部缺陷,更好的支撐架構。更極端的一種說法可以送給痴迷於設計模式的同學:設計模式是藥,沒病就不要吃藥

 

設計模式是為了封裝變化,讓各個模塊可以獨立變化。精準地使用設計模式的前提是你能夠精準的預測需求變更的走向。我們都知道大部分人是做不到的,所以大部分人就算精通設計模式也多少會做錯點什麼東西。所以這其實不怪設計模式,怪產品狗</del>。所以說如何避免過度設計,這就要求你深入的理解你的程式所在的領域的知識,瞭解用戶使用你的軟體是為瞭解決什麼問題,這樣你預測用戶的需求才會比以前更加準確,從而避免了你使用設計模式來封裝一些根本不會發生的變化,也避免了你忽視了未來會發生的變化從而發現你使用的模式根本不能適應需求的新走向。

三、模式無處不在

要為實現需求而編碼,而不是為使用設計模式而編碼。象張無忌學太極一樣,學會了,然後忘了,不要刻意使用設計模式,模式無處不在。

很多同學在學習設計模式的時候看到的只是結果,並不瞭解過程和動機,也就是其他人在什麼樣的情況下做出這樣的設計,而這個恰恰是各種教程、資料上學習不到的。

在幾年前我自己制定了類代碼行數不超過600,函數行數不超過60,嵌套不超過3層的編碼規則。這個規則非常明確,比“高內聚,低耦合”之類的可執行性高多了,我自己實踐過程中,一旦違反這條規則的時候,就不斷的重構至這個目標。

經過3,4年的實踐,基本上做到了任何時候、場合都符合自己所制定的規則。現在閱讀我寫的代碼的時候,往往能發現其中有些地方符合一些設計模式的地方。回過頭思考設計模式的時候,悟出了開篇關於設計模式學習、應用的那個弊端。

四、脫離業務需求談設計模式都是耍流氓

離開具體業務需求談設計模式都是耍流氓,OOP的世界里出現設計模式是為了讓程式更有彈性,易於擴展。而且經過這麼多年的發展,前輩們從具體的業務需求抽象出很多種的設計模式,設計模式,是為了需求變動而產生,拋開需求談模式,顯得很蒼白

沒有完美的設計模式,它只適應於特別的場合,要理解和掌握設計模式,要從發現需求變動, 準確找到變化點,如何封裝它的角度去研究,去學習,而不要拘泥於具體的形式。換句說話:在23種設計模式的需求中,要準確找出哪些地方是強耦合,並且由於實際需要,要對這些耦合進行解耦。這樣才是真正的理解了設計模式。


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

-Advertisement-
Play Games
更多相關文章
  • 1.變數 var num=10; var num1,num2,num3; num1=10; num2=20; num3=30; var num1=10,num2=20,num3=30; 註意點: console.log(a); //報錯 var b; console.log(b); //undefi ...
  • table 表頭有時候需要加一些小樣式比如 必填項 這是我項目中遇到的需求 比例,產品, 部門為必填項,這個時候就需要在表頭加個紅色小星星。 首先在table中綁定:header-cell-class-name="must"事件 然後methods中寫must事件如下 must(obj) { if ...
  • 瀏覽器F5刷新的時候有一個刷新執行之前的事件,beforeunload 事件,這個事件可以提示用戶在刷新頁面之前有一個提示。 下麵是beforeunload的用法: 首先在methods中定義beforeunload事件 beforeunloadHandler(e) { // e.preventDe ...
  • 最近看了 "Dan Abramov" 的一些 "博客" ,學到了一些React的一些有趣的知識。決定結合自己的理解總結下。這些內容可能對你實際開發並沒有什麼幫助,不過這可以讓你瞭解到更多React底層實現的內容以及為什麼要怎樣實現。可以讓你跟別人有更多的談資,當然,也可以在某些場合裝一下逼。那麼接下 ...
  • 一、請求後端的JSON數據 JSON是前後端通信的交互格式,JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。 JSON是互聯網各個後臺與前代溝通必備格式,取代了原來的XML。 XML數據格式特別“噁心”,現在市場上99%以上的數據格式都 ...
  • 一、資料庫基礎 1.1什麼是資料庫? 什麼是資料庫? 答:就是一個很大的一個文件,只不過這個文件可以通過一些‘命令’操作數據; 增、刪、改、查數據; 資料庫等於持久數據和數據操作的一個統稱。 資料庫是按照數據結構來組織、存儲及管理數據的倉庫。 資料庫有哪些? MySQL、SQL server、Ora ...
  • 文章首發: "行為型模式:訪問者模式" 十一大行為型模式之十一:訪問者模式。 簡介 姓名 :訪問者模式 英文名 :Visitor Pattern 價值觀 :來訪者便是客,招待就是 個人介紹 : Represent an operation to be performed on the element ...
  • 一、簡介 ntop是一家以技術為驅動的公司,用戶多為個人和小公司,主要經營四款產品:Packet Capture、Traffic Recording、Network Probe、Traffic Analysis。 二、packet Capture 網路抓包使用具有PF_RING的商用硬體進行線速數據 ...
一周排行
    -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# ...