Below you will find pages that utilize the taxonomy term “Software Design”
October 17, 2023
整理報表數據時,利用數據回填 Backfilling 來解決程式碼的強耦合
這是關於整理報表時,遇到兩個模組間邏輯會打架的工作雜記,以下除了處理過程相似,其他模組與表格都是虛構
故事脈絡 最近遇到要把以前的報表新增加權分數(weighted_score)的欄位,而報表資料主要是從使用者評分表 Table 撈取出來整理的,加權分數以前是在其他模組計算但沒有被存放到 Table 中,使用者評分表的 Schema 簡化後大概如下
欄位名稱 資料類型 說明 id INT(PK) 主鍵 user_id INT(FK) 外鍵 value INT 新增/扣除的分數 params JSON 放置分數相關的任意資料 confirmed BOOLEAN 已經評分過的資料為 true 範例資料
id value user_id params confirmed 1 122 12 { “type”: 1, “weighted_score”: 456 } 0 2 19 11 { “type”: 2, “weighted_score”: 314 } 1 處理過程 建立共用的模組 由於以前的程式碼在計算加權分數時是直接計算,而加權分數其實會因為不同類型的type而有不同的加權計算方式,為了在報表也能使用這套邏輯,所以我們需要先抽出一個模組 Calculator ,慶幸的是這套邏輯已經有寫測試,所以我們可以省掉寫測試的時間直接重構即可,這邊我是使用工廠模式來處理,後續直接套用模組跑測試無誤就算是完成這個階段,可以到下一個階段進入資料的處理惹。
將計算完的資料放進 Table 中 這邊介紹一下會用到的兩個模組,模組 D 是負責進行使用者扣分的模組,而模組 DeductPoint 是接收到扣分行為時會去使用者評分表把扣分的資料寫入進去,有個需要注意的地方是,扣分會先從確認過(confirmed = 1)的分數先扣不夠再從未確認(confirmed = 0)的分數扣,所以有可能會一次扣分行為但記錄兩筆資料到使用者評分表…