Re: [戰] getter / setter
※ 引述《cyclone350 (老子我最神)》之銘言:
: 先舉一個例子,雖然猴大已經舉過了
: 有一個 class Person
: 對應 method 如下
: void setName(String name);
: void setName(String name, Locale locale);
: String getName();
: String getName(Locale locale);
: 我們可以用如以下方式使用
: //從資源庫取一個Person instance
: Person person = Repository.create(Person.class);
: person.setName("myNameByDefault");
: person.setName("myNameByEnglish",Locale.UK);
: //把Person存取到持久層
: Repository.save(person);
: 從以上來例子看...我們知道一個 Person 有名字,而且可以有多個語系的名字
: 如果我們把 getter/setter 拿掉,所有使用Person這個class的人,都需要知道
: 這個class裡面複雜的架構... 但是這是不必要的,我們只要知道,Person有Name
: 而且是多國語系,這樣就好了。
: 這應該是 Java 語言本身就很強調的... 抽象化的概念?
: 當然,如果一個class只是個data structure (或稱作簡單的Java bean?),
: 且class裡面的每一個member都必須是可以被外部class可以access的,
: 我也覺得 getter/setter 在這種情況是多餘的
: (這種情況意指這個class並沒有做任何商業邏輯)
其實封裝的最大用意
就是避免直接碰觸最直接的成員
就語法跟結果
person.name="myName";
persion.setName("myName");
兩者的結果都是一樣的
差別在於
對於屬性name的控制權是不一樣的
person.name的控制權是在於呼叫方
person.setName()的控制權變成在於Person,而呼叫方僅止於呼叫而已
以上述的例子來說
如果我想要針對name作驗證的話
person.name要怎麼做驗證?
驗證會變成在於呼叫方要做的事
例如
String name=result.get("name");
if(name=null || name.isEmpty()){
name="no name...ha!ha!";
}
person.name=name;
這樣會造成person.name會混亂
因為可能第二個呼叫會改成
throw new RuntimeException("name is null or empty");
那?????
因此person.name的控制到底要由誰來負責比較好呢
所以為了避免這個問題發生,也同時要釐清這個問題
因此
void setName(String name){
if(name == null){
throw new RuntimeException("name is null");
}
if(name.isEmpty()){
name="default name is ha ha ";
}
if(name.find("shit") > 0){
name=name.replace("shit","");
}
......
//經過千辛萬苦之後
this.name=name;
}
然後可以針對setName去AOP~去外掛~可以做的事情非常多
然而權責都會在於Person身上~或是針對Person的AOP實作
前提是
void setName()
當然如果專案本身根本就不需要那些有的沒的
那麼person.name就好
我自己的原則是如果範圍僅限於類別本身,則不用這麼麻煩,直接呼叫就好了
但超過類別的話,則要檢視是否有需要,如果看起來沒有甚麼需要,還是直接呼叫就好
之後有需要AOP之類的~再用重構改善程式碼就好
: : → Lordaeron:我已經說過, 我看過的PROJECT 都是一堆get/set 03/12 16:04
: : → Lordaeron:請問@f先生還要問什麼呢?CODE 又不止我寫的,有問題? 03/12 16:06
: : → Lordaeron:而我往往只負責收尾,只是看到一堆GET/SET很好笑. 03/12 16:08
: L大所述 "只會一直無意義get/set很XX",
: L大說法換個說法應該是說 "只會無腦寫程式的人很XX"
: 這種說法有點弔詭... 我們假設世界上真的有無腦的工程師
: 既然他們不會動腦,那他們職位可能就是猴大所述的"工人"
: 既然不會動腦,那何來getter/setter呢?
: 想必是照著leader開出的規格寫的
: 所以如果真的是XX,那應該也是上面的人XX,而不是這群工人XX吧?
: 就好像設蓋房子一開始設計圖就畫錯了,結果卻怪罪底下的工人亂做一通一樣...
: 我們是軟體工程師 (好啦也許只有我是...)
: 我們可以根據不同的情況找出不同的解法
: 既然在某些請況真的不適合使用 getter/setter
: 那可以跟當初的定規則的人討論,提出看法或解法
: 而不是在那邊說 "很可笑,很白X",不是嗎?
主要還是有沒有一個話事的SD比較重要
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.29.29.131
推
03/13 12:24, , 1F
03/13 12:24, 1F
→
03/13 13:35, , 2F
03/13 13:35, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 8 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章