一份簡單的 MVC 「改變-更新」流程,應用在 Erlang/Nitrogen 網頁框架

Nitrogen project 是個實作了 MVC 架構的網頁框架。特色有,用 tuple 表達了網頁元素,並且用 API 表達了 MVC 裡,由內部向外傳達通知的流程(例如 wf:update/2 )。

我對 MVC 的解釋,如此: MVC 架構有三個元素:系統內涵 (model) 、物件 (view)、控制器。系統全體,就是系統內涵;系統的外觀,有許多物件;許多物件提供控制界面,是控制器。使用者藉由操作控制器,發出改變系統內涵的請求,而一旦系統內涵發生改變,則將所改變的內容通知到外面,以物件的樣貌改變或更換來加以呈現。於是,以四句話描述 MVC ,為物件反映系統內涵、物件包含控制器、控制器改變系統內涵、系統內涵的改變更新於物件。

MVC 主要的流程,是控制器改變系統內涵,而系統內涵的改變更新於物件。寫成 Erlang 程式如下:

-module(mvc).
-export([do/3]).
do(Args, Update, Notification) ->
    R = erlang:apply(Update, Args),
    maps:map(fun(K, {V, F}) -> erlang:apply(F, [K, erlang:apply(V, R)]) end,
             Notification).

首先,控制器起作用時,使用 mvc:do/3 函數,來啟動「改變-更新」二步驟。 mvc:do/3 的三個參數, Args 為控制器開始改變系統內涵時所伴隨的參數, Update 是「改變」的函數,而 Notification 是一串「更新」的動作。

由 Args 代表系統內涵改變之前的狀態,Update 改變系統內涵,例如將一筆新資料放進資料庫。(所以 Update 動用了外部狀態,不是純函數語言。)系統內涵改變之後,傳回一個值 R ,而之後要看 R 對「更新」有何意義。

Notification 用字典格式 (key-value) 表達三件東西:被更新的物件 K 、取得更新內容的函數 V 以及代表更新手段的函數 F 。函數 V 參考 R 產生新內容,而期間可能動用外部狀態,例如做 SQL 查詢。新內容透過 F 更新在 K 處。而 F 的實例是若干個 nitrogen API 之一,例如 wf:update/2 、 wf:replace/2 或者 wf:after/2 。

廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Uncategorized。將永久鏈結加入書籤。