电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

反模式可以如何提高编程


发布日期:2018/3/20
 

设计模式对软件开发来说很重要这一点从它在技术贸易新闻中所占的数量就可见一斑不过鑒于其在开发过程中的实用性设计模式只解决了问题的一半反模式 ― 描述对产生绝对负面结果的问题的一种常用解决方案 ― 旨在通过向 Java 程序员展示如何避免常见的 Java 陷阱来解决问题的另一半

使用设计模式重复成功策略

我在观察周界瀑布上的漂流时想起了我所了解的事情从和别人的谈话中我了解到所有成功的漂流都是从第三个狭缝的右侧过去的而且我必须快速地沖过急流以避免碰上瀑布下浅水上面的石块这些经验增强了我的信心我不再理会旋涡的危险沖进了急流的主干道

虽然我在这些模式的术语中并没有考虑到这一点我还是在使用设计模式我将自己的策略建立在那些在我之前成功地通过急流的漂流者的经验之上设计模式给予我信心使我能够通过一个原本超越我技能水平之上的急流我经常将这些相同的原理应用到编程和体系结构中;您可以通过观察一个策略反复的成功结果来学着解决给定的问题有了设计模式结果是肯定的您可以利用自己的经验观摩导师或是从书上学习专家是如何做的

我们的编程技巧中很多最重要的先进之处就是来自于设计模式模型视图控制器(ModelViewController)模式指导我们有效地分割代码在用户接口和模型之间定义一个良好的边界发布订阅(PublishSubscribe)设计模式指导我们如何在不广播事件的情况下管理它们其它的设计模式对各种 Java 框架产生了深远影响用于远程通信的代理 EJB 接口集合类Swing 框架和很多其它框架

我非常喜欢构建可重复过程从这一点来讲设计模式可以提供很多好处设计模式强迫您考虑将问题分割成分立的子问题其中有一些可以利用可重复解决方案来解决设计模式还强迫您考虑如何正式地表示和传达设计经验从而使其它人可以利用您的成果

但是设计模式还不是足够的如果您将编程问题想象成一个必须穿过的地区那么设计模式最多只是一张局部地图毕竟如果已经存在一个完美的解决方案可以满足您的需求您可能就会直接去买而不是自己构建了此外随着支持的软件不断发展基础结构 ― 地图上已有的道路 ― 也在迅速地改变局部地图可以指引您避开某些危险但不是所有危险您将必须在地图之外的地区冒险才能到达目的地那么如果迷失了方向您会怎么做呢?

使用反模式避免落入痛苦的陷阱

我在急流中调整方向时水流将我推向左边橡皮艇漂流者必须洞悉高难度急流中的危险之处我在这点上完成了要求我知道在我之前有一些漂流者漂到左边并翻了船而且我已经考虑过并在脑海中练习了解决此问题的方法经过此番准备我奋力地划浆将橡皮艇恢复到原来的方向现在我有了一步一步战胜困难的机会

下面是在反模式中考虑这个问题的方式我从一个很难的问题开始根据其它成功的解决方案我选择一个计划我的设计模式我的计划出了问题但我有所准备通过在我的急流中分析其它失败的漂流作出响应我在使用反模式因为我有所准备所以看出了问题并调整我的方法以回到正途我在重构在高难度的橡皮艇漂流和编程中从自己的错误中学习都是很有价值的但也很痛苦我更宁愿从别人的错误中学习使用这种方法我就能够试着解决通常远远超越我能力范围的问题了

Antipatterns: Refactoring Software Architectures and Projects in Crisis一书的作者这样定义了反模式

反模式是描述对产生绝对负面结果的问题的一种常用解决方案的字面形式

这里的关键词是

字面形式反模式是问题的描述而不是代码的描述这非常重要因为我们可以迅速和有效地传递消息而客户可以迅速地理解

常用如果它不是模式那它就不是反模式您必须建立几个不同的运行较差的行为实例最好是在不同的环境中这样才能使错误上升到反模式的级别

负面结果设计必须有可以观察的负面的效应

最着名的反模式 YK 向我们展示了这个激动人心的新领域的危机和出路回想起以前成千上万的开发者将日期编码成两位数字而不是四位数字错误地比较这些数字就会导致数以万计的错误很多杰出的研究者都预言这个问题将会泛滥成灾但是经过人们对问题的深入研究新的标识和重构技术已经很有效地修正了代码以至于很少有人会碰到预言中那么多的问题反模式类似于设计模式是重复使用的解决方案区别在于反模式有负面结果当您为反模式做文档时您将希望获取至少下面这些元素

名称有时候反模式可能已经有一个或多个非正式的名称这是由开发社区给出的其它情况下您就会希望自己选择一个名称这个名称应该具有描述性而且要简单

问题问题描述了反模式有缺陷的解决方案以及驱使开发者走向有缺陷的解决方案的推动因素这个描述指导其他人如何找到问题

重构的解决方案反模式有用的范围是可以帮助我们从陷阱中解脱出来或者完全避免这些陷阱重构的解决方案是指导其它人如何修正问题的指南

其它成功使用反模式的行业

很多其它行业 ― 最值得注意的是制造业 ― 使用某种形式的反模式通常都是与设计模式相结合使用当前的制造业者不遗余力地效仿其它同行成功的过程改进例如即时(JustinTime)设计模式即时制造是一种过程它允许用减少库存和快速修正来解决质量问题从而提高质量过程中每个连续的步骤都使用由前一步即时递交的装配件所有主要的汽车制造业者现在都使用这种技术制造业者还采用了其它设计模式进行装配组织测试以及数据收集最好的制造业者并没有在这里停滞不前他们还认识到对发现系统过程故障的需求类似于 Zero Defects 和 Quality Circles 这样的程序让车间中的蓝领工人周期性地花一点时间讨论系统过程问题以及如何尽可能地防止问题出现一般的程序都能够为雇主节省大量维护所需的时间行业中反模式的其它示例还包括

保健行业研究者在这里查找和发布不良的饮食习惯然后好的医生会使用这些信息来指导病人如何改变引起疾病的根源而不仅仅是症状

法律执行警官在这里与社区合作确定和预防治安不良地区中的犯罪根源这些程序可以显着地减少毒品服用和暴力犯罪的情况

出版行业经过十多年对作者的忽略之后最成功的出版商再次与作者以紧密地伙伴关系相互合作这种伙伴关系有助于作者确定和改正不良写作习惯从而写出更好的书最成功的技术读物出版商就使用这种方法而其它出版商正在效仿

Java 语言中反模式的示例

如果反模式在其它行业中都很成功的话那么程序员能不能也从中受益呢?我相信程序员能得到的还不止这么多作为程序员您如果想成功只需要快速地识别出常见的陷阱就可以了软件开发所使用的是一套难以置信的相反的工具语言方法和策略让我们回头想想地图的类推不同情况下的问题稍有不同您需要具有归纳知识并将其转用到其它情况的能力这样才能成功设计模式倾向于定位在特定问题域上而反模式就可以更具普遍性实际上您可能犯的很多错误以前就已经存在了反模式有助于帮您在开发周期的早期识别出更多此类错误如果您和多数程序员一样那么花一点时间去理解当前环境中的陷阱可以为您节省大量时间和工作Java 语言的发展向我们展示了很多有关错误的示例这些错误是我们从其它编程的发展中借鑒的

早期的 EJB 实体 bean 实现慢如蜗牛一部分原因是通信开销过于高昂 经过一段时间之后人们开始认识到其中一个显着问题是往返旅程我们最终学会了使用类似于虚包的修正方法来重构这些解决方案其它开发者在 EJB 组件问世很久之前就碰到了这个问题早期个人电脑上的数据库一直为性能问题所困扰直到管理员学会了使用存储 target=_blank>存储过程将多个数据库通信巩固为一体早期的分布式系统开发者也发现了相同的问题然后发布了虚包解决方案

常见的 Java 反模式的另一个示例是魔法 Servlet这个非常基础的反模式困扰了很多相对高级的客户在这个反模式中一个单独的 servlet 将处理视图模型以及控制器逻辑这样的设计使得维护几乎不可能实现因为无论视图何时改变您都必须改变模型逻辑反之亦然魔法 Servlet 也有比 Java 语言更早的渊源此问题最常见的示例其实发生在 Visual Basic 中程序员在 Visual Basic 中经常会向一个单独的控件(如按钮)附加 K 大小的脚本

这些问题只是涉及到表面在每个新的领域中Java 开发者都会重新发现一些旧的错误而这些错误具有某种规律性如果我们抱着扫清障碍的目的研究这些陷阱就一定会免受一些痛苦

使用反模式过程

希望我已经使您相信反模式是值得注意的那么要将反模式与您每天的例行工作相结合您又可以做些什么呢?图 展示了一个过程的大体步骤它可以帮助您识别和解决反模式我在 Bitter Java一书中(请参考 参考资料)更详细地讨论了这些问题

一个基本的反模式过程中的步骤

src=http://imgeducitycn/img_///jpg border= twffan=done>

识别问题在 Java 编程中问题可能是错误性能问题难于维护的类或是不断增大的内存占用量

建立模式如果您是一名软件工程专业的学生那么您就会知道随着您不断深入开发周期修正一个错误的开销将呈指数上升当您建立问题的模式时您就给了自己在开发周期的更早阶段识别和修正更多问题的机会您的获得也将数以倍计使这个价值链向上移动的关键就在于建立模式然后尽可能广泛地根据反模式操作

重构代码在这一步中您将重构导致问题的代码这一步是一个简单的错误修正它适用于您迄今为止识别出的所有问题实例您应该花时间去做一个完整的修正而不是仅仅打一个补丁了事如果错误可能会出现在同一位置您还应该添加文档您还会希望对各个步骤作出文档从而将解决方案分发给其它人

宣传解决方案您在这里确保碰到问题的其它人懂得如何修正问题并确保可能碰到陷阱的其它人知道要避开它发布反模式可以更广泛地传播反模式的好处

修正过程您在这里构建一个隔开反模式保护性的屏障修正可以采用很多不同的方式改进测试案例可以快速地识别衰退修正每日过程或通信渠道可以在问题发生之前预防它们补充编码标准几乎能够消除某些类型的编码错误如关于放置花括号或注释的错误

这些步骤采用的方法是从特定到一般您找到错误然后建立模式修正错误最后修正过程将其中某些步骤与您的日常例行工作相结合可以使您成为更好的程序员但是请不要在这里停下来请利用您的反模式知识来修正过程继续使价值链向上移动并让您整个公司的程序员都变得更棒您还可以发布反模式帮助您甚至不认识的程序员如果您是一名程序员并且是设计模式的爱好者我保证您会发现反模式能够提供的不止这些

上一篇:线程控制动画

下一篇:多线程