Soft_Job 板


LINE

推荐你看这本书,或许会对你有帮助: 无瑕的程式码 番外篇:专业程式设计师的生存之道 http://www.books.com.tw/products/0010598217 里面大概是在讲身为一个Clean Coder, 在职场中如何处理「人」方面的问题。 --- 从你的文章看起来,你对於所受到的质疑, 处理的方式好像是将参考资料直接丢给对方, 说服的理由上则是「因为大师们这麽建议」。 但Martin Fowler与Joshua Kerievsky,两本重构着作的作者, 他们在书中大量提到的是「程式码的坏味道」及其带来的可能坏影响, 同时也提到不要过度设计、以及什麽样的重构手法会带来哪方面的trade-off。 有个很重要的观念是,要根据你的程式、自己判断是否真的适合某个重构手法。 以下分享我看重构相关书籍的一些心得, 并不是说你就有这些问题(因为文章中也看不完全), 只是一些相关的心得分享~ ① Inline Temp 暂时变数并不是个绝对要移除、或是绝对要保留的东西, Martin Fowler在书中并没建议你别用暂时变数, 而是「当你发现它妨碍你的其他重构手法时,则该移除它」。 暂时变数的问题在於,当你需要Extract Method时, 会因为它的存在而需要把它透过参数传递, 因而导致坏味道「过长的参数列」。 如果没有这个问题(或其他的问题),暂时变数并不是坏事。 适当的暂时变数,可以透过命名,提升程式码的可读性。 见Introduce Explaining Variable一章。 在这个场合下,引入暂时变数反而是比较好的做法, 有时甚至需要先Inline Temp、再Extract Method,最後再把Temp Extract回来。 至於记忆体议题要看场合, 以现在的硬体来说、应该大多都不需要担心这个问题。 如果profiler的效能剖析真的指出效能瓶颈在这方面再来处理即可。 ② 工厂模式 head first design patten这本书就跟许多的设计模式书籍一样, 容易看了之後就染上模式癖,忽略了有时可以用更简单的解法处理问题。 在重构--向范式前进(Joshua Kerievsky)一书中, 就提到了如何透过许多重构手法往设计模式前进、但不过度设计的作法。 你主管说的作法,在某些情况下的确有可能是更好的作法。 工厂模式的优点在於程式码分属各自的class中、未来容易扩展, 但是也为程式带来额外的复杂度。 如果某个地方的物件创造,未来不太会出现太多的类型变种, 的确是透过switch case+Creation Methods搞定就好了。 不需要特别引入工厂模式,带来额外的复杂度。 ③ Introduce Parameter Object 「过长的参数列」的确是个明显的坏味道, 这个坏味道在重构与Clean Code(Martin, Robert C.)两本书中都有提到。 这个坏味道主要的问题在於: 1. 可阅读性降低 2. 未来维护参数/Method不易 我看不太懂你文中的set get是什麽意思, 如果是以下写法的话,在语意上会有点不一样: User user = new User("Jack"); User user = new User(); user.setName("Jack"); 後面这种写法虽然可以减少1个建构式参数, 但是语意上比较偏向是「将原本没有名字的使用者改名为Jack」。 这方面比较见仁见智,只是稍微说一下可能会有这样子的理解。 要消除过长的参数列这个坏味道, 手法在书中大概有提到了4个,包括: 1. Replace Parameter with Explicit Methods. 2. Replace Parameter with Method. 3. Introduce Parameter Object. 4. Preserve Whole Object. 你的文中最有着墨的Parameter Object与34比较有关, 也并不一定就是「建立一个物件」, 而是「将各自相关联的参数以物件包装起来」。 例如,假设在一个租书店的程式中有以下程式码: 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中,改善程式码分工 试着像这样将原作法的坏处与新作法的好处跟主管说看看吧。或是块陶。 ※ 引述《purin88 (原来我是愤怒的乡民)》之铭言: : code review时,主管说暂存变数可省记忆体,不用一直建立变数占记忆体,我就说"重 : 构"这本书作 : 者建议别这样做,我就拿下面这个"重构"作者的网址 : https://sourcemaking.com/refactoring/split-temporary-variable : 他就说这个作者有问题,说我跟他写一样出去别人 : 会笑我 : 接着,我程式有用简单工厂模式,就像head first design patten的内容一样建立pizza : 店的工厂,他又 : 说为什麽要建立抽象的pizza店,建立A pizza加盟店,B pizza加盟店,我说每间pizza店 : 产生pizza囗味,方法不同,他又说建立A pizza店,B pizza店 : 产生物件浪费记忆体,为何不用switch case判定 : 是A或B,直接写各店pizza的作法及口味,产生pizza的作法何必封 : 装在A pizza物件,或B物件中,全写在pizza这个程式中,写一个类别静态方法回传pizza : 一样的,他没看过design patten,也觉得四人帮在乱写一通,建立物件是浪费记忆体 : https://rongli.gitbooks.io/design-pattern/content/chapter1.html : https://dotblogs.com.tw/joysdw12/archive/2013/06/23/design-pattern-simple-fact : ory-pattern.aspx : 然後谈到建立物件,我是用set get的方式设置参数,他就觉得为什麽不用建构子把好几 : 个参数丢进去,我一样拿出 : https://sourcemaking.com/refactoring/smells/long-parameter-list : http://teddy-chen-tw.blogspot.tw/2014/04/3long-parameter-list-divergent-change : .html?m=1 : 重构的作者是建议参数不用丢太多,建立一个物件, : 设定物件的值,把物件丢进建构子,或方法参数中,然後我这样跟我主管说,他又说我没 : 脑袋吗 : 没办法判定这个作者有问题 : 参数本来就全丢给建构子,让建构子去塞,即便 : 参数很多也没关系,说我物件导向没学好 : 反正一直在对我人身攻击,即使我提到重构 : 设计模式,对他来说就是烂书,作者乱写 : 请问我该如何是好? --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.231.166.119
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1462640428.A.59D.html
1F:推 wddx: 谢谢大大分享 05/08 01:32
2F:推 abc0922001: 感谢,学习了 05/08 02:06
3F:推 kwpn: 第三个案例也可选择使用builder pattern 05/08 03:40
4F:推 jyhfang: 感谢分享心得 05/08 03:46
5F:推 pest: 推认真 真的也要看code才知道 05/08 04:50
6F:推 popcorny: 这篇认真.. 给推! 05/08 07:23
7F:推 ccas: 推 ~ 05/08 07:59
8F:推 laputaflutin: 这篇吊出许多好文 05/08 09:29
9F:推 yotsuba1022: 谢谢 05/08 09:43
10F:推 frank11118: 推,好文,感谢大大分享 05/08 10:00
11F:推 wildli0422: 谢谢大大教学 又上了一课了 05/08 10:00
12F:推 siriusu: 推推推 05/08 10:28
13F:推 wentzwu: 很棒的分享, 推~ 05/08 10:44
14F:推 littlethe: 把书的知识应用在现实中的好例子 05/08 11:02
15F:推 icbruce: 感谢分享!有实例好懂好多 05/08 12:24
16F:推 wildpeanut: 推这篇,程式码的重构目标应该是可读性优先,程式码本 05/08 13:10
17F:→ wildpeanut: 来就是写给人看的,因此大家都看的懂比较重要 05/08 13:10
18F:推 silveriii: 05/08 14:30
19F:推 wxywxywxy: 推~ 05/08 14:51
20F:推 orange7986: 推 05/09 01:00
21F:推 kkk003: 没想到过第三点这种语意的问题 05/09 02:30
22F:推 Csongs: 快陶XD 05/09 09:07
23F:推 storm654321: 早上看到原PO推荐的书籍~真是本好书 05/09 17:15
24F:→ storm654321: 对於拥有不擅交际、孤僻个性的我很有帮助 05/09 17:16
25F:→ psliurt: 老实说,那样的主管,还会看这些大师的书吗? 05/10 12:54
26F:→ psliurt: 甚至有可能他连design pattern都没听过呢! 05/10 12:55
27F:推 lainhot0114: 程式写久了大多不是技术瓶颈,而是心态瓶颈 05/10 23:24
28F:推 iamian: 推 05/21 19:43







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

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

TOP