Soft_Job 板


LINE

继续占版面分享少许心得。 在Python中也有类似直接指定参数的写法,如: book_preservation = BookPreservation(user_name="Jack",...) 如果这些参数只是单纯指定进去当作fields的话, 的确这样的写法就够用了:) 下面分享一下这个重构手法的第3个好处: 3. 容易因此将相关功能移入新造的class中,改善程式码分工 假设在我们的租书店程式中,在caller端有以下程式码: class PreservationChecker{ void checkPreservation( String userName, String userId, String startTime, String endTime){ BookPreservation bookPreservation = new BookPreservation( "Jack", "1433717", "2016/5/8", "2016/8/8"); if(!isInTime( bookPreservation.getStartTime(), bookPreservation.getEndTime())){ return; } // 其他动作 } boolean isInTime(String startTime, String endTime){ Calendar calendar = Calendar.getInstance(); // 检查过程 return result; } // 其他 methods } 透过上一篇文章中提到的重构手法,我们可以得到以下程式码: class PreservationChecker{ void checkPreservation( String userName, String userId, String startTime, String endTime){ TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8"); BookPreservation bookPreservation = new BookPreservation( new User("Jack", "1433717"), timePeriod); if(!isInTime( timePeriod.getStartTime(), timePeriod.getEndTime())){ return; } // 其他动作 } boolean isInTime(String startTime, String endTime){ Calendar calendar = Calendar.getInstance(); // 检查过程 return result; } // 其他methods } 以及2个根据参数关系所分离出来的class: User与TimePeriod。 接下来,因为caller端的程式码可能已经太多了, 或是在其他地方也有使用到TimePeriod的时间检查, 好比说、可能另外有个租书店用来举办活动的程式码, 用来检查今天是不是应该给客人30元优惠: class FesCoupon{ private String startTime; private String endTime; double getCouponAmount(){ if(!isInTime( this.getStartTime(), this.getEndTime())){ return 0; } return 30; } // 以下是重复码 boolean isInTime(String startTime, String endTime){ Calendar calendar = Calendar.getInstance(); // 检查过程 return result; } } 因为我们先前把BookPreservation的2个时间相关参数, 透过Extract Class,得到了TimePeriod这个class, 我们现在就可以把重复码isInTime()放进去,得到: class TimePeriod{ private String startTime; private String endTIme; boolean isInTime(){ Calendar calendar = Calendar.getInstance(); // 检查过程 return result; } } 然後、上述两个引用点就可以精简为: class PreservationChecker{ void checkPreservation( String userName, String userId, String startTime, String endTime){ TimePeriod timePeriod = new TimePeriod("2016/5/8", "2016/8/8"); BookPreservation bookPreservation = new BookPreservation( new User("Jack", "1433717"), timePeriod); if(!timePeriod.isInTime()){ return; } // 其他动作 } // 其他methods } class FesCoupon{ private TimePeriod timePeriod; double getCouponAmount(){ if(!timePeriod.isInTime()){ return 0; } return 30; } } 如此, ① 不仅消除了2个caller class当中的重复码, ② 也将isInTime()这个methods放到了与最相关的class当中(也就是TimePeriod)。 即使在支援直接指定参数写法的语言,如Python中, 也能因为这个重构手法,而获得以上2个改善的好处。 ※ 引述《leicheong (睡魔)》之铭言: : ※ 引述《ADYex (宠物狼音树)》之铭言: : : 例如,假设在一个租书店的程式中有以下程式码: : : BookPreservation bookPreservation = new BookPreservation( : : "Jack", "1433717", "2016/5/8", "2016/8/8"); : : 其中4个参数分别为 userName, userId, startTime, endTime, : : 比较好的作法是将各自相关联的参数各自包装,变成: : : BookPreservation bookPreservation = new BookPreservation( : : new User("Jack", "1433717"), new TimePeriod("2016/5/8", "2016/8/8")); : : 这个重构手法能带来的好处如下: : : 1. 提升可读性 : : 2. 未来维护简单 : : 3. 容易因此将相关功能移入新造的class中,改善程式码分工 : : 试着像这样将原作法的坏处与新作法的好处跟主管说看看吧。或是块陶。 : 这个的话还需要看在用甚麽程式语言吧. : 像在VB和C# v4+上也可以这样写: : BookPreservation bookPreservation = new BookPreservation( : userName: "Jack", : userId: "1433717", : startTime: "2016/05/08", : endTime: "2016/08/08"); : 这样写比分拆成用property设定更好. 也是你之前说的「在初始化时设定」 : 和「先全部初始化成null, 在建构完成後再设定」的差别. --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.231.166.119
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1462703532.A.A73.html
1F:→ ADYex: 虽然是用Java举例,希望这样看得懂在其他语言中的适用性 :P 05/08 18:35
2F:推 ian90911: 推 05/09 00:49







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

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

TOP