周日去找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.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...
使用gulp来架构常规的运营活动页面选择使用gulp的理由不想把珍贵的时间浪费在刷新页面上,希望可以将屏幕分成两半,公司开发服务器经常挂掉,以前的sftp的开发模式不好用TinyPng图片压缩的官网经常访问不了,希望...
微信机器人,给会员一个关注你公众账号的理由! 本插件可大大加强论坛在手机上的互动性!详细功能请看功能列表 【安装说明】 http://www.pc2015.com/thread-16968-1-1.html首次安装必看【重要!】 【演示地址1】...
- **单一职责原则**:一个类应该只有一个改变的理由。 - **开闭原则**:软件实体应当对扩展开放,对修改关闭。 - **里氏替换原则**:所有引用基类的地方必须能透明地使用其子类的对象。 - **依赖倒置原则**:高层...