0%

getter and setter in OOPL

這篇講的不是什麼技術面,而是每種物件導向程式語言都會碰到的情況。如何存取物件裡面的屬性。把屬性設成公開固然是一種解法,不過這就違反了Information Hiding的原則。各種程式語言作法都不同,這邊講我比較熟悉的部份(C++/C#/Java)。

從Java開始

這次從Java開始談,是因為最單純,沒有任何取巧的空間。

1
2
3
4
5
6
7
8
class Person {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
};

每個getter/setter都要手刻,雖然可以藉由IDE的幫助,不過還是很麻煩。同樣在JVM上的城市語言,Scala就有在這點著墨。

C++的作法

藉由原本就有的Macro幫助,可以少打幾個字。

1
2
3
4
5
6
7
8
9
10
11
#define get_set_prop(type, Name) \
public: \
type get##Name() { return Name; } \
void set##Name(const type& v) { Name = v; }
class Person {
string Name;
int Age;
public:
get_set_prop(int, Age)
get_set_prop(string, Name)
};

不過也只是少打幾個字而已,IDE對於的Macro的支援度不同,Code completion可能會有問題。
加上Macro天生就很難除錯,Google C++ Coding Style建議能不用Macro就不用。

C#的Property

C#的Property算是一種語法糖,不過由於編譯器的支援,簡化了遇到的問題。以下以C# 4.0的示範

1
2
3
4
5
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

雖然是語法糖,不過這樣表示新蜥易懂,也有很多人試著把這個特性家入到C++中,就知道這特性沒有無所謂,卻很實用。