組件/框架設計原則

来源:https://www.cnblogs.com/kybs0/p/18248506
-Advertisement-
Play Games

Windows應用軟體開發,會有很多常用的模塊,比如資料庫、配置文件、日誌、後臺通信、進程通信、埋點、瀏覽器等等。下麵是目前我們公司windows梳理的部分組件,梳理出來方便大家瞭解組件概念以及依賴關係: 每個應用里,現在或者以後都可能會存在這些模塊。以我團隊開發的全家桶為例,十多個應用對後臺訪問, ...


Windows應用軟體開發,會有很多常用的模塊,比如資料庫、配置文件、日誌、後臺通信、進程通信、埋點、瀏覽器等等。下麵是目前我們公司windows梳理的部分組件,梳理出來方便大家瞭解組件概念以及依賴關係:

每個應用里,現在或者以後都可能會存在這些模塊。以我團隊開發的全家桶為例,十多個應用對後臺訪問,就會有十多個重覆的模塊。後臺通信的設計、開發、BUG修複,都是重覆工作量。

業務/通用組件:通用模塊,流程/邏輯基本是固定不變的,變的部分是上層業務調用,所以不變的部分我們需要把它固化下來、穩定下來,減少代碼的復用、提高共性代碼的穩定性、提升項目/人員的開發效率。

框架組件:除了通用模塊,還有一些流程比較複雜。比如軟體啟動時很多業務的處理,需要框架來梳理、組織好業務流程,使其業務模塊分層合理、依賴關係清晰。

所以我們抽取/開發了一些組件,以後還會有更多的組件。組件的開發/維護,大家都會參與,所以需要同步一些如何做好、做穩的概念。

組件調用方

組件尤其是通用組件,我們能支持更多方向的,一定要提供好支持。站在其它開發人員,考慮更多應用、業務的使用及場景,有這些思維,會讓你的組件設計更加完善、可用性更高。

  • 開發人員 - 自己、其它開發小伙伴、外部第三方開發人員
  • 各個應用軟體 - 內部軟體、ISV以及ODC軟體
  • 業務場景 - 會議、醫療、教育等
當然,我們設計組件時也要掌握一個度,沒有設計或者過度設計都不是我們的初衷。所以按照初衷-要儘可能提高效率(團隊效率),即易維護、易閱讀理解以及易擴展等,組件設計的方向也就不會有大問題。

組件設計原則

組件是應用軟體開發的基石,組件不穩定,應用不可能穩定下來。所以我們需要考慮怎麼做好組件。

如何把組件設計好,怎麼評估組件的好壞?組件設計評估,有哪些維度

結合我的工作經驗,吸收到的知識點,以下是我個人的一些總結:

1.所見即所得

“所思即所見,所見即所得”,這是佛學里的思維。

我們軟體設計也有這個“所見即所得”的原則,看見什麼就是什麼,執行的邏輯就是看到的方法/協議名稱。

組件、介面及方法,應該是只做名稱對應的實現。不得包含未知的邏輯,比如介面里同時存在Get、Check,在Get方法內調用了Check。又比如執行元素的縮放,縮放方法中不應該存在旋轉邏輯如設置角度。

也不得只實現部分邏輯,比如清空用戶緩存,結果內容只執行了部分路徑下的數據清空。

所見即所得,關鍵點是:

  • 對外的定義,要符合業務的第一性原理,回到組件設計的初衷,該有的功能/邏輯一個也不能少。
  • 內部的邏輯,圍繞著協議名稱去實現,要覆蓋且不脫離原有的初衷。
另外,solid中的單一職責原則,也是“所見即所得”原則中的一部分概念,設計要清晰、單一。

2.簡單

簡單,意思是對外要簡潔、單一。所有的組件,都是給自己以及其它開發人員使用的,給各個應用調用的,那我們就需要考慮使用成本以及學習成本。

調用組件時,能夠以最快的速度理解介面/組件的使用,以最快的速度完成組件的調用,這是組件開發人員需要考慮的。如果給出的介面以及調用流程太過複雜、混亂,調用時不得不花很多時間溝通、理解如何調用;項目上也會因為調用流程複雜,導致業務邏輯複雜,降低後續的可維護性、提高BUG定位的複雜性。

所以我們設計組件/介面,需要:

  • 儘量少暴露內部實現。
    • 不需要開放的類要隱藏
    • 外界不需要關心的屬性要設置internal
    • 外界用不到的方法,設置internal。或者刪除對外暴露介面里的冗餘方法
  • 實現要簡單
    • 對外暴露的介面/方法,儘可能的減少數量,能合併的合併
    • 對外暴露的介面/方法,儘可能的減少參數,以最少參數實現相應功能

用一句話總結,就是最少知識原則(迪米特原則)

對外暴露越少越好,暴露的少肯定能減少耦合。我們常提的封裝就是這個意思,高內聚低耦合,內部實現複雜的邏輯,外部減少耦合。

3.完整

完整是指組件,要提供一整套完整的功能,能全部覆蓋對應場景,不能開發一部分然後提供出去使用。

  • 儘可能的將應用內與這個組件相關的通用代碼,挪到組件內
  • 儘可能的滿足後續業務的需要。不管是新增需求、新增應用、新增場景,後續都應該儘量無需新增代碼,即可滿足業務需求

比如,我們做OTA組件,那你應該把升級的所有實現放在OTA組件里。一個組件做一類的事情,但這個組件一定要把這一類的事情做完整。完整的意思是,在應用使用OTA組件時,能通過組件完成所有OTA的相關操作。比如檢驗是否需要升級,這段邏輯如果放在應用層去做,那就會存在冗餘的重覆代碼,說明OTA組件未設計完整、沒有實現完整。

當然如果你這樣實現內部實現過多,那可以拆分一些獨立的組件,如雙網卡可以拆分為雙網卡使用組件、雙網卡修複組件。

完整,意味著可用性高,這一類場景的組件能支撐更多的業務。

4.易維護

易維護指的是,組件內部的代碼實現以及設計應該容易維護。開發通用組件,後續可能會有BUG,如何保證定位問題、解決問題的高效呢?那就需要內部清真的代碼實現、清晰的代碼設計。如果一堆不安全代碼、實現流程複雜、依賴關係混亂,肯定很難定位問題根因,修改代碼後容易牽一發動全身,如果是後面的開發人員,估計他會吐N多口水。更不用說業務組件了,業務組件如果內部不易維護,BUG肯定一堆又一堆。

如何提升代碼的可維護性?可以從以下幾個方面著手:

  • 代碼實現要簡潔
  • 類、函數名稱,要簡單、易理解
  • 類與類、模塊與模塊的關係要儘量簡單,保持線性原則,模塊分層合理

一般來說,只要你的代碼易讀易理解,可維護性不會差到哪裡去。擁有結構化思維,代碼的流程肯定不會亂。

可維護性還有很多要考慮的,就比如我們大部分組件內部也需要考慮擴展性、復用性。把可變的部分設計成抽象類或者介面暴露給上層,由業務註入變化/擴展的實體;把一些不變的部分抽成工具類或者基類,通過靜態或者組合來調用,減少內部依賴。

更深的,那就需要熟練掌握設計原則、設計思想、編程範式、架構思維,利用你的重構意識、抽象意識、封裝意識、甚至“潔癖”意識,創造優秀的代碼。

5.穩定

穩定性,包括性能以及質量。代碼穩定,是衡量組件的一個重要指標,是一個狀態。

組件不穩定,內部實現臟、亂、差,會體現到應用軟體的BUG上。

設計要素不是獨立的,而是有些有關聯的。比如組件易維護,組件穩定性一般不會差到哪去。提升了穩定性,代碼的可用性也會提升;

  總之,做好模塊化解耦的組件,能提高團隊開發效率,後續有精力往更深的技術方向研究、以及追求極致的用戶體驗。 作者:唐宋元明清2188 出處:http://www.cnblogs.com/kybs0/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • RSS(Really Simple Syndication)是一種 XML 格式,用於網站內容的聚合和分發,讓用戶能快速瀏覽和跟蹤更新。RSS 文檔結構包括 `<channel>` 和 `<item>` 元素,允許內容創作者分享標題、鏈接和描述。通過 RSS,用戶可以定製新聞源,過濾不相關信息,提高... ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 在後臺系統中有一種常見的功能,點擊按鈕將整個網頁全屏,再點擊退出全屏。 瀏覽器提供了2種全屏方式,一種通過API在js中實現,另一種是按F11鍵進入全屏模式。 但F11進入的全屏模式優先順序更高,無法通過API退出。 基本知識 元素全屏 檢查可用 ...
  • 這篇文章介紹瞭如何運用Tailwind CSS框架創建響應式網頁設計,涵蓋博客、電商網站及企業官網的佈局實例,包括頭部導航、內容區域、側邊欄、頁腳及輪播圖等組件的響應式實現。同時,探討了與JavaScript框架集成、CSS預處理器配合、設計工具應用以及伺服器端渲染的策略,並提供了性能優化、代碼組織... ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 本文作者:修能 這是一段平平無奇的 SQL 語法 SELECT id, sum(name) FROM student GROUP BY id ORDER BY id; ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 前言 在這之前公司項目的文檔預覽的方式都是通過微軟線上預覽服務,但是微軟的線上服務有文件大小限制,想完整使用得花錢,一些圖片文件就通過組件庫antd實現,因為我們項目存在多種類型的文件,所以為了改善用戶的體驗,決定把文件預覽單獨弄一個拆出一個項 ...
  • 這篇文章介紹了Tailwind CSS框架的特點與優勢,包括其作為實用性的CSS框架如何通過預設的樣式類實現快速佈局和設計,以及如何在不犧牲響應式和自適應性的同時減少開發時間。此外,還提及了框架的可定製性,允許開發者輕鬆創建符合項目需求的樣式規則,從而提高前端開發效率。 ...
  • Chrome 在 121 版本開始,原生支持了兩個滾動條樣式相關的樣式 scrollbar-color 和 scrollbar-width。 要知道,在此前,雖然有 ::-webkit-scrollbar 規範可以控制滾動條,可是,::-webkit-scrollbar 是非標準特性,在 MDN 文 ...
  • Spring Cloud是一個相對比較成熟的微服務框架。雖然,Spring Cloud於2016年才推出1.0的release版本, 時間最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分散式系統解決方案。 Spring Cloud是一系列框架的有序集合。它利用Spri ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...