大道至簡的架構設計思想之:封裝(C系架構設計法,sishuok)

来源:https://www.cnblogs.com/yflx/archive/2023/03/02/17171553.html
-Advertisement-
Play Games

一起來看看大道至簡的一些基本設計思想,首先我們來看一下什麼是封裝。 封裝:也叫做信息隱藏,或者數據訪問保護。放到程式上來講,就是隱藏類的屬性,還有實現細節,僅對外公開一些介面。那麼外部,就只能通過這個類暴露的這些訪問介面,按照這個類提供的方式來訪問類的內部信息或者數據。這樣子的一種情況就叫做封裝。 ...


一起來看看大道至簡的一些基本設計思想,首先我們來看一下什麼是封裝。

封裝:也叫做信息隱藏,或者數據訪問保護。放到程式上來講,就是隱藏類的屬性,還有實現細節,僅對外公開一些介面。那麼外部,就只能通過這個類暴露的這些訪問介面,按照這個類提供的方式來訪問類的內部信息或者數據。這樣子的一種情況就叫做封裝。

作為做Java的我們來講,封裝,我們是非常非常熟悉的,因為一開始學Java,學面向對象,就會講封裝、繼承和多態。

接下來,我們就來談一談,到底面向對象當中封裝的本質是什麼。其實從字面意義上理解封裝,就是把什麼東西包裝起來,進一步說就是一個封裝體。事實上大家想,面向對象當中,類是不是就是一個封裝體?

大家想想,類裡面封裝的什麼呢?無外乎就是一些屬性,就是一些數據,然後是方法,其實可以代表它的功能。

也就說一個類,它就是封裝了一定功能的這麼一個封裝體

當然,封裝並不僅僅只是對一個類而言,你可以擴大一點,以此類推,從設計的角度來看:一個組件是不是一個封裝?只不過它封裝的,不再是屬性、方法,它裡頭封裝的就是一個一個的,其它組件或者模塊,或者是類。

以此類推,組件是一個封裝體,那模塊是不是一個封裝體? 子系統是不是一個封裝體?系統是不是還是一個封裝體?

只是範圍大小不同而已,所以大家會發現,封裝是咱們做架構設計一個非常非常基礎的、非常重要的思想。

咱們再從另外一個角度來看一看,類,它其實是代碼功能的一個封裝,或者說是一個聚合方式。

沒有面向對象之前,咱們叫做面向過程設計,或者叫過程化設計。大家可以理解成是這樣,這裡面有一堆的代碼,我們稱之為函數,或者說是一些過程。

在過程化設計裡面,這些功能都是比較散亂的堆放在一起,也就說每一個功能只管自己,跟其它功能沒有什麼聯繫。但後來大家覺得,這樣子去擺放代碼非常的不友好。要想找一個功能,尤其是帶流程的,那就在裡頭跳來跳去,非常的亂。

大家就想到一個辦法:把相關的一些功能,比方說發現這裡的功能是相關的,都是用來做,比方說用戶數據的管理。我們就可以把這個東西封裝起來,然後就演化成,可以用一個類來封裝這些東西,就開始面向對象設計了。

這些功能都是相關的,都是用戶這個對象應該要實現的功能,也就說從代碼的角度,也能夠感覺得到,面向對象設計實際上就是把原來這些過程化設計當中,雜亂無章的這些函數或者是功能,按照一定的方式重新進行組織,把它們封裝到一起。所以說呢,從某種意上說,類是代碼的一種聚合方式。

咱們一個完整的軟體系統,就是由大大小小的,各種不同的這種封裝體聚合起來的。就好比說一個大的軟體系統,又分成了很多的子系統,這個子系統其實也是一種封裝。

這個子系統又包含另外的子系統,每個子系統裡面可能有很多的模塊或者是組件,這些組件裡面又有很多具體的功能,也就是它封裝的是一定的功能。 這不就是大大小小的封裝,最終合起來就是你的這個系統。

所以說大家要從架構設計的眼光來看待這些問題。你看一個大的軟體系統不就是大大小小的各種各樣的封裝體嗎?至於這裡頭到底封裝的是什麼。這個東西就看你怎麼劃分了,直到最後落實到具體的功能上。

從設計上來講,到底封裝什麼呢?對於每一個封裝體來說,主要就是為了把核心業務部分,或者是核心功能部分封裝起來。那麼這麼封裝起來有什麼樣的好處呢?也就是為什麼要封裝呢?

大家想想,當你把這些核心功能封裝起來過後,首先對核心功能是一個安全保護。另外呢,也是為了復用這些核心的功能,除了這些呢,把這包裝起來的目的,是為了可修改,可維護,可擴展。

有些人說,怎麼還會可修改可維護呢?很簡單,你把這些功能封裝在這個,比方說橢圓裡面封裝了一堆的功能,事實上,這內部的功能和外部是不是就分開了?你封裝的這些功能是不是就可以單獨的進行修改,進行維護,並且進行擴展。

只要對外提供的介面不發生變化,那你封裝起來的這一塊,是不是就可以隨便改了。所以說呢,從某種意義上來說,也是封裝了變化。

當你覺得這一塊以後可能會變,就可以把這塊先包裝起來,那麼以後的變化,就可以在封裝體內來實現,而不會影響到外部。當然這個了,跟咱們接下去要講的一個思想:隔離,是息息相關的,或者是有類似之處的。總之呢,大家會發現封裝對我們來講,是一個非常非常重要的思想,我們一定要重視對他的理解。

為了大家更好的交流架構設計的思想和知識,大家可以加sishuok,拉你進架構設計群,一起共同學習,共同進步。


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

-Advertisement-
Play Games
更多相關文章
  • 簡介 構造器模式,也被稱為建造者、生成器模式,是設計模式中比較容易理解的模式之一。 定義:將一個對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 定義不太容易理解,簡單的說就是構造器模式中的對象的屬性是通過一個構造器來設置的,最後返回一個不同屬性的對象。 在js中我們在創建對象時可以 ...
  • 前言 其實在 2019 年上半年,微信就發佈了基於小程式頁面的搜索,只是很多小伙伴並不知道,所以在這分享一下微信小程式搜索優化指南(SEO)。 為了更好地發現及理解小程式的頁面,強烈建議各位小伙伴花一些寶貴的時間認真閱讀本文。 小程式爬蟲 爬蟲訪問小程式內頁面時,會攜帶特定的 user-agent ...
  • 前端要不要學習設計模式 始終認為每個行業都有自己的特點,各自的專業性。一個開發工程師如果不知道電腦是哪些基本硬體組成,那麼我們大概率都會認為這個人非常不專業。那麼前端要不要學設計模式呢?設計模式跟前端有多大關係呢? 前端工程師首先是一個工程師,既然是一個軟體工程師,那麼類似設計模式、數據結構、網路相 ...
  • map、forEach、filter這三者都可以遍曆數組,他們之間有什麼區別呢? map():方法定義在JavaScript的Array中,它返回一個新的數組,數組中的元素為原始數組調用函數處理後的值值得註意的是: 1、map()函數不會對空數組進行檢測; 2、map()函數不會改變原始數組,它形成 ...
  • <!DOCTYPE html> <html> <head> <title>Get Video Frame Example</title> </head> <body> <div id="result"></div> <script> // 獲取視頻第一幀的函數 function getVideoFi ...
  • 今天早上打開電腦,更新了日常工作的github倉庫,然後就是習慣性地執行了"npm install",發現報了下麵這個錯誤: Error: error:0308010C:digital envelope routines::unsupported 順便看了一下錯誤堆棧,發現是一個Node的內核文件拋 ...
  • 在許久之前,曾經寫過這樣一篇文章 -- 不定寬溢出文本適配滾動。我們實現了這樣一種效果: 文本內容不超過容器寬度,正常展示 文本內容超過容器的情況,內容可以進行跑馬燈來回滾動展示 像是這樣: 但是,之前的方案,有一個很明顯的缺點,如果我們事先知道了容器的寬度,那麼沒問題,但是如果沒法確定容器的寬度, ...
  • 客戶端和伺服器 客戶端與伺服器的通信 互聯網:錯綜複雜的網路,比如每個快遞車走的路. TCP/IP:定義數據如何傳輸的通信協議,比如快遞的包裝,發貨規則. DNS:功能變數名稱系統伺服器,輸入一個網址時,找到網頁的伺服器,才能發送 HTTP 請求到正確的地方。(功能變數名稱->IP),比如發貨地址. HTTP:超文 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...