论坛首页 Java企业应用论坛

设计模式出现之前的几大原则

浏览 11570 次
精华帖 (2) :: 良好帖 (7) :: 新手帖 (3) :: 隐藏帖 (11)
作者 正文
   发表时间:2010-08-31  
chunquedong 写道
我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。

设计模式是抽象和封装变化的典型用例,难道抽象和封装不是OO的因素?
0 请登录后投票
   发表时间:2010-08-31  
难道你们都没看过<敏捷软件开发原则、模式与实践>,开篇前几章就是讲的这些原则。
0 请登录后投票
   发表时间:2010-08-31   最后修改:2010-08-31

长方形貌似没有定义“长方形的高小于等于长方形的宽”吧!而且长方形也没有高的概念,只是定义了较长的边为长(在没有数据的情况下,水平的那一边为长,垂直的那一边为宽),所以当长方形的边长发生变化时,就需要重新指定长和宽了。正方形继承长方形是没有问题的啊,而且针对LSP原则的那段测试代码也是错的:

public void resize(Rectangle r){
    while(r.getHeight() <= r.getWidth()){
        r.setWidth(r.getWidth() + 1);
    }
}

 暂且把height当做宽,把width当做长,应该是:

public void resize(Rectangle r){
    while(r.getHeight() <= r.getWidth()){
        r.setHeight(r.getHeight() + 1);
    }
}

 如果根据长方形定义,上面的代码对长方形而言也是错的。因为长方形每setHeight或setWidth一次都会重新计算确定把较长边的值赋给width字段(没有较长边则保持不变),会始终确保r.getHeight() <= r.getWidth() ,所以也是个死循环!结果最终的代码可能是这样:

public void resize(Rectangle r){
    while((r.getHeight() + 1) <= r.getWidth()){
        r.setHeight(r.getHeight() + 1);
    }
}

 显然,这段代码对长方形和正方形都是适用的,所以用这个例子来否定正方形继承长方形是错误的。

0 请登录后投票
   发表时间:2010-08-31  
楼主把  系统分析之路  看看吧,比你这个详细,许多东西要慢慢学,而且重要的是用
0 请登录后投票
   发表时间:2010-08-31  
再抽象点,其实都是面向接口编程。
0 请登录后投票
   发表时间:2010-08-31  
chunquedong 写道
我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。



同意,设计模式 跟OO没有关系,
那几个设计原则是OO的
0 请登录后投票
   发表时间:2010-08-31   最后修改:2010-08-31
dsjt 写道
chunquedong 写道
我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。



同意,设计模式 跟OO没有关系,
那几个设计原则是OO的

确实,设计模式跟OO没有直接的关系,我文中的意思是你的OO水平达到一定程度的话,理解设计模式会变得很容易,也就是说间接的关系,况且,我也说过,23种设计模式封装了不同的变化,是抽象和封装变化的实现例子,想一下面向对象的几大因素,抽象,封装,OO仅仅是一个思想,落实到具体实现,设计模式为我们指明了一条路。

说了这么多,你可能是误解了我那句话。
0 请登录后投票
   发表时间:2010-08-31  
ArdenL 写道
楼主把  系统分析之路  看看吧,比你这个详细,许多东西要慢慢学,而且重要的是用

这句话说的比较中肯,实践才能出真理,期待我真正用到以后的理解吧。
0 请登录后投票
   发表时间:2010-08-31  
chinpom 写道

长方形貌似没有定义“长方形的高小于等于长方形的宽”吧!而且长方形也没有高的概念,只是定义了较长的边为长(在没有数据的情况下,水平的那一边为长,垂直的那一边为宽),所以当长方形的边长发生变化时,就需要重新指定长和宽了。正方形继承长方形是没有问题的啊,而且针对LSP原则的那段测试代码也是错的:

public void resize(Rectangle r){
    while(r.getHeight() <= r.getWidth()){
        r.setWidth(r.getWidth() + 1);
    }
}

 暂且把height当做宽,把width当做长,应该是:

public void resize(Rectangle r){
    while(r.getHeight() <= r.getWidth()){
        r.setHeight(r.getHeight() + 1);
    }
}

 如果根据长方形定义,上面的代码对长方形而言也是错的。因为长方形每setHeight或setWidth一次都会重新计算确定把较长边的值赋给width字段(没有较长边则保持不变),会始终确保r.getHeight() <= r.getWidth() ,所以也是个死循环!结果最终的代码可能是这样:

public void resize(Rectangle r){
    while((r.getHeight() + 1) <= r.getWidth()){
        r.setHeight(r.getHeight() + 1);
    }
}

 显然,这段代码对长方形和正方形都是适用的,所以用这个例子来否定正方形继承长方形是错误的。

 

对于第一段代码,好像是应该改成 r.setHeight(r.getHeight() + 1);(很惊讶我当时竟然没发现这个问题)

“因为长方形每setHeight或setWidth一次都会重新计算确定把较长边的值赋给width字段(没有较长边则保持不变)”

我对于这句话比较怀疑,第一,你并不知道我的代码是怎么保持长方形的,也就是我可能没有定义这个方法,而且我也没有必要去保持一定要高的长度小于宽的长度,难道我反过来就不是个长方形了吗?而且你定义这种方法的动机只是针对长方形,对于正方形根本就没有这个方法的必要,这个方法对于正方形一点意义都没有,所以,你的假设我不认同。

 

0 请登录后投票
   发表时间:2010-08-31  
设计模式是这几大原则的具体实现
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics