在軟體工程中,獲取器和設定器分別充當私有變數的存取器和修飾符。雖然它們對於良好的物件導向程式設計實踐至關重要,但關於它們潛在的設計缺陷一直存在爭議。
一個常見的批評是 getter 和 setter 會造成不必要的封裝破壞,從而暴露內部變數以進行操作。考慮以下程式碼片段:
private int score; public int getScore() { return score; } public void setScore(int score) { this.score = score; }
getScore() 方法允許直接存取私有分數變量,而 setScore() 允許任意值分配。這可能會導致不一致或無效的狀態更改,如下面的程式碼所示:
// Attempt to increment score by destroying an enemy game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
如果分數只能增加,而不是任意設置,那麼這種方法很容易出錯。更合適的設計是創建一個專門的方法來封裝分數遞增操作:
public void addScore(int delta) { score += delta; }
透過限制setter並引入替代的分數操作方法,這種設計確保了資料一致性並防止無效的狀態轉換.
此外,getter 和setter 可能會導致物件之間的緊密耦合。考慮以下範例,其中物件的「活動」狀態是透過setter 和getter 方法控制的:
private boolean alive = true; public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; }
如果此邏輯的實作將來發生變化,則getter 和setter 簽章將保持不變以維護相容性。但是,這可能會導致底層資料結構(例如,表示「活動」狀態的布林值)不再準確反映物件的狀態。
為了解決這些設計問題,建議建立方法直接執行所需的操作,而不是只依賴 getter 和 setter。例如,「存活」狀態可以透過專用方法來處理:
private int hp; // Hit points set in constructor public boolean isAlive() { return hp > 0; } // Same method signature public void kill() { hp = 0; } // Same method signature public void damage(int damage) { hp -= damage; }
這種方法封裝了操作物件存活狀態的邏輯,並為其他物件與其互動提供了清晰簡潔的介面.
總之,雖然getter 和setter 在某些情況下可能很有用,但了解它們潛在的設計缺陷很重要。透過採用優先考慮資料一致性、物件封裝和鬆散耦合的替代設計模式,開發人員可以創建從長遠來看更加健壯和可維護的軟體。
以上是在物件導向程式設計中什麼時候應該避免使用 Getter 和 Setter?的詳細內容。更多資訊請關注PHP中文網其他相關文章!