Ruby on Rails: 什麼是Abstraction layer

Ruby on Rails

圖片來源: Usplash - Clark Van Der Beken

首圖的layer好美٩(๑❛ᴗ❛๑)۶,不過對於程式的世界,Layer的意義非常地遼闊,來看下維基百科對於Layer的定義:

物件導向設計中的(layer)是一群和其他模組有類似耦合性類別。層也可以說是一組可復用的軟體組件,可以在類似的環境下復用。

各層的模組會用狀的階級架構來規劃,各層模組之間的依賴關係會用連接來表示。各層之間的依賴關係可能是繼承複合或聚合(aggregation)關係,不過也有可能是其他的關係。

分層是許多書籍中都會提到的架構模式,例如《Pattern-Oriented Software Architecture》書中就有提到。

看到了裡面的類別繼承,好像很熟悉,在Ruby on Rails中有使用到,但是整個組起來,看懂一點點又好像沒看懂?

接著來看看維基百科對於Abstraction layer的定義:

抽象層(英語:abstraction layer, abstraction level,或 a layer of abstraction)是一種隱藏獨特功能執行細節的方法。使用抽象層的軟體模型包含OSI網路協定七層模型、OpenGL繪圖函式庫及以Unix為原本的輸入輸出(I/O)模型,並適用於大部分新一代的作業系統。

在Unix作業系統中,大部分的輸入輸出形式被視為從裝置讀寫的串流值。而串流值模型為了提供獨立裝置被檔案及終端機I/O所使用。為了在應用層讀寫裝置,程式呼叫函式開啟像是終端機的實體裝置或是網路檔案系統的虛擬裝置。裝置的實體特徵是被允許程式設計師讀寫資料的作業系統所調用。接著作業系統操作正確的讀寫轉換。

大部分的圖形庫,像是OpenGL,提供抽象圖形裝置模型。這種函式庫的主要功能在於轉換程式設計師的指令到圖形元件。這個特殊的繪圖指令與對傳統陰極射線管銀幕的指令不同,而是隱藏了抽象介面的細節。

資訊學,抽象層是模型演算法的推廣。

完蛋了,完全看不懂 (ఠ్ఠ ˓̭ ఠ్ఠ)。

其實抽象層很常出現在Ruby on Rails裡面,Ruby on Rails的所有的東西都是物件,而我們所熟悉的MVC,也是物件。view object / controller object / model object 彼此傳遞著訊息,這些物件在位階上都屬於抽象層。

網頁的生命週期分成兩個階段:

  1. bootstrap phase (configuration and initialization)
  • 載入應用程式碼
  • 初始化和配置框架元件
  1. serving phase
  • 執行許多獨立的Web Request

而我們先暫時聚焦在serving phase上,因為網頁請求(Web Request)是獨立的,因此服務階段可以被視為一條流水線,我們將請求資料(raw material)放在輸送帶上,中間通過許多工作站,並在最後得到回應

試想像,要怎麼讓流水線提高效率呢?就要把工作站拉出來,看有什麼可以改進的,而抽象層,就可以想像成流水線上的工作站。把工作站拉出來的這個過程(extraction of abstraction layers),也可以稱作分層(layering),而這個架構模式可以提高軟體的品質。

而一個抽象層應該要有什麼屬性呢?

  • 單一職責(職責可以很廣泛,但不應重複,遵循關注點分離
  • 各層應該是鬆散耦合的,並且沒有循環或反向依賴關係。
    • 如果我們從上到下繪製請求處理流程,層間連接永遠不應該向上,並且我們應該盡量減少層間連接數。(可以想像成流水線,很少會流到一半倒回去做)
  • 抽像不應洩漏其內部結構
    • 提取抽象的主要想法是將介面與實作分離
  • 應該可以單獨提取抽象層

如果遵循以上的這些原則,可以讓開發者易於重構、debug和測試。

在現實生活中,衡量效率的標準是速度; 在軟體開發中,速度也是關鍵——發布新功能的速度,而要怎麼能夠快速地發布新功能?這取決於許多因素,而最主要的因素就是程式碼的可維護性,其中包括:添加新功能和對現有功能進行更改、除錯的容易程度,應用軟體設計模式和提取抽象層是保持高可維護性的兩個主要工具。

而抽象層不是越多越好,主要看整個應用程式的架構,基本的Rails僅包含了三個抽象層概念:Model、Controller、View(也就是我們所常說的MVC)

至於要如何逐步引入新的抽象層呢?

可以參考本書:Layered Design for Ruby on Rails Applications

未來也會將本書提到的有趣的概念整理分享,今天就先到這裡٩(●˙▿˙●)۶
本篇文章是我由以下參考資料整理而成,如果您有興趣了解更多,請參考:

參考資料:

Layered Design for Ruby on Rails Applications**

Wiki

Comments