當一個類別或物件有一個或多個欄位只有在特定情況下才會使用到,例如在方法呼叫階段用來暫時儲存資料,其他多數時候只是空值或沒有相關的值。這種實作模式我們可以稱之為「臨時欄位(Temporary Field)」氣味。
上述的情況中,這些欄位並不包含在該類別的主要職責當中,通常只存在特定前提條件下才有意義。這些欄位可能會導致各種問題,也可能讓開發者容易產生誤解。這個氣味通常也會導致 Long Parameter List 氣味,包含許多冗長也無效的參數。
當類別中出現「臨時欄位」氣味時,很可能代表這個類別中出現差異頗大的不同使用情境,擔負了超過一個以上的職責。這種時候我們最好依照職責將原有的類別一分為二,根據職責而重新劃分為新的類別,讓類別中的每一個欄位都完全符合類別的意圖,以方便開發者掌握與理解。
當我們的物件中存在許多臨時欄位以空值來表示「例外」或不預期的使用情境時,我們可以將臨時欄位轉換為一個 Null 空物件來實作與原本實際物件相同的介面,定義我們規格上所需的預設行為。過這個手法我們可以消除原本臨時欄位存在的需求,而改用空物件取代。
另一個好處是這個手法有助於提升單一職責原則,讓原有的物件能專注在預期設計的行為,把非預期的其他狀況處理職責,轉交由空物件來實作。藉由這樣職責分離的設計,來提升程式碼的簡潔與清晰程度。
When a class or object has a field (or member variable) that is only used temporarily or sporadically, it is considered a “Temporary Field” smell. This field is not part of the class's primary responsibility or purpose and is often used to store data temporarily during a specific operation or method call. Such a field can lead to various issues and can indicate a design problem in your code.
This is often an alternative to the “Long Parameter List” smell.
https://refactoring.guru/smells/temporary-field