作者tinlans ( )
看板CSSE
标题Re: [问题] 反design pattern的见解
时间Thu Feb 8 22:51:57 2007
※ 引述《ellinas (keep your faith !)》之铭言:
: 最近看到一些关於反design pattern的看法 [1]
: 其中最着名的当属Paul Graham以及Beyond Java这本书
: Paul认为 当他看到程式之中有重覆性出现时 他认为是警讯 [2]
: 因为这表示程式abstraction的程度还不够
: 才有这种类似copy的模式出现
: (当然这与copy&paste code的层次明显不同 -.-")
: 我也看过有人认为GoF的design pattern是C++的补钉大全
: 像是Visitor采用的double dispatch [3]
: 在某些程式语言直接有支援 也就不需要采用Visitor这个pattern
: 但是我忘记这是在那里看到的 有人知道这个说法的出处吗?
visitor 我印象中跟 double dispatch 没啥关系,
double dispatch 是 multimethod 的一种实现方式,
的确像是 Haskell 和 Dylan 这些语言就有支援,
主要是你希望 obja.method(objb) 这样写的时候,
实际会是哪个 method 被 call 到,
不但要看 obja 的实际型别,
还要看 objb 的实际型别才能决定,
否则你必然得在 obja 实际型别的 method 里,
写一大串 if else 搭 typeid 和 dynamic_cast 判断 objb 的实际型别才能搞定,
这个部分通常被称为 type switch,
在 C++ 的 OO 程式码里算是一大恶例。
: 版上各位对design pattern的看法又是如何呢?在实际使用方面呢?
: 我平常写程式时也常会使用一些基本的pattern
: 像是singleton, factory, visitor 但对有些pattern还是未能运用自如
: 我觉得pattern是还蛮重要的 可以把思考提升一个层次
: 学习pattern除了看书外 假如能碰到需要使用的场合
: 使用过几次 看到问题就能想到pattern
: 这方面光看书应该比较难体会 一些实务经验似乎是必需
: 版主之前有发表过关於pattern的文章 但似乎是持反对立场
: 不知道我们应该对pattern持什麽样的态度呢?
singleton 和 factory 简单来说就是防白目用的,
或是防止自己耍白痴,
team work 的时候常常有很多白目讲不听又不看文件和注解,
白话来说这两个 patterns 是预防这些状况发生的策略之一,
不过考试这样作答零分就是了,
因为它们存在的意义不只是这些,
我没讲的教科书应该都有讲了。
visitor 的话我建议是尽量少用,
它在 OO design pattern 界里面受争议的程度,
跟 procedural programming 里的 goto 差不多,
不是绝对不可以用,
也不是说用了一定会不好,
而且也的确有它有用的地方。
至於用到它的时机,
简单说就是做一些 dirty work 的时候会用到,
一般来说会伴随着实务上某些奇怪的要求,
才会让你非用它不可,
它的实现手法事实上也蛮肮脏的。
: [1] http://fcamel.twbbs.org/archives/2007/01/14/247/
: [2] http://en.wikipedia.org/wiki/Design_pattern_(computer_science)#Criticism
: [3] http://en.wikipedia.org/wiki/Double_dispatch
--
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/08 22:54)
1F:推 YuYuHo:visitor确实很dirty,乱用会让程式变得更复杂. 02/09 15:33