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

请输入看板名称,例如:e-shopping站内搜寻

TOP