<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

常見的軟件架構分層

海馬硬件 ? 來源:海馬硬件 ? 作者:海馬硬件 ? 2022-10-13 11:56 ? 次閱讀

一、前言

系統架構思想是軟件開發工程師的工作必備知識。大到大型互聯網應用系統的設計,小到一個軟件功能函數的設計,都需要擁有架構設計思想。軟件架構分層就是架構設計中的一個子領域,更著重強調軟件的分層概念。 本篇文章就帶大家簡單的了解一下軟件架構的分層,學習完畢,你就會明白,為什么系統要分層,架構分層可以帶來什么好處。

二、軟件架構分層的發展背景

計算機編程在“上古時代”開始時,是用二進制來編程,后面逐漸發展成熟。到了20 世紀 60 年代第一次軟件危機時,引出了“結構化編程”,并創造了“模塊”概念;20 世紀 80 年代第二次軟件危機引出了“面向對象編程”,創造了“對象”概念;到了 20 世紀 90 年代, 隨著軟件規模的不斷增大,以下問題就開始顯現。

系統規模龐大,內部耦合嚴重,開發效率低;

系統耦合嚴重,牽一發動全身,后續修改和擴展困難;

系統邏輯復雜,容易出問題,出問題后很難排查和修復。

于是在Rational 和 Microsoft 內部,軟件架構的概念開始越來越流行了?!敖M件”概念隨著軟件架構的流行也逐漸清晰。 我們可以看到,“模塊”“對象”“組件”本質上都是對達到一定規模的軟件進行拆分,差別只是在于隨著軟件的復雜度不斷增加,拆分的粒度越來越粗,拆分的層次越來越高。 隨著90年代互聯網的迅速崛起,軟件架構分層也隨著軟件架構的興起而逐步興起。

三、軟件分層的概念

軟件架構分層就是將軟件模塊按照水平切分的方式分成多個層,一個系統由多層組成,每層由多個模塊組成。每層有自己獨立的職責,為上一層提供服務,使用下一層的服務,每層只能看到處自己相臨的層。多個層次協同提供完整的功能。通過分層結構,可以將大的問題分解為若干個漸進的小問題來解決,可以隱蔽問題的復雜度。修改某一層,最多影響其相鄰的兩層(通常只能影響上層)。 這里引申到層間隔離的概念。分層架構中的每一層可以是封閉的或者開放的,封閉意味著當一個請求自頂向下在層間傳遞時,它不能跳過任意的一層。所謂的層間隔離,旨在降低一個層次上的變化對其他層次的組件的影響。簡單來說,就是每個層次對其他層次的功能知道的越少越好。但是在某些的場景,將特定的層次置為開放的狀態也不失為一件好事。還有某些不想被其它層看到的代碼也可以通過層間隔離的手段來實現。

四、軟件分層的特點

分層設計的本質其實就是將復雜問題簡單化,基于單一職責原則讓每層代碼各司其職,基于“高內聚,低耦合”的設計思想實現相關層對象之間的交互。從而,提升代碼的可維護性和可擴展性。系統架構分層之后,一般要具有以下特點:

高內聚:分層設計可以簡化系統設計,讓不同層專注做本層相關的事,同時更利于系統開發工作的分配,讓“專業的人做專業的事”。這也體現了軟件設計思想的“單一職責原則”;

低耦合:層與層之間通過接口或API來交互,依賴方不用知道被依賴方的細節。這樣即使某一層發生較大的變化,其它層也不需要做較多改動就可以適配。軟件設計思想的“迪米特法則”在這里得到了體現;

復用/可移植性:分層之后可以做到代碼或功能的復用;

擴展性/易裁剪:分層架構可以讓代碼更容易橫向擴展或者裁剪。這里體現了軟件設計思想的開閉原則”。

任何事物都不可能是盡善盡美的,分層架構雖有優勢也會有缺陷,比如分層可能會增加代碼量。通過層層調用會降低了代碼效率。 下面列用幾種常見的分層架構來說明以上作用。

五、常見的分層架構

TCP/IP協議的四層架構:它把網絡簡化成了四層,即鏈路層、網絡層、傳輸層和應用層。每一層各司其職又互相幫助,網絡層負責端到端的尋址和建立連接,傳輸層負責端到端的數據傳輸等,同時相鄰兩層還會有數據的交互。這樣可以隔離關注點,讓不同的層專注做不同的事情。

e8e91490-4a13-11ed-a3b6-dac502259ad0.png

Linux文件系統分層:從下圖你可以清晰地看出文件系統的層次。在文件系統的最上層是虛擬文件系統(VFS),用來屏蔽不同的文件系統之間的差異,提供統一的系統調用接口。虛擬文件系統的下層是 Ext3、Ext4 等各種文件系統,再向下是為了屏蔽不同硬件設備的實現細節,我們抽象出來的單獨的一層——通用塊設備層,然后就是不同類型的磁盤了。

e9854e50-4a13-11ed-a3b6-dac502259ad0.png

我們可以看到,某些層次負責的是對下層不同實現的抽象,從而對上層屏蔽實現細節。比方說VFS 對上層(系統調用層)來說提供了統一的調用接口,同時對下層中不同的文件系統規約了實現模型,當新增一種文件系統實現的時候,只需要按照這種模型來設計,就可以無縫插入到 Linux 文件系統中。

網絡服務架構分層:下圖是目前常見的網絡服務架構,分為部署的硬件環境、操作系統、所需的中間件、承載業務的應用程序以及軟件接入層等。不同的層次也產生了對應在職位,比如運維工程師、中間件工程師、產品經理、開發工程師、測試工程師等工種。而我們在實踐過程中,接觸最多,使用最多的分層要屬應用軟件層了,其次是中間件層。

e9fc156c-4a13-11ed-a3b6-dac502259ad0.png

嵌入式軟件架構分層:嵌入式系統中,軟件的分層同樣很重要。嵌入式系統中的核心是芯片,以及圍繞著芯片展開的一系列硬件電路,但是不同的嵌入式項目之間硬件差異很大,為了讓硬件能夠按指定的方式工作,就需要為相應的硬件“量身定制”硬件層代碼。雖然硬件之間有差異,但還是存在一些共同點,比如驅動LCD工作,外接幾個IO口來支持按鍵或控制小燈的開關等功能。為了屏蔽硬件底層的差異,同時提供統一的功能硬件接口,于是硬件抽象層就產生了。業務代碼則實現嵌入式系統指定的業務功能,定義了系統在什么條件下做什么反應,或者定期執行一些什么動作。為了讓業務代碼開發更方便,不重復“造輪子”,需要收集很多現成的“輪子”,比較典型的“輪子”就是操作系統,它是眾多“輪子”的集合,給應用程序提供了多任務,中斷,任務間通信等功能,這一層我姑且叫它“功能層”。

ea80624a-4a13-11ed-a3b6-dac502259ad0.png

六、怎么分

在做架構分層時,開發團隊需要做到以下幾點:

1. 讓團隊深入理解軟件分層的義意,清晰軟件分層的目的

分層的作用在上面已經列出來,只有充分認識到軟件分層帶來的好處,才會有動力去設計與實現分層。

2. 合理設計分層,清晰定義每層的職責

基于“高內聚,低耦合”的設計思想,定義每層的職責,每層再設計不同的模塊。層次數量可以根據實際需要來調整。建議最多不要超過7層,3到4層最佳。

3.避免掉進sinkhole反模式的陷阱

所謂sinkhole反模式指的是請求只是簡單地路過各個層次,并沒有做一些業務處理。 比如,表現層接收到一個獲取基本用戶數據(姓名、地址等)的請求后將它傳遞到業務層;然而,業務層并沒有做任何的業務處理,直接將請求傳遞到持久層;持久層也僅僅是構造了一個簡單的SQL語句,向數據層查詢用戶數據;最后,數據按照原路返回到表現層,中途沒有經過任何的數據匯聚、轉換等操作。sinkhole反模式會導致很多不必要的對象實例化開銷,從而增大了系統的內存消耗,并且影響了性能。 利用80-20原則可以幫助確定架構是否陷入sinkhole反模式。大概有百分之二十的請求僅僅是做簡單的穿透,百分之八十的請求會做一些業務邏輯操作是正常的情況。然而,如果這個比例反過來,大部分的請求都是僅僅穿過層,不做邏輯操作,架構就陷入了sinkhole反模式,可以對一些架構層進行開放或者減少層級關系。

4. 通過技術手段守護架構

當定義清楚了分層架構,必然也要有守護架構的一些原則,在《演進式架構》中推薦盡早確定系統的適應度函數,并定期的審查,根據業務和技術的需求修改當前的適應度函數或增加新的適應度函數,以保證架構能夠按照設計的方向發展。 在java進程內,有一些自動化工具可以通過測試的方式來驗證代碼的架構是否遵循了預先設計的原則(如ArchUnit),可以高效的幫團隊識別出在開發過程中破壞原則的代碼實現。

5.提升團隊整體認知水平和協作水平

在團隊不斷成熟的過程中,很難保證所有的開發人員都能夠有能力守護架構,因此除了通過技術手段守護架構,也非常有必要采取一定的手段來提升整個團隊的認知水平和協作水平。 首先可以在團隊內建立架構評審委員會,關于架構的關鍵決策需要由委員會來拍板,而不是每個開發人員都可以決策。另外在做詳細的實現設計時,要由有經驗有能力守護架構的同學進行設計,并將工作內容拆分成更加可操作的Task。通過這種方式將整個團隊的認知水平底線提升到可以守護架構的程度。 上面分享了分層的特點和分層的方法,相信你已經對軟件架構分層有了更深入的了解。希望軟件架構分層可以融入到我們的開發設計工作中。

七、結語

本篇文章為大家分享了市面上常見的架構分層。架構分層的目的是通過關注點分離來降低系統的復雜度,同時滿足單一職責、高內聚、低耦合、提高可復用性和降低維護成本。但分層架構同樣也有一定的缺點,比如開發成本高、性能略低等問題。實踐中,架構分層并不能解決所有問題,每個項目可能都有其獨特的需求和背景,選擇什么樣的架構模式,還是要根據實情況考慮。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6518

    瀏覽量

    87694
  • 計算機
    +關注

    關注

    19

    文章

    6678

    瀏覽量

    84885
  • 軟件
    +關注

    關注

    67

    文章

    4361

    瀏覽量

    85856
  • 函數
    +關注

    關注

    3

    文章

    4042

    瀏覽量

    61390

原文標題:軟件架構分層-你的軟件有沒有分層?

文章出處:【微信號:海馬硬件,微信公眾號:海馬硬件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AUTOSAR分層架構

    AUTOSAR分層架構
    發表于 09-26 11:12

    嵌入式軟件架構設計常見的誤解

    1.常見的誤解1.1小型系統不需要架構設計 架構應當滿足當前需求并適當的考慮重用和變更1.2 敏捷開發不需要框架 極限編程, 敏捷開發的出現使一些人誤以為軟件開發無需再做
    發表于 10-27 09:22

    嵌入式分層架構的相關資料分享

    最近重新進入嵌入式領域,有必要對嵌入式分層架構有一個清晰的理解。經過多方查閱以及個人的理解,本人對嵌入式分層架構概括總結如下:比較細的層次由下到上可分為:(硬件層)硬件底層->硬件驅動
    發表于 10-28 08:42

    基于mcu的一種分層軟件架構的相關資料分享

    基于mcu的一種分層軟件架構(一)1、寫在前面先來個圖:經過了一段時間的琢磨與思考。借鑒操作系統的分層原理,也搞出來了一種mcu的層狀軟件
    發表于 11-03 06:46

    談談MC9S12G128模塊的軟件分層架構

    內容修改歷史.. 2內容.. 31 overview. 41.1 目的.. 42 軟件分層架構.. 52.1 driver層.. 52.2 中間件層.. 63 port資源.. 73.1 數據方向
    發表于 12-10 06:09

    ModBus主機底層的分層軟件層面的任務調度

    代碼一個文件中甚至一個函數中既有功能代碼又有底層代碼,當增刪功能或者平臺移植的時候都不知道去哪里哭,分層也許在初期會增加代碼量顯得很麻煩但是當你的架構建立起來之后會變得十分方便,解決問題
    發表于 03-01 07:29

    軟件架構設計之常用架構模式

    分層架構分層架構是使用最多的架構模式,通過分層使各個層的職責更加明確,通過定義的接口使各層之間
    發表于 06-22 18:35 ?4355次閱讀

    軟件架構設計之常用架構模式介紹

    層使用n層的服務。而一般意義的分層是上層能夠使用它下邊所有層的服務。領域驅動設計的分層定義:UI層,UI控制層,服務層,領域層,基礎設施層。 2.MVC架構:MVC架構相信做
    發表于 12-01 11:59 ?312次閱讀

    什么是分層架構的依據與原則?本文告訴你答案!

    分層架構是運用最為廣泛的架構模式,幾乎每個軟件系統都需要通過層(Layer)來隔離不同的關注點(Concern Point),以此應對不同需求的變化,使得這種變化可以獨立進行;此外,
    發表于 07-27 14:16 ?7171次閱讀
    什么是<b class='flag-5'>分層</b><b class='flag-5'>架構</b>的依據與原則?本文告訴你答案!

    基于mcu的一種分層軟件架構

    基于mcu的一種分層軟件架構(一)1、寫在前面先來個圖:經過了一段時間的琢磨與思考。借鑒操作系統的分層原理,也搞出來了一種mcu的層狀軟件
    發表于 10-28 09:51 ?13次下載
    基于mcu的一種<b class='flag-5'>分層</b><b class='flag-5'>軟件</b><b class='flag-5'>架構</b>

    架構】嵌入式軟件架構設計 模塊化 & 分層設計

    方便其實整理代碼結構,最主要想實現的就是:高內聚低耦合這樣的代碼方便移植管理,流程接口明確。一般的架構圖主要就是兩部分:分層分模塊隨便上百度搜了一張嵌入式的軟件架構圖為例...
    發表于 11-03 21:06 ?12次下載
    【<b class='flag-5'>架構</b>】嵌入式<b class='flag-5'>軟件</b><b class='flag-5'>架構</b>設計 模塊化 & <b class='flag-5'>分層</b>設計

    MC9S12G128模塊化分層軟件架構之七_外部中斷

    MC9S12G128模塊化分層軟件架構之七_外部中斷
    發表于 12-05 09:06 ?9次下載
    MC9S12G128模塊化<b class='flag-5'>分層</b>化<b class='flag-5'>軟件</b><b class='flag-5'>架構</b>之七_外部中斷

    AUTOSAR分層架構介紹及SmartSAR studio使用總結

    AUTOSAR分層架構
    發表于 03-28 16:44 ?9次下載

    分層單體架構系統的風格及其本質

    分層單體架構風格是分層思想在單體架構中的應用,其關注于技術視角的職責分層。
    的頭像 發表于 01-16 15:31 ?876次閱讀

    分層架構到微服務架構介紹(一)

    )。它們分別從微觀和宏觀的角度指導著我們設計出良好的軟件系統,因此,作為一個軟件工程師,我們不僅要熟悉設計模式,對常見架構模式也要熟稔于心。正如看到一個設計模式的名字腦里就能浮現出大
    的頭像 發表于 05-10 16:55 ?837次閱讀
    從<b class='flag-5'>分層</b><b class='flag-5'>架構</b>到微服務<b class='flag-5'>架構</b>介紹(一)
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>