java 板


LINE

getter/setter 的問題不在於是否 "getter/setter 9 成 以上都只有簡單的取值" (外國十年前就在戰的根本不是 這東西), 或是 "getter/setter 算不算 encapsulation" (我明顯是來亂的, L 君和 P 版大的論點我都在反對 :P ) 首先要解釋的是所謂外國十年前就在戰的是什麼. 其實 根本就沒有什麼在戰的. 事緣是有一個滿熱絡的討論, 在 談 "getters/setters are evil". 然後就有人沒有看清楚 因由, 就把這題目想成: 「因為絕大部份 setter/getter 都只是單純設值取值所以多餘,所以倒不如直接 access attribute」 然後就丟出一堆理由說setter/getter 比直 接取值好(大部份像 L 君那篇文說那堆) 可是那篇文的論點根本就不是這方面的東西. 所謂 setters/getters are evil 並不是說你不該用 setter getter 而轉用直接存取 attribute. 這可是比 setter/getter 更差. 所謂 evil 在談的是, 現今大部份人的所謂 OOP 設計, 裡面 大部份的 class 都旨在提供 getters/setters, 然後把 logic 寫在某些特定的地方 (XXX Service, XXX Manager etc), 而所謂 的 logic 則是不斷經 getter/setter 存取一堆不同的 class. 但這並不是好的 OOP 設計, 這也不是包裝. OOP 說的是 讓你的 class 提供各種有意思的行為, 而不必讓你的 class 洩露 它的內部結構. 這才是所謂包裝, 才是 getter/setter are evil 的意思. 要是理解後, 就會明白這和 所謂 interface-driven 關係密切. 然後下一個問題是, 是不是 getter/setter 就有問題? 不是 有很多情況下我們的確要讓人存取資料, 最常見的就是有些 class 的確就是設計來放數值給人家看的, 這類 data object 最常 見用於 marshall/demarshall 為 serialized form. 另外一種常見的用途就是 component 用來建立關係用的, 比如 OrderService 會用 AccountService, 我要怎麼令我的 OrderServiceImpl instance 指向某一 AccountService 的 instance, Dependency Injection 的場合, setter 甚為重要. (當然還有其他情況) 所以一看到 getter/setter 就說白痴的, 只是知其然而不知其 所以然. 問題不是在於 "你 90% 的 bean 的 getter/setter 都只是單純存取", 而在於 "你的設計裡 90% 都只是單純提供 getter/setter 存取的 bean". L 君說的一句: "只要OBJECT 都要 GET/SET 一下" 比較貼近問題所在, 唯這種作風並不是在 java 才發揚光大. 一堆寫 C++ 的人早就這樣做了. 只是 Java (其實是 Java Bean) 對 getter setter 有比較正式的規範而已. 同樣, 在爭論 getter/setter 在做封裝的, 也是方向錯誤. 99% 的 getter/setter 就不是作封裝的. 而這種 getter/setter 的確在洩露 implementation detail. 當然和直接存取 field 相比, 經 getter/setter 還是 有好處. 但 OOP 的目的是讓你 的 domain model 提供有意思的行為, 而不是搞 Anemic model + service 這種 名 OOP 實 procedural 的設計. --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 91.240.192.5
1F:→ danny8376:難得相關的文沒有END (誤 03/13 15:06
2F:→ swpoker:先規劃有意義的函式,但都用不到,但沒規劃的結果卻是亂很大 03/13 15:10
3F:→ Lordaeron:哇,我有說過不要用getter/setter? 03/13 15:11
4F:→ adrianshum:沒有,當然你可以硬凹 setter getter 白痴是別的意思 03/13 15:20
5F:→ adrianshum:但只要有需要用到getter setter 的地方,IDE生成就 03/13 15:22
6F:→ adrianshum:有其好處有方便,而不是多餘白痴 03/13 15:23
7F:→ Lordaeron:邏輯:既然沒有,何來硬凹? 03/13 15:40
8F:→ Lordaeron:邏輯:"只要有需要用到" 這東西誰決定的? 所以沒有白痴. 03/13 15:43
9F:→ adrianshum:那請解釋 寫getter setter 白痴 的意思 03/13 16:03
10F:→ adrianshum:第二,請說你認為有沒有需要用getter/setter 的情況 03/13 16:04
11F:→ Lordaeron:design問題,要物件的狀態,請你叫他做完事再返回給你. 03/13 16:07
12F:→ adrianshum:免得你一時說「我有說不要用...嗎?」,一時又說 03/13 16:07
13F:→ adrianshum:有需要用到是誰決定 的 03/13 16:08
14F:→ Lordaeron:哇,話是你講的,我只是指出你邏輯的問題,現在套回我頭上? 03/13 16:09
15F:→ adrianshum:首先話是你說的非我,所以你要是認為人歪曲你白痴y 03/13 16:13
16F:→ adrianshum:的意思請說你的意思為何 03/13 16:14
17F:→ adrianshum:另,我也沒說過閣下說不可用getter setter 吧? 03/13 16:15
18F:→ Lordaeron:不是回你了?又看不到? 03/13 16:16
19F:→ Lordaeron:我還想問:"一堆寫 C++ 的人早就這樣做了",是指什麼年代? 03/13 16:19
20F:→ adrianshum:的確看不到,請貼題回答。另 C++ 在十多年前就看過 03/13 16:23
21F:→ adrianshum:有人用這種procedural 思維在開發。so? 03/13 16:23
22F:→ Lordaeron:回:design問題,要物件的狀態,請你叫他做完事再返回給你. 03/13 16:25
23F:→ Lordaeron:就是1999年的東西都還G得到一些,請明示吧,我真的沒看過. 03/13 16:27
※ 編輯: adrianshum 來自: 91.240.192.5 (03/13 16:36)
24F:→ Lordaeron:OOP的重點是行為及資料在一起運作,data object是? 03/13 16:42
25F:→ adrianshum:答非所問,你在說的就不算是getter setter, so? 03/13 16:53
26F:→ adrianshum:另 C++ 我是在不同工作中遇到的。 03/13 17:00
27F:→ Lordaeron:哦,你要將CALL傳參數然後返回值都算,哪就沒什麼不算的了 03/13 17:07
28F:→ Lordaeron:哪還好,你的工作中遇到的一堆. 03/13 17:09
29F:→ Lordaeron:重點是要叫它做事. 03/13 17:12
30F:→ Lordaeron:邏輯:既然答非所問, 請問何來質疑getter/setter? 03/13 17:18
31F:推 gmoz:"寫getter/setter的確還頂白痴的,沒用又多餘." 所以這主詞是? 03/13 17:42
32F:→ Lordaeron:一定要有主詞? 03/13 17:47
33F:→ gmoz:不同的主詞,整句話就有不同的解釋啦XD 各自表述才會戰起來 03/13 17:53
34F:→ Lordaeron:不就回答,OOP的重點是行為及資料在一起運作. 03/13 17:56
35F:→ Lordaeron:要ACTION,不是噓寒問暖. 03/13 17:59
36F:→ NewSpec:Groovy: 他們在爭什麼呀@@a?(搔頭 03/13 18:29
37F:→ adrianshum:我該汲取教訓的,某君“討論”時那種自說自話答非所問 03/15 22:11
38F:→ adrianshum:甚至(或許是故意地)錯誤理解及歪曲別人所說的事, 03/15 22:15
39F:→ adrianshum:已非第一次領教。對不起,我實在不應期望可以與之正常 03/15 22:15
40F:→ adrianshum:討論。 03/15 22:16
41F:→ Lordaeron:又來了,誰故意否曲別人所說的話,很明顯的. 03/16 13:39
42F:→ Lordaeron:還很會裝傻,明明看懂,還要先補一句答非所問.很會裝呢. 03/16 13:40
43F:→ TonyQ:「→ Lordaeron:寫getter/setter的確還頂白痴的,沒用又多餘. 03/17 08:37
44F:→ TonyQ:我怎麼讀都只讀到 L 覺得不應該寫 getter/setter 。可能要 03/17 08:39
45F:→ TonyQ:當事人加強一下表達技巧免得別人誤會。XD 03/17 10:25
46F:→ Lordaeron:我講的方式你要定義成GET/SET我也沒辨法. 03/17 16:32
47F:→ Lordaeron:C++出來時,壓根沒人會去想get/set 然後CALL ACTION. 03/17 16:35
48F:→ Lordaeron:更別說data object這位大的產物. 03/17 17:21
49F:→ Lordaeron:返回值 = 物件.動作(參數....);沒get/set before action 03/17 17:57
50F:→ TonyQ:你跟我的用詞都是 getter/setter ,我只是原文照貼啊..@@ 03/17 18:35
51F:→ Lordaeron:無關用詞,我針對的是好笑的getter/setter後再作動作的. 03/18 09:39
52F:→ Lordaeron:所以用getter/setter很好笑.沒這東西出現前OOP都活好好 03/18 09:41
53F:→ Lordaeron:的,所以你想找getter/setter的很必要的順證點,基本沒有. 03/18 09:43
54F:→ tails32100:L大說getter/setter很好笑之前 getter/setter都活好好 03/18 10:05
55F:→ tails32100:的,所以你想找getter/setter的很好笑的順證點,基本沒有 03/18 10:06
56F:→ Lordaeron:咦,來找鬧的哦,java 出現早還是small talk/c++ 03/18 10:09
57F:→ tails32100:有的話請L大指點,小弟想知道自己的code是不是很好笑 03/18 10:09
58F:→ tails32100:小弟來求解的,因為之前問的問題一直沒有解答O.O/ 03/18 10:10
59F:→ Lordaeron:這就是順證點.要找鬧就省省吧. 03/18 10:11
60F:→ tails32100:那請問L大 什麼是好笑的getter/setter? 03/18 10:12
61F:→ Lordaeron:不就講了?看不懂? 03/18 10:15
62F:→ tails32100:看不懂 可能是小弟白痴 不是L大表達不好 03/18 10:19
63F:→ Lordaeron:哪就沒辨法了. 03/18 10:21
64F:→ tails32100:求詳細 03/18 10:22
65F:→ Lordaeron:去找家教吧. 03/18 10:30
66F:→ tails32100:已找 Google果然是最好的老師 感謝L大的建議 03/18 10:57
67F:→ TonyQ:所以"L 覺得不應該寫 getter/setter" 不是嗎? 03/18 14:18
68F:→ TonyQ:我沒做什麼論證,也沒做什麼論述啊,你說寫這很白痴我就覺得 03/18 14:19
69F:→ TonyQ:你意思是這樣。沒在找什麼順證點,有時我也會覺得這很多餘。 03/18 14:22
70F:→ TonyQ:只是你說寫 getter/setter 白痴又說沒說不要用,讀起來很亂 03/18 14:23
71F:→ Lordaeron:二元腦袋?要用,你老闆說要用時,就要用.有問題? 03/18 14:34
72F:→ Lordaeron:不讚成-->不代表反對........... 03/18 16:09







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燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP