以下是有關在課堂上使用屬性的問題。屬性和封裝
我一直在使用公共屬性,而不是公開暴露成員變量。多數人建議這種方法有助於封裝。但是,我不明白封裝的優勢,因爲它是一個屬性。
很多人不知道使用屬性的真正原因。他們只是將它作爲編碼標準的一部分。
有人可以清楚地解釋一個屬性如何比公共成員變量更好,以及它如何改進封裝?
以下是有關在課堂上使用屬性的問題。屬性和封裝
我一直在使用公共屬性,而不是公開暴露成員變量。多數人建議這種方法有助於封裝。但是,我不明白封裝的優勢,因爲它是一個屬性。
很多人不知道使用屬性的真正原因。他們只是將它作爲編碼標準的一部分。
有人可以清楚地解釋一個屬性如何比公共成員變量更好,以及它如何改進封裝?
封裝有助於通過絕緣來改變類的調用。讓我們想象一下,你有一個簡單的類來模擬汽車引擎(導致所有的OO例子應該涉及汽車的比喻:))。你可能有一個簡單的現場是這樣的:
private bool engineRunning;
簡單地使這一領域的公共或提供一個類型的字段()的吸氣劑不出現任何不同。
現在假設你讓你的類更復雜,要刪除字段,將其替換爲:
private bool ignitionOn;
private bool starterWasActivated;
現在,如果你有大量的類來訪問老engineRunning
領域,你必須去改變他們所有(不好的時候)。
相反,如果你已經開始:
public bool IsEngineRunning()
{
return this.engineRunning;
}
你現在可以將其更改爲:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
和類的接口保持不變(美好的時光)。
的幾點思考:
你可以改變你的數據的內部表示,而不會影響調用的類。
E.g. (前)
public boolean isActive() {
return this.is_active;
}
(後)
public boolean isActive() {
return this.is_active && this.approved && this.beforeDeadline;
}
如果你的代碼是由他人使用(即你的代碼是第三方)這一點尤其重要。在一定程度上,你的界面/ API必須保持穩定。小的更改不應該影響使用它的其他代碼的代碼。
您可以有更復雜的操作。考慮一個變量is_active
。也許改變這個變量的值也會影響對象的其他屬性。如果你將訪問封裝在一個方法中,你可以在這個方法中關注這個,並且調用者不必關心。
E.g.
public void setActive(boolean active) {
this.is_active = active;
this.startTimeout();
this.updateOtherInformation();
}
因此它強制執行一系列的操作。你不要已經依靠調用者正確執行此操作的事實。你的對象將始終處於正確的狀態。
我會把它縮短。屬性=靈活性
屬性可用於創建您不希望在課程中始終保持的成員,或者是現有成員的聚合/功能。
例如,年齡可以根據生日輸出,可以從hasLimbs & &生成canSwim漂浮
揭露成員性質與意外變化打交道時能有所幫助[有沒有人曾預測所有客戶機的請求?]在一個系統現有數據庫。
例如,當用戶超過18歲並被高速緩存以獲得性能時,它是真實的。客戶端要運行在美國的服務,如果假的chached可以返回false,檢查年齡只有當緩存爲真
其更好地揭露性質的,而不是成員變量,因爲這將讓你做各種檢查何時設置或獲取成員變量的值。
假設u有一個成員變量:
private int id;
,你有一個公共財產:
public int ID
{
get
{
// do something before returning
}
set
{
// do some checking here may be limits or other kind of checking
}
}
我想指出的是,這種變化並不意味着客戶端必須改變。它只意味着你必須以同樣的方式和相同的語義暴露engineRunning屬性。唯一的區別是每次更新點火和起動器屬性都必須更新engineRunning屬性。取決於更頻繁地閱讀/更新的內容,這可能會對性能產生正面或負面影響。 – 2013-02-23 08:29:39