周日去找sunway看他的半冰箱胶卷及扫描仪,一起吃完晚饭出来时,我想起reallike说过的一句话:不要跟sunway谈模式。于是趁机challenge了一下,结果还是比较有收获的。
关 于模式的问题我曾经跟令狐有过多次的讨论。sunway并不能算是一个严格的模式反对者,他只是反对在自己项目中采用模式。为此他举了很多的例子,基本上 我还是比较认可的。例子我就不一一列举了,有过一定的编程实践经验的人多少都会碰到类似的问题,但意识到的人并不多,我作一下大致的总结:
问 题主要表现在几个方面。
一方面是对于模式的初学者来说,很容易陷入为了模式而模式的误区。这里所指的初学者与学习设计模式的时间长短无关,而在于对设计模 式的理解上,仅仅是把所有的模式背下来是远远不够的。用我不厚道的话来说就是:“这只是一本人肉Reference”。
另一方面是这种对模式的“硬用”实 际上是低效的,因为很多时候你对某个模式的“硬用”根本就是错误的,结果必然导致在实现这一错误的“硬用”上花费很多不必要的时间,影响开发效率。
还有一 方面就是一个人对模式的“硬用”错误,在团队中开始可能还不被发觉(因为只要能用,这种潜在的问题通常是不容易发现的),随着项目的不断修改,可能到很后面才发现这里的“硬用”有问题,再来修改的代价就会很大。
最后 一 方面是在团队开发中,各人的理解各不相同,也许一个人认为应该在这里要用A模式,但另一个人却认为应该用B模式,或者一个人“硬用”的模式对另一个人理解 代码造成了不必要的障碍。
诸如此类都是sunway拒绝在项目中使用模式的合理理由,对此我基本上表示赞同。
模式的起源与其它计算机理论有 很大的不同,它源于建筑设计大师Christoph.Alexander的模式思想——甚至可以说是一种哲学思想,它与一般意义上的西方哲学有很大的不 同,而是接近于东方的古老哲学思想。在这一哲学思想中,有一个核心形容词叫做“生机勃勃”。当年GoF就是受到这一哲学思想的影响,从大量的实践经验中总 结出来设计模式的想法——他们发现在一些看上去“生机勃勃”的代码中,存在着一些共性的东西,他们对这些共性的东西加以总结,得出我们现在所知道的设计模 式。
C.Alexander在《建筑的永恒之道》一书里谈论到建筑模式语言时就说到过,同样的模式用在不同的地方,会有不同的效果,必须结合很多的方面综合考虑,唯一的原则就是要使最终的建筑具有那种生机勃勃的无名特质。
所 以,光会背模式和堆砌模式完全没有意义,因为这样的模式是“死”的,而不会是生机勃勃的。要会用好设计模式不是看几本书就能明白的,你需要在不用模式的情 况下编写大量的代码,慢慢地去体会那种对“生机勃勃”的感觉——当然你也可以说我这是经验主义,但对于编程这种事情来说,经验就是很重要的。
回 到sunway的话题上。他作为一名leader,重要的是能够让整个team高效地运作,而要达到这个目标,合理的投入产出分析是必要的。因为几乎不可 能要求整个team的所有成员都有足够丰富的经验去正确地运用模式,并且不会给别的成员带来误解,所以在他的team他的项目中使用模式带来的成本过于 高,那么不用当然比用要好。
对此,令狐也有一些相关的评论(我编辑整理过):
因为模式这个东西,不仅仅是 一个名字,还会跟环境、跟语言,跟很多东西相关。设计模式在设计时是可以作为一个名词交流的。但在实际编码的时候,绝大多数情况不会像书上的例子那样单 纯,是需要根据情况实际调整的(或者)根据需求,写出一些代码,这些代码事后可以发现跟某种模式相符。
另外还有一点,就是设计模式使用不当,很容易产生“过度设计”的问题,但是现在又没有一个有效的模式可以防止过度使用模式。
最 近看了一点《建筑的永恒之道》,总的感觉,我觉得它提到的模式,更像是一种东方文化和西方文化的杂交产物,是一种无法精确定量的东西。虽然它提到说模式必 须可以明确的表达出来。但是模式受到周围很多环境和事件的影响,很难用一个绝对教条的方法去归纳和实施。从一方面来说,模式本身可以精确定义和重现,这个 是很典型的西方哲学方法。但是,模式的应用,却受到很多外界条件的影响,甚至是一些难以描述的神秘状态的影响,同一个模式,在这个条件下应用,是合适的, 是好的,在另一个环境下,可能就变成了一个不好的,不合适的,这个又很东方化。
的确是这样,模式本身是明确的,但是应用模式的环境(包括软硬件环境和人的环境)却是千变万化的,没有经验和对“生机勃勃”的感觉是很难用好的。
也许对于小团队,一次性的项目来说,模式的“硬用”可能影响还小一些,或者会有一些好处,但是对于大团队,常变化的项目来说,为了避免模式“硬用”而完全禁用模式也不失为一种有效的管理方法。
总之我认为,模式绝对是个好东西,但不是绝对的好东西。
分享到:
相关推荐
艺术大家通常是创造出自己的套路,比如明末清初,水墨画法开始成熟,这时画树就不用勾勒这个模式了,而是一笔 下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实...
1. 单一职责原则:一个类或方法应该仅有一个改变的理由,即一个类只做一件事情。 2. 开闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 3. 里氏代换原则:所有引用基类的地方必须能透明地使用其...
3. **行为型模式**:如责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。 面向对象的分析与设计是一个复杂但非常重要的过程,...
1. 确保数据库运行在合适的优化模式下,可以通过查询optimizer_mode参数来检查。 2. 定期分析表和索引,以提供最新的统计信息给CBO。 3. 检查并调整SQL查询语句,避免在WHERE子句中使用可能导致索引无效的操作。 4. ...
第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可管理 1.1.3 可测试 1.1.4 原生可重用 1.1.5 可组合 1.1.6 无状态 1.2 软件模块的简洁定义 1.3 结论 第2章 模块化的两个方面 ...
除了截图模式的多样性,该工具还具备一些强大的辅助功能,如截图后直接对图片进行标注和编辑。在很多情况下,单纯的截图并不能完全表达我们想要传达的信息,这时,对截图进行加框、添加箭头、文字说明或者高亮等操作...
特别是在教育领域,各种现代化技术的应用正逐渐改变着传统知识的传播和技能的学习模式。在这个大背景下,“一种不用纸和墨习字的字帖”的问世,不仅仅是一种技术革新,更是对传统书法学习方法的一种现代解读。 首先...
接口隔离原则建议不应强迫客户依赖于它们不用的方法,而是应该使用多个专门的接口。依赖倒置原则要求高层模块不应依赖于低层模块,两者都应该依赖于抽象。 最后,书中通过一个适应性代码示例来演示如何将这些原则和...
有没有理由不用vi? 1.3 - vi能在多少不同的操作系统下面运行? 1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始? 1.5 - vi有其他一些可用的变种吗? 2.0 - vi入门 2.1 - 有什么游戏帮助我们学习vi吗?...
你不用担心使用 JeCat PHP Toolbox 会局限你的 系统设计 思路, JeCat PHP Toolbox 是从 高级 OOP 层次组织代码的,符合 常规设计模式的概念。因此你可以轻松地在 这些自动产生的代码上 继续开发。并且 JeCat ...
第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可管理 1.1.3 可测试 1.1.4 原生可重用 1.1.5 可组合 1.1.6 无状态 1.2 软件模块的简洁定义 1.3 结论 第2章 模块化的两个方面 2.1 运行时...
工具的使用者们可以在不引人注目的情况下,快速地从工作模式切换到游戏模式,再从游戏模式切换回工作模式,仿佛不曾有过任何分心。 对于那些对技术不太熟悉的朋友来说,“窗口透明化工具”也十分友好。安装和运行...
Yacc是一个语法分析器生成器,它处理由lex生成的token流,并根据程序员提供的语法规则进行解析,形成抽象语法树(AST)。yacc的输入文件(通常以.y为扩展名)包含上下文无关文法(Context-Free Grammar, CFG)的定义...
下载项目,其实第二步可以不用了,下载下来的代码中已经包含framework,解压即可IJKframework,拖入项目 第二步: 下载framework,拖入项目 链接: 密码: 6h64 第三步: 解压framework,拖入项目,运行项目即可 第四步...
其中,鼠标手写输入法作为近年来兴起的一种输入模式,为众多不熟悉传统键盘打字的用户带来了极大的便利,尤其是老年用户以及初学者。在这样的背景下,“文通手写输入法”应运而生,它以其独特的“绿色软件”特性吸引...
1. **免费,无插件,无广告** - 这意味着用户可以无需付费就能使用该工具,且不用担心安装额外的不必要组件或受到广告打扰,提供了纯净、安全的使用环境。 2. **程序精简,占用内存极小** - 对于那些电脑资源有限的...
从jQuery 震撼整个 Web ,至今已有十年了,我们有很好的理由一直坚持使用维护它。jQuery为用户提供了 DOM 进行操作,执行 Ajax 请求,创建动画等等,极为友好的接口。此外,与 DOM API 不同的是,jQuery 采用了 复合...
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...