java 板


LINE

※ 引述《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
1F:推 henry4343:所以有需要就加,沒需要就不用加 03/13 12:24
2F:→ swpoker:對阿~但要注意就是過度開放到時要靠重構收回來~不然會亂 03/13 13:35







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP