組件/框架設計原則

来源: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
  • 通過WPF的按鈕、文本輸入框實現了一個簡單的SpinBox數字輸入用戶組件並可以通過數據綁定數值和步長。本文中介紹了通過Xaml代碼實現自定義組件的佈局,依賴屬性的定義和使用等知識點。 ...
  • 以前,我看到一個朋友在對一個系統做初始化的時候,通過一組魔幻般的按鍵,調出來一個隱藏的系統設置界面,這個界面在常規的菜單或者工具欄是看不到的,因為它是一個後臺設置的關鍵界面,不公開,同時避免常規用戶的誤操作,它是作為一個超級管理員的入口功能,這個是很不錯的思路。其實Winform做這樣的處理也是很容... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的程式每次關閉時就會自動崩潰,一直找不到原因讓我幫忙看一下怎麼回事,這位朋友應該是第二次找我了,分析了下 dump 還是挺經典的,拿出來給大家分享一下吧。 二:WinDbg 分析 1. 為什麼會崩潰 找崩潰原因比較簡單,用 !analyze -v 命 ...
  • 在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
  • 最新內容優先發佈於個人博客:小虎技術分享站,隨後逐步搬運到博客園。 創作不易,如果覺得有用請在Github上為博主點亮一顆小星星吧! 博主開始學習編程於11年前,年少時還只會使用cin 和cout ,給單片機點點燈。那時候,類似async/await 和future/promise 模型的認知還不是 ...
  • 之前在阿裡雲ECS 99元/年的活動實例上搭建了一個測試用的MINIO服務,以前都是直接當基礎設施來使用的,這次準備自己學一下S3相容API相關的對象存儲開發,因此有了這個小工具。目前僅包含上傳功能,後續計劃開發一個類似圖床的對象存儲應用。 ...
  • 目錄簡介快速入門安裝 NuGet 包實體類User資料庫類DbFactory增刪改查InsertSelectUpdateDelete總結 簡介 NPoco 是 PetaPoco 的一個分支,具有一些額外的功能,截至現在 github 星數 839。NPoco 中文資料沒多少,我是被博客園群友推薦的, ...
  • 前言 前面使用 Admin.Core 的代碼生成器生成了通用代碼生成器的基礎模塊 分組,模板,項目,項目模型,項目欄位的基礎功能,本篇繼續完善,實現最核心的模板生成功能,並提供生成預覽及代碼文件壓縮下載 準備 首先清楚幾個模塊的關係,如何使用,簡單畫一個流程圖 前面完成了基礎的模板組,模板管理,項目 ...
  • 假設需要實現一個圖標和文本結合的按鈕 ,普通做法是 直接重寫該按鈕的模板; 如果想作為通用的呢? 兩種做法: 附加屬性 自定義控制項 推薦使用附加屬性的形式 第一種:附加屬性 創建Button的附加屬性 ButtonExtensions 1 public static class ButtonExte ...
  • 在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...