java 板


LINE

※ 引述《cyclone350 (老子我最神)》之铭言: : 先举一个例子,虽然猴大已经举过了 : 有一个 class Person : 对应 method 如下 : void setName(String name); : void setName(String name, Locale locale); : String getName(); : String getName(Locale locale); : 我们可以用如以下方式使用 : //从资源库取一个Person instance : Person person = Repository.create(Person.class); : person.setName("myNameByDefault"); : person.setName("myNameByEnglish",Locale.UK); : //把Person存取到持久层 : Repository.save(person); : 从以上来例子看...我们知道一个 Person 有名字,而且可以有多个语系的名字 : 如果我们把 getter/setter 拿掉,所有使用Person这个class的人,都需要知道 : 这个class里面复杂的架构... 但是这是不必要的,我们只要知道,Person有Name : 而且是多国语系,这样就好了。 : 这应该是 Java 语言本身就很强调的... 抽象化的概念? : 当然,如果一个class只是个data structure (或称作简单的Java bean?), : 且class里面的每一个member都必须是可以被外部class可以access的, : 我也觉得 getter/setter 在这种情况是多余的 : (这种情况意指这个class并没有做任何商业逻辑) 其实封装的最大用意 就是避免直接碰触最直接的成员 就语法跟结果 person.name="myName"; persion.setName("myName"); 两者的结果都是一样的 差别在於 对於属性name的控制权是不一样的 person.name的控制权是在於呼叫方 person.setName()的控制权变成在於Person,而呼叫方仅止於呼叫而已 以上述的例子来说 如果我想要针对name作验证的话 person.name要怎麽做验证? 验证会变成在於呼叫方要做的事 例如 String name=result.get("name"); if(name=null || name.isEmpty()){ name="no name...ha!ha!"; } person.name=name; 这样会造成person.name会混乱 因为可能第二个呼叫会改成 throw new RuntimeException("name is null or empty"); 那????? 因此person.name的控制到底要由谁来负责比较好呢 所以为了避免这个问题发生,也同时要厘清这个问题 因此 void setName(String name){ if(name == null){ throw new RuntimeException("name is null"); } if(name.isEmpty()){ name="default name is ha ha "; } if(name.find("shit") > 0){ name=name.replace("shit",""); } ...... //经过千辛万苦之後 this.name=name; } 然後可以针对setName去AOP~去外挂~可以做的事情非常多 然而权责都会在於Person身上~或是针对Person的AOP实作 前提是 void setName() 当然如果专案本身根本就不需要那些有的没的 那麽person.name就好 我自己的原则是如果范围仅限於类别本身,则不用这麽麻烦,直接呼叫就好了 但超过类别的话,则要检视是否有需要,如果看起来没有甚麽需要,还是直接呼叫就好 之後有需要AOP之类的~再用重构改善程式码就好 : : → Lordaeron:我已经说过, 我看过的PROJECT 都是一堆get/set 03/12 16:04 : : → Lordaeron:请问@f先生还要问什麽呢?CODE 又不止我写的,有问题? 03/12 16:06 : : → Lordaeron:而我往往只负责收尾,只是看到一堆GET/SET很好笑. 03/12 16:08 : L大所述 "只会一直无意义get/set很XX", : L大说法换个说法应该是说 "只会无脑写程式的人很XX" : 这种说法有点吊诡... 我们假设世界上真的有无脑的工程师 : 既然他们不会动脑,那他们职位可能就是猴大所述的"工人" : 既然不会动脑,那何来getter/setter呢? : 想必是照着leader开出的规格写的 : 所以如果真的是XX,那应该也是上面的人XX,而不是这群工人XX吧? : 就好像设盖房子一开始设计图就画错了,结果却怪罪底下的工人乱做一通一样... : 我们是软体工程师 (好啦也许只有我是...) : 我们可以根据不同的情况找出不同的解法 : 既然在某些请况真的不适合使用 getter/setter : 那可以跟当初的定规则的人讨论,提出看法或解法 : 而不是在那边说 "很可笑,很白X",不是吗? 主要还是有没有一个话事的SD比较重要 -- --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.29.29.131
1F:推 henry4343:所以有需要就加,没需要就不用加 03/13 12:24
2F:→ swpoker:对阿~但要注意就是过度开放到时要靠重构收回来~不然会乱 03/13 13:35







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

请输入看板名称,例如:Tech_Job站内搜寻

TOP