作者tinlans ( )
看板CSSE
标题Re: [问题] 反design pattern的见解
时间Fri Feb 9 17:20:52 2007
※ 引述《ellinas (keep your faith !)》之铭言:
: 似乎与我的认知不太一样
: 因为在GoF的书中 在visitor的实作部份有写道
: visitor要达成的效果就是double dispatch
GoF 的书中那段就我个人看来有点牵强,
不单是其它书都没有这样说的缘故,
在 syntax 上来看,
最後被呼叫的 method name 并不是一开始被呼叫的,
像是 a.foo(b) 这样 call,
最後实际上被 call 到的并非还是叫做 foo 的 method。
: : singleton 和 factory 简单来说就是防白目用的,
: : 或是防止自己耍白痴,
: : team work 的时候常常有很多白目讲不听又不看文件和注解,
: : 白话来说这两个 patterns 是预防这些状况发生的策略之一,
: : 不过考试这样作答零分就是了,
: : 因为它们存在的意义不只是这些,
: : 我没讲的教科书应该都有讲了。
: 没错 把规则写到CODE里
: 比写到文件里有用得多
: 但是还是有人会"咦 这个class怎麽没ctor 我改一下api喔" Orz
习惯上 Singleton 是把 ctor 放在 private,
并在上面放上一段注解,
这样就只有 class 本身能 new 出自己的 obj,
而不是不写出来,
都做到这样还有人耍白目硬要乱改,
而且大家都纵容这种行为的话,
建议上是换一家公司比较好。
: compiler实作时有时需要爬很多树
: 像AST, IL等 也算是visitor最典型的用法
GoF 在这方面的例子其实举得不好,
Visitor 实务上是想对「稳定的 class hierarchy」加入新行为,
但是「不想透过继承的方式扩充 (就是不动 class hierarchy)」时,
才会被拿来使用。
现代的 compiler 不会这样子做,
因为现在流行同一套 compiler 能吃不同 language,
变成统一的 AST 以後再用统一的方法玩东玩西,
所以反而是 class hierarchy 常要更动,
但是对操作行为本身而言却始终是一致的,
结果就是单纯拿 Composite 和 Iterator 做 AST 而已,
最佳化也都是摆上一群 Template Method 和 Strategy 搭上去玩,
这也不单纯是为了方便做论文 (套不同演算法生数据用),
也方便 user 在做 performance tuning 的时候,
可以在 compiler options 上选自己爽选的来 try,
找出最王道的编译参数。
: 不知道大大指的的dirty work是指什麽 可以给个明确的例子吗
: 这方面经验不多 还请大大指教
其实就跟上面讲的一样,
如果原本的 class hierarchy 很成熟完善,
然後上面的人对你做了些奇怪的要求,
希望你不去动到它的结构就能搞定;
另一个奇怪需求是「编译时间」,
有些软体系统很肥大,
你不用 Visitor 直接去改,
重编相关的东西就要等 20 分钟,
这样写程式的人会受不了,
是学校研究生的话八成都跑去打电动打超过 20 分钟的好几倍才会回来看编好了没,
这时候也可能会考虑拿 Visitor 来用。
一般 C++ programmer 还会利用一种叫 compiler firewall (又叫 pimpl) 的技巧,
来缩短更动实作细节时所需的重编译时间,
某些时候利用这种技巧可以省下跟用 Visitor 相同的编译时间,
这时就不需要刻意去使用 Visitor。
: 昨天又想了一下 想到「人月神话」中的no silver bullet
: 软体的问题有2种
: 一种是Essential Difficulties 另一种是Accidental Difficulties
: 像是design pattern解决的算是因为工具选择所带来的Accidental Difficulties
: 还是软体本来就需要套用pattern?
pattern 不是没写过程式的人一开始需要学的,
而是要先写过很多结构烂烂的程式,
自己认真思考过怎样改比较好一段时间後,
才适合开始去学来用的东西。
对於撰写需要抽象化的程式部分来说,
比较没经验的,刚下手一定是结构紊乱的程式码,
稍有经验的,刚下手会是比较有规律性,但欠缺抽象化的程式码,
很有经验的,一下手可能就是很抽象化的程式码,但不是任何已知的 pattern,
超有经验的,一下手通常就会是 pattern。
一下手就是 pattern 是长期实务经验累积而来的一种直觉,
而不是出於「一定要把某某 pattern 套某某程式码」的心态,
因为下手的时候会知道以前写过类似的东西,
但是写到後来一定会发生某某问题,
然後哪边要改来改去搞来搞去,
搞到後来一定会乱成一团,
然後曾经 try 过几种方法做抽象化结果都不是很好,
最後发现某某 pattern 刚好很好用,
基於这样的经验才会一下手就是 pattern,
但是这少说也得写过 20 年程式才有可能办到。
所以 pattern 书籍的序言应该补一句类似叔叔是有练过的小孩子不要乱学这类话,
请读者先多练练基本功再来实际用这些东西会比较好。
--
Name: Tseng, Ling-hua E-mail Address:
[email protected]
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
https://it.muds.net/~uranus
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.217.38
※ 编辑: tinlans 来自: 61.230.217.38 (02/09 17:29)
1F:推 deepkh:推一下 :) 05/02 20:06