組件/框架設計原則

来源: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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...