客户端敏捷开发之道[一]:设计模式篇

正式参加工作已逾三年,打算把工作沉淀下来的方法论整理出来,以作纪念。思来想去,还是觉得用「敏捷之道」贯穿这个系列最为合适。由于每年新沉淀的方法论,是在以往的经验基础上总结的,因此本系列文章具有一定的前后依赖关系,建议按顺序阅读。

以前实习的时候,曾听一位前辈说过:“掌握设计模式,即是忘记模式”。如果您对这句话心存困惑,那也许本文读下去是值得的。

(一)设计模式到底在什么情况下使用?

在我们学生时期,无论是编程竞赛,还是编程作业,几乎没有感觉出设计模式的意义。而进入工作岗位后,又忽然间发现它的重要性,这是为什么?

其实区别只有一个,那就是:工作以后,我们的代码要不停的改,而学生时,作业提交了,就不用再改了。

当我们设计一个复用的组件时,「下一次」调用即可不用再重写。当我们生成一个基类时,「下一次」设计类似的方案,只需要写变化的部分。事实上,无论当我们使用哪种模式还是依据各种原则做开发时,本质上都是为了「下一次」改代码做准备。所以设计模式的目标是:当需求不停的变化时,让我们可以在原有代码上,更好的适应这些变化。当我们还在学生时期时,我们的代码一次开发,提交后不再修改,此时设计模式没有任何意义,我们也感觉不到任何意义,因为没有二次开发。而当我们进入工作时,需求迭代的压力骤然袭来,此时,熟练运用设计模式便成为了我们的基本功。

总结一下,设计模式的故事就是这一句:无变化,不设计,面向变化做设计。

(二)开放封闭原则,到底在讲些什么?

开放封闭原则是Bertrand Meyer在1988年提出的,原文如下:Software entities should be open for extension,but closed for modification。事实上,开放封闭原则可以覆盖很多设计模式,因此这里想以这个原则为例,探究设计模式原则到底在说什么。

事实上,开闭原则是一个科幻原则,因为无论使用什么模式来符合这条原则,都不可能完全不对原来的代码做修改,即使最符合这个原则的模式,至少也要插入一行代码(写这段话时,忽然想到用配置文件可以做到,不过不钻牛角尖,嗯)。所以,我对这个原则有另外一个理解:

少改少错,多改多错,不改不错。之所以要说开放封闭原则,其实是想借此说明这样一个道理:设计的原则,其实是告诉我们一定要改代码时,怎样改比较好。

(三)那些设计模式,到底在讲些什么?

先说结论:每一种设计模式都对应着一种变化。

由前面我们已经知道,设计模式是用于应对变化,而设计原则又告诉我们怎样应对变化,那么设计模式最终将告诉我们应对何种变化。

例如:当我们开发弹窗时,可以预见到弹窗会有多种样式,而他们的基本行为都是差不多的,未来还会开发出其它样式的弹窗,此时工厂模式将是你的不二之选。

例如:当我们需要调用一个非常复杂的过程时,代理模式/装饰模式/适配器模式,无意是你的首选。你将以很小的成本,提供外部调用一个复杂的过程。

每一种模式都对应着一种变化,换句话说:当我们知道了要怎样变化时,才知道要用什么模式。

(四)解决变化的问题,依靠设计模式是不够的

一般来说,在我们客户端工作中,最大的问题并不是不知道要用什么模式来应对变化,而是不知道要怎么变化。甚至,连产品经理很多时候也不知道要怎样变化。因此,一个非常恐怖的问题是:

我们并不是不知道怎么应对变化,而是不知道怎么变化。

针对这个问题,我总结的方法是:

1)不对不确定需求做设计(不做过度设计)

我给过度设计的定义是,对不确定的需求做的具有一定开发工作量的设计。过度设计有两个必要条件:

1、需求不确定

2、需要一定开发成本。

如果需求确定,有一定的开发成本,也是值得的。如果需求不确定,但是几行代码可以完成,也算不上过度设计。如果竟然需求也不确定,同时还要一定开发成本,并且还要实现,那么这部分开发就可以认定为过度设计。

2)一旦确定变化趋势,对框架动态重构,不留技术债务

框架设计是一个动态的过程,旧设计无法满足新变化,出现新变化时的开发负责人就有义务对框架做重构,以满足变化需要。

其实说到底:彻底弄清楚需求,是设计好代码的前提。

整体来说,了解设计模式,以及设计模式背后的东西,是成为一个好码农的第一步。

正式参加工作已逾三年,打算把工作沉淀下来的方法论整理出来,以作纪念。思来想去,还是觉得用「敏捷之道」贯穿这个系列最为合适。由于每年新沉淀的方法论,是在以往的经验基础上总结的,因此本系列文章具有一定的前后依赖关系,建议按顺序阅读。

以前实习的时候,曾听一位前辈说过:“掌握设计模式,即是忘记模式”。如果您对这句话心存困惑,那也许本文读下去是值得的。

(一)设计模式到底在什么情况下使用?

在我们学生时期,无论是编程竞赛,还是编程作业,几乎没有感觉出设计模式的意义。而进入工作岗位后,又忽然间发现它的重要性,这是为什么?

其实区别只有一个,那就是:工作以后,我们的代码要不停的改,而学生时,作业提交了,就不用再改了。

当我们设计一个复用的组件时,「下一次」调用即可不用再重写。当我们生成一个基类时,「下一次」设计类似的方案,只需要写变化的部分。事实上,无论当我们使用哪种模式还是依据各种原则做开发时,本质上都是为了「下一次」改代码做准备。所以设计模式的目标是:当需求不停的变化时,让我们可以在原有代码上,更好的适应这些变化。当我们还在学生时期时,我们的代码一次开发,提交后不再修改,此时设计模式没有任何意义,我们也感觉不到任何意义,因为没有二次开发。而当我们进入工作时,需求迭代的压力骤然袭来,此时,熟练运用设计模式便成为了我们的基本功。

总结一下,设计模式的故事就是这一句:无变化,不设计,面向变化做设计。

(二)开放封闭原则,到底在讲些什么?

开放封闭原则是Bertrand Meyer在1988年提出的,原文如下:Software entities should be open for extension,but closed for modification。事实上,开放封闭原则可以覆盖很多设计模式,因此这里想以这个原则为例,探究设计模式原则到底在说什么。

事实上,开闭原则是一个科幻原则,因为无论使用什么模式来符合这条原则,都不可能完全不对原来的代码做修改,即使最符合这个原则的模式,至少也要插入一行代码(写这段话时,忽然想到用配置文件可以做到,不过不钻牛角尖,嗯)。所以,我对这个原则有另外一个理解:

少改少错,多改多错,不改不错。之所以要说开放封闭原则,其实是想借此说明这样一个道理:设计的原则,其实是告诉我们一定要改代码时,怎样改比较好。

(三)那些设计模式,到底在讲些什么?

先说结论:每一种设计模式都对应着一种变化。

由前面我们已经知道,设计模式是用于应对变化,而设计原则又告诉我们怎样应对变化,那么设计模式最终将告诉我们应对何种变化。

例如:当我们开发弹窗时,可以预见到弹窗会有多种样式,而他们的基本行为都是差不多的,未来还会开发出其它样式的弹窗,此时工厂模式将是你的不二之选。

例如:当我们需要调用一个非常复杂的过程时,代理模式/装饰模式/适配器模式,无意是你的首选。你将以很小的成本,提供外部调用一个复杂的过程。

每一种模式都对应着一种变化,换句话说:当我们知道了要怎样变化时,才知道要用什么模式。

(四)解决变化的问题,依靠设计模式是不够的

一般来说,在我们客户端工作中,最大的问题并不是不知道要用什么模式来应对变化,而是不知道要怎么变化。甚至,连产品经理很多时候也不知道要怎样变化。因此,一个非常恐怖的问题是:

我们并不是不知道怎么应对变化,而是不知道怎么变化。

针对这个问题,我总结的方法是:

1)不对不确定需求做设计(不做过度设计)

我给过度设计的定义是,对不确定的需求做的具有一定开发工作量的设计。过度设计有两个必要条件:

1、需求不确定

2、需要一定开发成本。

如果需求确定,有一定的开发成本,也是值得的。如果需求不确定,但是几行代码可以完成,也算不上过度设计。如果竟然需求也不确定,同时还要一定开发成本,并且还要实现,那么这部分开发就可以认定为过度设计。

2)一旦确定变化趋势,对框架动态重构,不留技术债务

框架设计是一个动态的过程,旧设计无法满足新变化,出现新变化时的开发负责人就有义务对框架做重构,以满足变化需要。

其实说到底:彻底弄清楚需求,是设计好代码的前提。

整体来说,了解设计模式,以及设计模式背后的东西,是成为一个好码农的第一步。


相关内容

  • 从企鹅客户端团队的架构演变谈项目的架构持续敏捷性 - 敏捷天地会 - KM平台
  • 从企鹅客户端团队的架构演变谈项目的架构持续敏捷性 复制链接 企鹅客户端团队经历过3代架构: 第一代,2006年以前企鹅的老客户端:客户端采用com技术,一个类达到3w行代码,为什么会有3w行代码的类,因为com结构易学难精,而且使用极其不友好,在系统内部模块之间采用这套架构维护和实现成本都很高,而项 ...

  • 敏捷开发测试规范V0.1
  • 敏捷开发测试规范(试行) 2012年9月 目录 1 概述.......................................................................................................................... ...

  • 连载之四:深度揭秘微信的敏捷开发与流程管理
  • IT海盗:这是微信的解构与建构连载的第四篇,依然干货连连,读起来激情澎湃.微信敏捷开发中的"微循环"是什么?张小龙怎样在看似"混乱"的流程管理中无招胜有招?让我们一起来享受微信连载第四篇! 点击这里查看前三篇并注意首篇开头的声明:(一)微信的诞生(二)微信的开 ...

  • 软件工程题库考试
  • 语句覆盖,又称行覆盖,段覆盖,基本块覆盖,这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了.语句覆盖常常被人指责为"最弱的覆盖",它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等.假如只要求达到语句覆盖,那么换来的确实测试效果不明显,很难更 ...

  • 一个好的庆典活动应具备五有特征
  • 每一个单位成立或组建的日子,都是这个单位最值得纪念的日子.对于每一个单位来说,在其发展过程中,通常会在其成立或组建到5年.10年或5年的倍数的年份及其日子里,搞一个大型的庆典活动来纪念. 不一样的单位或者同一个单位,因为对庆典活动所做的策划不一样,以及实施策划的效果不一样,庆典活动的效果也是大不一样 ...

  • 软件工程未来发展趋势
  • 本文的意图是讨论软件工程的未来发展趋势,但是软件工程的发展不可能是孤立的,所以我们首先需要思考一下计算模型和软件开发本身的变化和趋势,再由此推测软件工程的发展趋势. 从计算模型而言,应该来讲,传统的冯.诺依曼仍然被沿用:但从计算能力上来将,我们注意到了三个变化: ●CPU的运算能力按摩尔定律快速提升 ...

  • 软件开发方法与过程
  • (1)软件开发过程是什么?  软件开发过程是按照软件工业化的标准定义的 在软件开发中必须具有的一系列过程规范:  软件开发过程是定义在软件中的软件需求.软件 设计.软件编码.软件测试.软件部署的实现目标和规范化的管理方法论:  软件开发过程是保证软件工业化生产的法典:  软件开发过程做的是: ...

  • 软件工程作业
  • 1,简述算法.程序.软件与软件工程之间的区别和内在联系. 答: 区别:算法是对代码逻辑的整理,是一些列代码更加完整:程序是一系列代码的集合:在语言描述上,程序必须是用规定的程序设计语言来写,而算法很随意:在执行时间上,算法所描述的步骤一定是有限的,而程序可以无限地执行下去.所以: 程序 = 数据结构 ...

  • 软件过程管理
  • 软件过程基础: 1. 休哈特(shewhart):质量改进奠基人 贡献:计划-执行-检查(Plan-Do-See)的概念. 出版 The Economic Control of Manufactured Products 2. 戴明(Deming ) 1) 质量改进. 2) PDCA 循环.Demi ...