首頁 >Java >java教程 >在物件導向程式設計中什麼時候應該避免使用 Getter 和 Setter?

在物件導向程式設計中什麼時候應該避免使用 Getter 和 Setter?

Susan Sarandon
Susan Sarandon原創
2024-12-12 18:55:09854瀏覽

When Should You Avoid Getters and Setters in Object-Oriented Programming?

獲取器和設定器:智慧設計

在軟體工程中,獲取器和設定器分別充當私有變數的存取器和修飾符。雖然它們對於良好的物件導向程式設計實踐至關重要,但關於它們潛在的設計缺陷一直存在爭議。

一個常見的批評是 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn