前言

以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"]

设计模式系列·王小二需求历险记(一)
设计模式系列·王小二需求历险记(二)
设计模式系列·封装、继承、多态
设计模式系列·初探设计模式之王小二的疑问
设计模式系列·Facade模式之MVC的烦恼
设计模式系列·Adapter 模式之如何优雅的使用别人的轮子
设计模式系列·类爆炸之Bridge模式
设计模式系列·工厂方法模式之 Code Review
设计模式系列·抽象工厂模式

------华丽的分割线------

0x1 不断变化的需求

需求总是在变化的”,在无数次与产品经理的”需求大战“中,小二对这句话深有体会。

这不,前些天,小二就经历了一件欲哭无泪的事情...

0x2 产品经理的需求

产品经理走到小二面前:“小二,我们需要给年会员发送短信,你多长时间能搞定?”

小二沉思了一会,拍拍胸脯:“没问题,不就是发送短信嘛。一周内搞定”。

0x3 面向过程的开发

拿到需求后,小二就快速的对需求拆分了步骤:

  1. 在数据库中获取所有的会员;
  2. 获取所有的年会员的信息;
  3. 按照注册时间排序;
  4. 依次给这些会员发送短信。

好了,需求的实现,拆分的如此简单明了,下一步就撸起袖子开始干呗!
经过一周的努力,明天终于要上线了,小二内心中满满的都是成就感。

“等等,小二,发送短信的事,需求要变一下...”
"啥?明天就上线了,你告诉我要变需求?有没有搞错?"

“小二,这个需求确实紧急,没有办法。我们除了给年会员发送短信外,还需要发送微信。你谅解下,帮帮忙,我也是确实没有办法...”
"唉,好吧,就这一次,下不为例!"

刚刚写好的812行代码,又要重新修改...

经过一个晚上10小时的加班,小二终于搞定了,代码从之前的812行变为了1300行...

项目如期上线,小二也松了口气,但最近整晚的加班确实吃不消了。

小二回过头来想想:“这产品经理每一次的需求变化,我都得更改我的整个脚本或整个函数。这样太容易出错了,有没有好点的办法,不让我这么痛苦?...”

0x4 模块化

小二忽然灵光一闪:“与其写成一个庞大的函数,为什么不把程序模块化呢?下次变化的时候,那我只需要更改我这个模块就可以了。这不是更好理解与维护吗?”

小二内心窃喜,就这么干!

于是,小二将整个发送消息的过程拆分成了不同的函数,不同的模块。

 //1、获取年会员的信息[包括mobile、email、微信号...]function get_year_vip(){}//2、按照注册时间排序function sort_year_vip(){}//3、发送消息($user_info为用户信息,$content为消息内容)function send_message($user_info,$content){}复制代码

那么,当我需要从发送短信变为发送短信和邮件的时候,我只需要更改send_message()这个函数就可以了。good job!

0x5还不够灵活

在牛人云集的公司,小二想去请教下C哥,看看有没有更好的解决办法。

听完小二的描述,C哥说到:“嗯。从一大坨代码到模块化,程序变得更好理解和维护了,不错不错。”

听到C哥的赞赏,小二高兴极了,瞬间从之前低落的心情变得彩虹满天飞。

“不过,你这个还不够灵活。”

“还不够灵活?”

“是啊。比如发送消息模块,我现在需要发送微信。但是短信、邮件的内容是字符串,微信的内容是数组。那这个send_message()函数是不是就不能用了?"

”你这么一说还真是“

”很明显,模块化可以帮你写出更加容易理解和维护的代码,但是,模块化并不能帮助你写出能应付所有变化的代码。“

”嗯...是的“

”并且,函数还有一个问题。如果有很多地方对你的函数有依赖,在使用你的函数(你或许不知道别人在使用你的函数)。那么,你对这个函数一更改,也会间接的对其他地方产生bug。这就是强耦合带来的弊端。“

”对,对!C哥说的太对了!那么,如何去解决呢?“

欲知后事如何,请关注公众号“聊聊代码”,让我们一起聊聊“左手代码右手诗”的事儿。

设计模式系列·王小二需求历险记(一)相关推荐

  1. 设计模式系列·王小二需求历险记(二)

    0x1 原文再续,书接上回 上回说到,C哥凭借自己多年的编码经验,欲传授王小二绝世武功. 让我们书接上回. 0x2 来源于生活中的实例 看着王小二求知若渴的眼神,C哥开始对小二循循善诱. " ...

  2. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  3. JavaScript设计模式系列四之外观模式(附案例源码)

    文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什么还 ...

  4. 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式(转载)

    源地址:http://doc.chinaunix.net/python/200703/202210.shtml 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式 ...

  5. 子慕谈设计模式系列(二)——设计模式六大原则

    六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 前言 设计模式不容易用文字描述清楚,而过多的代码,看起来也让人摸不到头脑,加上词语或者文字描述的抽象感,很容易让 ...

  6. 【设计模式系列24】GoF23种设计模式总结及软件设计7大原则

    设计模式总结及软件设计七大原则 设计模式系列总览 前言 软件设计7大原则 开闭原则(Open-Closed Principle,OCP) 里氏替换原则(Liskov Substitution Prin ...

  7. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

  8. Java/Android 设计模式系列(7)--装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  9. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

最新文章

  1. R语言jitter函数为数据添加噪声(noise)扰动信息实战
  2. bash: 未预期的符号 `( 附近有语法错误_鲜鲜历史丨石榴:好吃颜值高,还是个文化符号...
  3. udp java_Java实现Udp网络编程
  4. [SIR数据集实验][2]Java类数据集相应工具使用的小经验
  5. [Java基础]函数式接口
  6. 【Python3】POP3协议收邮件
  7. python爬虫循环表格xpath_python爬虫数据解析之xpath
  8. linux内核nasm,在x86汇编代码,NASM,Linux中操作字符串
  9. centos的ftp和smb被防火墙挡住了
  10. 1.Spring——七大主要模块
  11. 软件无法安装时怎么办
  12. AI产品经理的前世今生
  13. 网易邮箱写邮件HTML转换按钮,网易邮箱帮助中心 - 写信
  14. 台式计算机 无线接收,台式机无线接收器怎么设置
  15. 自动化测试八宗罪- 读Test Automation Snake Oil的一点翻译和感想
  16. 关于iPad上百度网盘中压缩包下载不能找到的问题
  17. 华为自研操作系统Project Z曝光
  18. Windows无法访问\\xxx.xxx.xxx.xxx,提示网络错误,请检查名称的拼写
  19. html中鱼眼效果,鱼眼效果和放大效果怎么做
  20. Menu菜单,MenuBar菜单栏,MenuItem菜单项

热门文章

  1. CSS3属性animation-play-state控制动画运行或暂停的技巧
  2. 记一次数据库宕机处理
  3. java 强制下线_【java】如何强制app端强制下线?
  4. 论文工具 | 翻译神器
  5. 计算机硬件存储器,个人计算机的存储器系统 说说内核与计算机硬件结构(5)
  6. linux下git修改密码后无法使用,git push后账号密码输出错误和修改
  7. Feign-自定义配置
  8. Nginx反向代理之proxy_pass指令
  9. 什么时候用不到索引?
  10. leader选举的源码分析-QuorumPeer.start