Re: [戰] getter / setter
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
03/13 15:06, 1F
→
03/13 15:10, , 2F
03/13 15:10, 2F
→
03/13 15:11, , 3F
03/13 15:11, 3F
→
03/13 15:20, , 4F
03/13 15:20, 4F
→
03/13 15:22, , 5F
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
03/13 16:03, 9F
→
03/13 16:04, , 10F
03/13 16:04, 10F
→
03/13 16:07, , 11F
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
03/13 16:13, 15F
→
03/13 16:14, , 16F
03/13 16:14, 16F
→
03/13 16:15, , 17F
03/13 16:15, 17F
→
03/13 16:16, , 18F
03/13 16:16, 18F
→
03/13 16:19, , 19F
03/13 16:19, 19F
→
03/13 16:23, , 20F
03/13 16:23, 20F
→
03/13 16:23, , 21F
03/13 16:23, 21F
→
03/13 16:25, , 22F
03/13 16:25, 22F
→
03/13 16:27, , 23F
03/13 16:27, 23F
※ 編輯: adrianshum 來自: 91.240.192.5 (03/13 16:36)
→
03/13 16:42, , 24F
03/13 16:42, 24F
→
03/13 16:53, , 25F
03/13 16:53, 25F
→
03/13 17:00, , 26F
03/13 17:00, 26F
→
03/13 17:07, , 27F
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
03/13 17:18, 30F
推
03/13 17:42, , 31F
03/13 17:42, 31F
→
03/13 17:47, , 32F
03/13 17:47, 32F
→
03/13 17:53, , 33F
03/13 17:53, 33F
→
03/13 17:56, , 34F
03/13 17:56, 34F
→
03/13 17:59, , 35F
03/13 17:59, 35F
→
03/13 18:29, , 36F
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
03/17 08:37, 43F
→
03/17 08:39, , 44F
03/17 08:39, 44F
→
03/17 10:25, , 45F
03/17 10:25, 45F
→
03/17 16:32, , 46F
03/17 16:32, 46F
→
03/17 16:35, , 47F
03/17 16:35, 47F
→
03/17 17:21, , 48F
03/17 17:21, 48F
→
03/17 17:57, , 49F
03/17 17:57, 49F
→
03/17 18:35, , 50F
03/17 18:35, 50F
→
03/18 09:39, , 51F
03/18 09:39, 51F
→
03/18 09:41, , 52F
03/18 09:41, 52F
→
03/18 09:43, , 53F
03/18 09:43, 53F
→
03/18 10:05, , 54F
03/18 10:05, 54F
→
03/18 10:06, , 55F
03/18 10:06, 55F
→
03/18 10:09, , 56F
03/18 10:09, 56F
→
03/18 10:09, , 57F
03/18 10:09, 57F
→
03/18 10:10, , 58F
03/18 10:10, 58F
→
03/18 10:11, , 59F
03/18 10:11, 59F
→
03/18 10:12, , 60F
03/18 10:12, 60F
→
03/18 10:15, , 61F
03/18 10:15, 61F
→
03/18 10:19, , 62F
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
03/18 10:57, 66F
→
03/18 14:18, , 67F
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
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
討論串 (同標題文章)
完整討論串 (本文為第 8 之 8 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章