Re: [戰] getter / setter

看板java作者 (Alien)時間10年前 (2014/03/13 15:02), 編輯推噓1(1071)
留言72則, 8人參與, 最新討論串8/8 (看更多)
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

03/13 15:06, , 1F
難得相關的文沒有END (誤
03/13 15:06, 1F

03/13 15:10, , 2F
先規劃有意義的函式,但都用不到,但沒規劃的結果卻是亂很大
03/13 15:10, 2F

03/13 15:11, , 3F
哇,我有說過不要用getter/setter?
03/13 15:11, 3F

03/13 15:20, , 4F
沒有,當然你可以硬凹 setter getter 白痴是別的意思
03/13 15:20, 4F

03/13 15:22, , 5F
但只要有需要用到getter setter 的地方,IDE生成就
03/13 15:22, 5F

03/13 15:23, , 6F
有其好處有方便,而不是多餘白痴
03/13 15:23, 6F

03/13 15:40, , 7F
邏輯:既然沒有,何來硬凹?
03/13 15:40, 7F

03/13 15:43, , 8F
邏輯:"只要有需要用到" 這東西誰決定的? 所以沒有白痴.
03/13 15:43, 8F

03/13 16:03, , 9F
那請解釋 寫getter setter 白痴 的意思
03/13 16:03, 9F

03/13 16:04, , 10F
第二,請說你認為有沒有需要用getter/setter 的情況
03/13 16:04, 10F

03/13 16:07, , 11F
design問題,要物件的狀態,請你叫他做完事再返回給你.
03/13 16:07, 11F

03/13 16:07, , 12F
免得你一時說「我有說不要用...嗎?」,一時又說
03/13 16:07, 12F

03/13 16:08, , 13F
有需要用到是誰決定 的
03/13 16:08, 13F

03/13 16:09, , 14F
哇,話是你講的,我只是指出你邏輯的問題,現在套回我頭上?
03/13 16:09, 14F

03/13 16:13, , 15F
首先話是你說的非我,所以你要是認為人歪曲你白痴y
03/13 16:13, 15F

03/13 16:14, , 16F
的意思請說你的意思為何
03/13 16:14, 16F

03/13 16:15, , 17F
另,我也沒說過閣下說不可用getter setter 吧?
03/13 16:15, 17F

03/13 16:16, , 18F
不是回你了?又看不到?
03/13 16:16, 18F

03/13 16:19, , 19F
我還想問:"一堆寫 C++ 的人早就這樣做了",是指什麼年代?
03/13 16:19, 19F

03/13 16:23, , 20F
的確看不到,請貼題回答。另 C++ 在十多年前就看過
03/13 16:23, 20F

03/13 16:23, , 21F
有人用這種procedural 思維在開發。so?
03/13 16:23, 21F

03/13 16:25, , 22F
回:design問題,要物件的狀態,請你叫他做完事再返回給你.
03/13 16:25, 22F

03/13 16:27, , 23F
就是1999年的東西都還G得到一些,請明示吧,我真的沒看過.
03/13 16:27, 23F
※ 編輯: adrianshum 來自: 91.240.192.5 (03/13 16:36)

03/13 16:42, , 24F
OOP的重點是行為及資料在一起運作,data object是?
03/13 16:42, 24F

03/13 16:53, , 25F
答非所問,你在說的就不算是getter setter, so?
03/13 16:53, 25F

03/13 17:00, , 26F
另 C++ 我是在不同工作中遇到的。
03/13 17:00, 26F

03/13 17:07, , 27F
哦,你要將CALL傳參數然後返回值都算,哪就沒什麼不算的了
03/13 17:07, 27F

03/13 17:09, , 28F
哪還好,你的工作中遇到的一堆.
03/13 17:09, 28F

03/13 17:12, , 29F
重點是要叫它做事.
03/13 17:12, 29F

03/13 17:18, , 30F
邏輯:既然答非所問, 請問何來質疑getter/setter?
03/13 17:18, 30F

03/13 17:42, , 31F
"寫getter/setter的確還頂白痴的,沒用又多餘." 所以這主詞是?
03/13 17:42, 31F

03/13 17:47, , 32F
一定要有主詞?
03/13 17:47, 32F

03/13 17:53, , 33F
不同的主詞,整句話就有不同的解釋啦XD 各自表述才會戰起來
03/13 17:53, 33F

03/13 17:56, , 34F
不就回答,OOP的重點是行為及資料在一起運作.
03/13 17:56, 34F

03/13 17:59, , 35F
要ACTION,不是噓寒問暖.
03/13 17:59, 35F

03/13 18:29, , 36F
Groovy: 他們在爭什麼呀@@a?(搔頭
03/13 18:29, 36F

03/15 22:11, , 37F
我該汲取教訓的,某君“討論”時那種自說自話答非所問
03/15 22:11, 37F

03/15 22:15, , 38F
甚至(或許是故意地)錯誤理解及歪曲別人所說的事,
03/15 22:15, 38F

03/15 22:15, , 39F
已非第一次領教。對不起,我實在不應期望可以與之正常
03/15 22:15, 39F

03/15 22:16, , 40F
討論。
03/15 22:16, 40F

03/16 13:39, , 41F
又來了,誰故意否曲別人所說的話,很明顯的.
03/16 13:39, 41F

03/16 13:40, , 42F
還很會裝傻,明明看懂,還要先補一句答非所問.很會裝呢.
03/16 13:40, 42F

03/17 08:37, , 43F
「→ Lordaeron:寫getter/setter的確還頂白痴的,沒用又多餘.
03/17 08:37, 43F

03/17 08:39, , 44F
我怎麼讀都只讀到 L 覺得不應該寫 getter/setter 。可能要
03/17 08:39, 44F

03/17 10:25, , 45F
當事人加強一下表達技巧免得別人誤會。XD
03/17 10:25, 45F

03/17 16:32, , 46F
我講的方式你要定義成GET/SET我也沒辨法.
03/17 16:32, 46F

03/17 16:35, , 47F
C++出來時,壓根沒人會去想get/set 然後CALL ACTION.
03/17 16:35, 47F

03/17 17:21, , 48F
更別說data object這位大的產物.
03/17 17:21, 48F

03/17 17:57, , 49F
返回值 = 物件.動作(參數....);沒get/set before action
03/17 17:57, 49F

03/17 18:35, , 50F
你跟我的用詞都是 getter/setter ,我只是原文照貼啊..@@
03/17 18:35, 50F

03/18 09:39, , 51F
無關用詞,我針對的是好笑的getter/setter後再作動作的.
03/18 09:39, 51F

03/18 09:41, , 52F
所以用getter/setter很好笑.沒這東西出現前OOP都活好好
03/18 09:41, 52F

03/18 09:43, , 53F
的,所以你想找getter/setter的很必要的順證點,基本沒有.
03/18 09:43, 53F

03/18 10:05, , 54F
L大說getter/setter很好笑之前 getter/setter都活好好
03/18 10:05, 54F

03/18 10:06, , 55F
的,所以你想找getter/setter的很好笑的順證點,基本沒有
03/18 10:06, 55F

03/18 10:09, , 56F
咦,來找鬧的哦,java 出現早還是small talk/c++
03/18 10:09, 56F

03/18 10:09, , 57F
有的話請L大指點,小弟想知道自己的code是不是很好笑
03/18 10:09, 57F

03/18 10:10, , 58F
小弟來求解的,因為之前問的問題一直沒有解答O.O/
03/18 10:10, 58F

03/18 10:11, , 59F
這就是順證點.要找鬧就省省吧.
03/18 10:11, 59F

03/18 10:12, , 60F
那請問L大 什麼是好笑的getter/setter?
03/18 10:12, 60F

03/18 10:15, , 61F
不就講了?看不懂?
03/18 10:15, 61F

03/18 10:19, , 62F
看不懂 可能是小弟白痴 不是L大表達不好
03/18 10:19, 62F

03/18 10:21, , 63F
哪就沒辨法了.
03/18 10:21, 63F

03/18 10:22, , 64F
求詳細
03/18 10:22, 64F

03/18 10:30, , 65F
去找家教吧.
03/18 10:30, 65F

03/18 10:57, , 66F
已找 Google果然是最好的老師 感謝L大的建議
03/18 10:57, 66F

03/18 14:18, , 67F
所以"L 覺得不應該寫 getter/setter" 不是嗎?
03/18 14:18, 67F

03/18 14:19, , 68F
我沒做什麼論證,也沒做什麼論述啊,你說寫這很白痴我就覺得
03/18 14:19, 68F

03/18 14:22, , 69F
你意思是這樣。沒在找什麼順證點,有時我也會覺得這很多餘。
03/18 14:22, 69F

03/18 14:23, , 70F
只是你說寫 getter/setter 白痴又說沒說不要用,讀起來很亂
03/18 14:23, 70F

03/18 14:34, , 71F
二元腦袋?要用,你老闆說要用時,就要用.有問題?
03/18 14:34, 71F

03/18 16:09, , 72F
不讚成-->不代表反對...........
03/18 16:09, 72F
文章代碼(AID): #1J8LW09b (java)
文章代碼(AID): #1J8LW09b (java)