簡體   English   中英

我應該使用public方法訪問類內部的私有變量嗎?

[英]should I use public method to access private variable inside a class?

偽代碼在JavaScript中。 我有Animal類和使用私有變量_type來保存動物類型的typeMatches方法:

function Animal()
{
    this._type = "dog";
}
Animal.prototype.getAnimalType = function()
{
    return this._type;
}
Animal.protytype.typeMatches = function(animalType)
{
    //option 1 - accessing private variable directly
    return this._type === animalType;
    //option 2 - accessing private through public method
    return this.getAnimalType() === animalType; //accessing private through public method
}

我一直在類內部直接使用私有變量(選項1),但是最近有人告訴我,這是一種不好的做法,只要有機會,我就應該使用公共方法來獲取私有變量(選項2)。 但是我以這個變量是私有的為由而質疑這個建議,因為我在類中使用了它,所以我沒有違反任何約定,而直接訪問使我的代碼更清晰了。 我錯了嗎?

在絕對需要時執行此操作(並盡可能避免使用它)。

吸氣劑的唯一任務是返回數據,可能是在進行轉換以使其更易於使用之后。

例如背景字段

long _ticks = 500000000000L;

可以吸氣

public long GetTicks() 
{
    return _ticks;
}

的確,在這種情況下,使用背景字段和吸氣劑之間沒有區別。 但是,使用吸氣劑的問題在於,您現在使數據的外部內部表示都相同。

我們可以很容易地表達出這是一個問題的原因:如果我們想將_ticks作為string返回給外界怎么辦? 現在我們必須破壞內部功能,否則我們將無法像普通接口一樣更改某些常規內容。

確實:我們試圖用私有字段的封裝來完成的事情現在已被破壞,因為您將嘗試在內部功能中使用外部表示。

現在,該代碼將破壞我們類中依賴於其傳遞數字類型而不是string其他代碼。

public string GetTicks() 
{
    return _ticks.ToString();
}

在極少數情況下,我會提倡在類本身內部使用getter( GetAge()GetAge()GetAge()這樣的計算字段),如果我這樣做,是因為這是最后一個可行的選擇。 將您的內部和外部代表分開,這將使您免於頭痛。

(我對Javascript並不是很熟悉,但是我相信代碼示例已經足夠清楚了。我意識到Javascript不太關心確切的類型,但這只是一個例子:可以進行許多不同類型的轉換。)

正如@Jeroen Vannevel指出的那樣,只有某些邏輯在獲取/設置背后是“必要的”。

例如,如果您有兩個屬性:
1)出生年份:
2)年齡

最簡單的方法是在設置BirtYear時計算年齡。 您可以執行1個setter來設置屬性,並為每個屬性設置2個getter。

人們向您推薦始終使用getter / setter的原因是,您的代碼中將始終具有相同的結構 ,並且永遠不會通過更改getter / setter來破壞任何功能 另外,在訪問屬性和函數時,您不必區分它們 (只有函數)

我幾乎總是使用em。 它更加一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM