40 lines
3.1 KiB
JSON
40 lines
3.1 KiB
JSON
[
|
||
{
|
||
"level": "critical",
|
||
"role": "Mage",
|
||
"location": "app/usage.js:231",
|
||
"problem": "在計算 `remaining` 時,`remaining = Number(rate.remaining);` 之後直接檢查 `Number.isFinite(remaining)`,但若 `rate.remaining` 是 `undefined` 或 `null`,`Number()` 會轉為 `0`。這意味著如果 `rate.remaining` 缺失,會被錯誤地視為「剩餘 0」而不是「無效值」,進而導致計算出 `0%` 的錯誤結果,而非預期的落到 `{ percent: null }`。",
|
||
"suggestion": "應先檢查 `rate.remaining` 是否為 null/undefined,或者使用更嚴格的轉換方式,確保只有在確實是有限數字時才進行後續運算。",
|
||
"is_new": true
|
||
},
|
||
{
|
||
"level": "warning",
|
||
"role": "Assassin",
|
||
"location": "app/usage.js:215",
|
||
"problem": "在 `isFinitePositive` 函數中,使用 `Number(n)` 進行強制轉型。若 `n` 為物件(例如 `{}` 或 `[]`),`Number()` 的行為在某些邊緣情況下可能會產生非預期的數字,雖然當前邏輯有做 `Number.isFinite` 檢查,但對於這種隱式轉型仍需保持警惕,且函數名稱 `isFinitePositive` 雖然清楚,但在這個上下文中,函式內部使用了 `Number(n)` 強制轉型,這在 JavaScript 中可能會隱蔽掉原本資料型態的不一致。",
|
||
"suggestion": "建議在 `isFinitePositive` 內部補上對 `null` 或 `undefined` 的顯式檢查,並直接在外部嚴格限制輸入類型或使用更明確的檢查(例如 `typeof n === 'number'`)取代隱式轉型,避免隱式轉型帶來的不可控副作用。"
|
||
},
|
||
{
|
||
"level": "warning",
|
||
"role": "Leo",
|
||
"location": "app/usage.js:222",
|
||
"problem": "resolveRemainingPercent 函式同時處理了 quota 和 rate 的邏輯,導致檢查 limit 和 remaining 的計算與驗證邏輯在兩處重複,未來若要調整百分比算法,必須兩處同步修改,增加維護負擔。",
|
||
"suggestion": "建議將百分比計算邏輯抽象為獨立的輔助函式(如 calculatePercent(remaining, limit)),讓 resolveRemainingPercent 僅負責選擇計算基準,降低重複性並提升封裝度。",
|
||
"is_new": true
|
||
},
|
||
{
|
||
"level": "warning",
|
||
"role": "Rogue",
|
||
"location": "app/usage.js:213",
|
||
"problem": "在函式內部重複呼叫 `Number(n)`,造成不必要的型別轉換開銷,且在條件式之後又呼叫一次 `Number(quota.limit)`,造成重複轉換。",
|
||
"suggestion": "建議將 `Number(n)` 的結果暫存起來,或在進入條件式後立即將值賦值給一個變數並重複使用,減少重複轉換的成本。"
|
||
},
|
||
{
|
||
"level": "info",
|
||
"role": "Bard",
|
||
"location": "app/usage.js:225",
|
||
"problem": "註解中提到「落到 { percent: null, reason }」,但程式碼實際邏輯是在 if 判斷式內直接 return,且 `resolveRemainingPercent` 函式中檢查分散在兩個 if 區塊,產生了重複的邏輯結構。",
|
||
"suggestion": "建議將註解簡化為:「上限或剩餘為無效值時跳過計算」,並將計算百分比的邏輯抽離成一個獨立的輔助函式,統一處理 `isFinite` 的檢查與百分比運算。"
|
||
}
|
||
]
|