2011年11月10日 星期四

物件導向的 Setter/Getter

Setter/Getter 是設計物件變數上的一個使用技巧
後來許多程式設言都有特別為它去支援語法,像是 c#、objectivce c

如果搞不太清楚 Setter/Getter 的用法及用意,可以看一下此篇

學過物件導向的人應該都清楚物件的權限有三種
public、protected、private (friend 丟掉....)

如果想要讓外部的物件 or 函式要使用屬性,必須把屬性宣告成 public 的權限
但實際使用會隱含許多危險的情況,舉個例子(這邊用 c++ 的語法講解)

class CarData {
public:
    int energy;             // 車子目前能量值
    int maxEnergy;        // 車子能量值最大上限
};

如果我們想補充車子能量,最快的方法就是
car.energy += 100;

假設 maxEnergy 只有 10、energy 是 5,那計算結果後,energy 就變成了 105
對 CarData 來說,energy 這份資料不合理,可能產生無法預期的錯誤

所以往後的物件設計中,都會採用函式的方式來間接存取變數

public class CarData {
// 將屬性都改為私有
private:
    int energy;
    int maxEnergy;
    int type;
// 間接使用函式來存取上面兩個變數
public:
    void SetEnergy(int value);
    int GetEnergy();
    void SetMaxEnergy(int value);
    int GetMaxEnergy();
    int GetType();
}

void CarData::SetEnergy(int value) {
    energy = value;

    // 限制 energy 在 0 ~ maxEnergy 的範圍
    if( energy > maxEnergy )
        energy = maxEnergy;
    else if( energy < 0 )
        energy = 0;
}

int CarData::GetEnergy() {
    return energy;
}

void CarData::SetMaxEnergy(int value) {
    maxEnergy = value;

    // 限制 maxEnergy 不會小於 1
    if( maxEnergy < 1 )
        maxEnergy = 1;
}

int CarData::GetMaxEnergy() {
    return maxEnergy;
}

// 只有 Get 就是 readonly 啦,不想讓別人改
int CarData::GetType() {
    return type;
}

這樣應該比較清楚了吧

外部只能經由函式設定及存取該物件的屬性
即使是給予了錯誤的資料,在該物中也可以修正,避免不預期的 Crash
這種設定屬性的技巧,就是常聽到的 Setter/Getter 啦

沒有留言:

張貼留言