Re: [戰] getter / setter

看板java作者 (swpoker)時間10年前 (2014/03/13 09:39), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串7/8 (看更多)
※ 引述《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
文章代碼(AID): #1J8GnJDf (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 8 篇):
1
4
文章代碼(AID): #1J8GnJDf (java)