重构中对设计模式的反思

    什么是设计模式?

      每一类编程语言都具有其自身的特性,就像是面向对象的语言,其特性就是封装,继承,多态,抽象. 同时,使用每一类编程语言开发软件时也都有一些设计准则,这些准则保证了软件的质量,即具有良好的设计.

   

    而设计模式则是广大软件开发人员总结出的开发经验技巧,它们利用编程语言的特点,实现这些准则.因此,可以想象,当我们对设计模式熟悉到一定程度后,在设计系统时,我们眼里就会变得没有设计模式,只有设计准则,真正达到手中无剑,心中有剑的境界。

   
在学习设计模式时,究竟要学什么?

        

      
以前,在开始这个阶段学习的时候,有童鞋问过我,这么多东西,究竟要学什么?  学习什么,还要看这个东西是用来做什么的,当然是主要学习这个模式主要解决了什么问题。

    在设计模式的书中,我们会看到一个名为"意图"的部分。意图是什么?这里,这个意图回答了如下问题:

       1,设计模式是做什么的?

       2,它的基本原理和意图是什么?

       3,它解决的是什么样的特定设计问题? 

     但是许多设计模式的意图部分都没有说明模式解决的主要问题,更多的描述的模式是做什么的,怎么用。

  为什么要着重理解设计模式解决了什么问题呢? 因为模式之所以 存在,就是为了解决问题,所以要了解在某种情况下模式是否真的有所帮助,必须了解它们有助于解决什么问题。

    其次学习的才是它是如何解决问题的。可是很多人上来估计都本末倒置了,上来就学它怎么解决问题的,忽略了最简单最重要的东西。

  
应用设计模式中容易出现哪些问题?

  

 

在学习设计模式后,作为初学者,容易出现两个问题:

      1,过度设计:代码的灵活性和复杂性超出所需。

 

    有些程序员之所以这样做,是因为他们相信自己知晓未来的需求。他们推断,今天就把设计方案设计的更灵活,以适应明天的需求。但是,如果预计错误,这可是个巨大的浪费。造成了“用大炮去打蚊子”的窘境。

 

    敏捷开发原则告诉我们,不要为代码添加基于猜测的,实际不需要的功能,如果不清楚一个系统是否需要某个模式,一般就不要急于去实现它,事实上,在需要的时候通过重构去实现这个模式并不困难。(选自《大话设计模式》)

 

       2,设计不足的问题:比起过度设计,这个要常见的多。

      例如,在初次做机房收费系统时,我们重在实现功能,而忽略了系统整体的结构,如果真正做一个软件用这种方法,那么,在系统交付使用后,运维将变得异常困难,当软件变成大泥球后,我们只能去尝试重构,推倒重来了。

  如何恰当使用设计模式?

     用模式改善既有设计优于在设计早期使用模式,通过演进得到设计而不是采用大规模的预先设计,通过重构实现,趋向和去除模式,而不在设计早期使用模式。将模式的使用延迟,既避免了过度设计的问题,也对系统中设计不足进行了思考。

 

   通过逐步改进代码的设计问题,就能够逐渐嗅出代码的坏味道,发现了哪里有问题,设计的改进就成功了大部分。

                                                                                                 

                                                                                                          ——文章参考《大话设计模式》& 《重构与模式》

 

 

   

时间: 2024-10-03 08:50:53

重构中对设计模式的反思的相关文章

软件行为模型中的设计模式

Discovering design patterns in software behavior models Sandeep Mitra and T. M. Rao Department of Computing Sciences The College at Brockport, State University of New York Brockport, NY 14420 585 395-2234 smitra@brockport.edu 探索软件行为模型中的设计模式 Sandeep M

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 引言 今天是冬至,去饺子馆吃饺子,看他们店里面的水饺种类挺多,在等待中,在想是不是可以用设计模式模拟一下,生产饺子的过程,正好最近也在看工厂模式,也就现学现卖了.当然,实现的方式很多,只是一个例子而已.祝大家冬至,多多吃水饺..... 对象创建的问题? 我们应该面向接口编程而不是面向实现编程,因

[Head First设计模式]餐馆中的设计模式——命令模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

[Head First设计模式]抢票中的设计模式——代理模式

原文:[Head First设计模式]抢票中的设计模式--代理模式  系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 引言 闲着没事,终于又拿起Head First设计模式 翻了翻,脑海里也一直在想抢票

[Head First设计模式]山西面馆中的设计模式——观察者模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在我身边. 为什么观察者模式会出现呢? 为了建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统

机房收费系统重构中的一些感受

        在正式写文章之前反省一下,好久没有到CSDN上来写博客了,也就是说自己已经有一段时间学习劲头不足了.今天写这篇文章一方面是总结一下自己这半个月敲机房收费系统的一点点小的体会,另一方面就是写写刚刚实现的"运用简单工厂实现登陆权限选择"的实例.         其实重构机房收费系统这各项目已经建立两个月了,只是前一个半月由于一些未知的原因导致自己心里例假而什么都没有干.半个月前,借着家长过来的机会,米老师顺便把我的情况提了一下,顿时感觉愧疚难当,同时一股强烈的查克拉在我体内

[Head First设计模式]山西面馆中的设计模式——建造者模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 引言 将学习融入生活中,是件很happy的事情,不会感觉到累.一个感觉:很好玩!挺开心的...... 为什么会出现建造者模式? 在软件系统中,有时面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成. 这个复杂的对象的各个部分经常面临剧烈变化,但是将它们组合在一起的算法却相对稳定. 比如:建一所房子,建房子的过程基本不变

架构之坑系列1:重构中的过度设计与高可用银弹

这是一个坑系列,会说一些在系统设计.系统架构上的坑,这些都是我想到哪说到哪,有像这篇一样比较宏观的坑,后面的文章也会有到具体技术细节的(比如某个函数,某个系统调用)坑.总之,到处都是坑,这些坑有些是我经历过的,有些是听说的,你也可以留言说说你遇到的坑.   第一部分,我们从重构这个场景来看看系统架构的设计中过度设计这个坑.首先,我们这里说的重构,和<重构:改善既有代码的设计>这本书中的重构不太一样,这是本好书,他主要说的是代码级别的重构,这种重构是需要在编码的时候时时刻刻进行的,更多的是一种编

请问这是java中的设计模式吗?

问题描述 请问这是java中的设计模式吗? 请问下面的代码属于什么设计?为什么把set方法改成那样子 public class A{ private Integer num; private String min; public Integer gerNum(){ return num; } public A num(Integer num){ this.num = num; return this; } public String getMin(){ return min; } public