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