[桌邊服務] 將 ASP.NET MVC 的 View 依使用者角色來拆分可以減少邏輯分支

各位朋友應該都有碰過一種需求,就是有一個頁面,這個頁面服務的是廣大的 User,在這群廣大的 User 中有分好幾群,有的群要顯示這個不能顯示那個、有的群要顯示那個不能顯示這個、...,這是很典型的需求,你我的公司裡面應該都存在著這樣的頁面,而且裡面的 if...else... 錯綜複雜,我們冷靜想想,其實這種需求的設計是可以更簡單的。

我假定一個情境,會來瀏覽我們網站的廣大 User 中分為普通會員(Ordinary)、曾經購買超過 10 萬元的會員(VIP)、曾經購買超過 20 萬元的會員(VVIP)、曾經購買超過 30 萬元的會員(VVVIP)這四種,那麼我有一個頁面,分別依據會員等級提供可使用的聯絡方式,大多時候我們就操起鍵盤 if...else if...else if...else... 就完成了這個需求,我知道這樣的情境有點單純,真正會遇到的場景比這個複雜的多的是。

Robert C. Martin 在《無瑕的程式碼-整潔的軟體設計與架構篇》中有對單一職責原則做進一步的解釋:「一個模組(原始檔)應該只對唯一的一個角色負責」,我們可以將這個原則套用到這個情境來,將原本 UI 顯示邏輯統統寫在同一個 View 的設計方式,改成依據角色名稱拆分成不同 View 的設計方式。

拆開之後每一個 View 的程式碼行數就變少了,需要處理的 UI 邏輯變化也減少了。

在使用者角色的判斷上,我用一個 ActionFilter 來處理。

在 Controller 這邊就依據使用者的角色,回傳對應的 View 名稱。

有一好沒兩好

依據角色拆分 View 的設計方式,難免會產生一些重覆的程式碼,不過我實際上在操作的時候,當需求有異動時,受影響的範圍很快就可以定義清楚,重覆程式碼所帶來「漏改」的副作用並沒有發生過。

再來就是檔案數量會變多,有些人比較無法忍受檔案數量多這件事,但我比較無法忍受 if...else 多這件事,以上提供給各位朋友參考。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學