当前位置: 首页 > article >正文

把设计模式用起来!(1)——楔

(明明学会了这个模式啊,可为什么用不起来?《把设计模式用起来》—— 这是我和清华大学出版社签约的书稿预览)

有一条编程指南讲的是,如果不需要极端的性能,那么应该在做正事前,先把事情的前置条件全检查一遍,查到一条不符合就中止。千万不要做一点事,查一点条件。

下面对话中的女生,就拥有当程序员的潜质:

“亲爱的,窗外月色如水,我们……”(做正事)

“窗帘?”(查条件)

“拉上了,我们……”(做正事)

“拉开化妆台的第2个抽屉,看看还有吗?”(查条件)

在还读不懂上面对话的年纪,我就接受过类似的教育。应该是小学二三年级的某个午后,我搭好梯子往屋顶爬,爬到一半人梯皆倒。爸爸过来修梯子,偶尔也瞄一眼地上我的,当时他说:“做事别光想成功,最好先想清楚会有几种可能,能让你躺在地上”。

所以,当几位《白话C++》(我的另一本拙著)的读者,对书中零星提到的,自然流露的、朴素的编程思想感到兴趣,问我能不能写一本《白话设计模式》时,我是有“写本设计模式的书,让读者一看就懂”的冲动,很快想到长辈的教诲,意识到一个事实:我自己的设计模式,也不是看书学会的。

好吧,我真正想表达的是:我看过优秀的讲设计模式的书,但看完后还是用不好设计模式。当时我在打工,又正好有项目开工,可我并无法在工作中用上几个设计模式。每回领导组织小会,好多人张口“观察者”闭口“职责链”,我低着头,话很少。

时光荏苒,一晃两年过去,我竟然当上技术主管; 又一晃五年过去,我竟然升职技术总监;再一晃十年光景,我有了自己的软件公司。真是十年媳妇十年婆婆,我也把读几本设计模式的书纳入考核,我也自行上阵或外面请神,一轮一轮搞培训。空调音乐、白板投影、水果可乐,大家坐以论道,一时间模式共原则一色,代码与案例齐飞……

我至今还记得下面这个案例——

“妆罢低声问夫婿,画眉深浅入时无?”

“很入时,你现在是一位时髦的太太。”

“倘若我再挂上这对耳环呢?”

“一位时髦、俏丽的太太。”

“倘若我再披上这件大衣呢?”

“一位雍容华贵却不失时髦俏丽的太太。”

“倘若我再买下这个包,拎着去商场,夫君又该怎么说?”

“一位雍容华贵、时髦俏丽,花钱如流水的太太。”

“你这不止一位太太了。”

“就一位。”

“所以,爱情是会腻的,是吧?”

“爱一人,得万千风情,何腻之有?”

小提示:这是一个虚拟案例

这个装饰器模式的例子,是好是坏并不重要。我用它示意一个事实:很多教学设计模式的案例,都是类似的,俏皮话式的假案例,离实际项目很远。

不过,那本经典的《设计模式:可复用面向对象软件的基础》(英文名称:Design Patterns: Elements of Reusable Object-Oriented Software)是一个例外,它成书于1994年,最初是某位作者的博士论文,行文严谨,读起来不轻松,但它的绝大多数案例都很真实。


 

就是在这样的一个个案例中,每个人都以为自己掌握了23个设计模式。我们把7大设计原则做成竖幅,张贴到研发大厅的墙上,也张贴在心里,各自回到座位,继续自己的开发工作。

你应该猜到我要说什么了,这种令人一听就懂的俏皮案例,它像是一种假相,掩盖了设计模式的本质困难,很多人以为自己轻松懂了,其实并不懂。我曾以两年跨度,在培训过或自学过的员工所写的二十万行的代码中查找,用上用对用好的设计模式,屈指可数。

为什么会这样?当时没去细想。现在,有人问我能否写本《白话设计模式》,我又一次思索这个问题,仍然没有清晰的答案,像极了那个阳光明媚的午后,我倒在地上望向梯子,心中发懵,明明是向上爬的工具,为何会置我以死地?

无论如何,我先否决了书名《白话设计模式》。C++语言难,设计模式难,但二者并不相同。就像教老外学汉字,使用浅显的语言讲解会有帮助;但如果要教一个懂汉字的老外如何写出《阿Q正传》这样的文章,那就不是教学用语是否浅显的问题了。

“亲爱的奥德里奇,你真的想成为英国的鲁迅吗?”

“是啊,南先生。”

“那么,让我们从近代中国的百年屈辱史讲起吧。公元1840年……”

下一节:《为什么用不好设计模式? 因为:实践不足》

http://www.kler.cn/a/294457.html

相关文章:

  • 场景解决之mybatis当中resultType= map时,因某个字段为null导致返回的map的key不存在怎么处理
  • Vue自定义指令详解——以若依框架中封装指令为例分析
  • 希尔排序(C语言)
  • Axure是什么软件?全方位解读助力设计入门
  • 【C++类型转换和IO流】
  • 计算机新手练级攻略——善用搜索引擎
  • 算法复杂度 —— 数据结构前言、算法效率、时间复杂度、空间复杂度、常见复杂度对比、复杂度算法题(旋转数组)
  • 掌握Hive函数[2]:从基础到高级应用
  • 对比测评3款BI分析工具
  • es数组包含查询
  • 『功能项目』战士的A键连击【33】
  • Java项目: 基于SpringBoot+mybatis+maven+mysql图书馆管理系统(含源码+数据库+任务书+答辩PPT+毕业论文)
  • 2024 批量下载公众号渤海小吏1千篇文章导出pdf(带留言),抓取文章标题时间链接封面阅读数分享数留言数粉丝数导出excel
  • Python测试开发---什么是单例模式
  • tomato靶场攻略
  • 基于单片机的多功能数字闹钟设计
  • 【简单】 猿人学web第一届 第15题 备周则意怠,常见则不疑
  • javaWeb【day03】---(Vue-Element)
  • python | 字符串字母大小写转换方法
  • HalconDotNet中的图像特征与提取详解
  • MATLAB算法实战应用案例精讲-【人工智能】数据元(概念篇)
  • 力扣 739. 每日温度【经典单调栈题目】
  • PyQt-Server服务器
  • 构建现代前端应用的利器:深入解析Webpack与Vite的差异与优势
  • 电脑WLan无线网连上没网络的问题解决方法
  • iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)