锁定老帖子 主题:设计模式出现之前的几大原则
精华帖 (2) :: 良好帖 (7) :: 新手帖 (3) :: 隐藏帖 (11)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-31
chunquedong 写道 我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。
设计模式是抽象和封装变化的典型用例,难道抽象和封装不是OO的因素? |
|
返回顶楼 | |
发表时间:2010-08-31
难道你们都没看过<敏捷软件开发原则、模式与实践>,开篇前几章就是讲的这些原则。
|
|
返回顶楼 | |
发表时间: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); } } 显然,这段代码对长方形和正方形都是适用的,所以用这个例子来否定正方形继承长方形是错误的。 |
|
返回顶楼 | |
发表时间:2010-08-31
楼主把 系统分析之路 看看吧,比你这个详细,许多东西要慢慢学,而且重要的是用
|
|
返回顶楼 | |
发表时间:2010-08-31
再抽象点,其实都是面向接口编程。
|
|
返回顶楼 | |
发表时间:2010-08-31
chunquedong 写道 我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。
同意,设计模式 跟OO没有关系, 那几个设计原则是OO的 |
|
返回顶楼 | |
发表时间:2010-08-31
最后修改:2010-08-31
dsjt 写道 chunquedong 写道 我不认为“面向对象”和“设计模式”有什么直接关系。很想听听其他人怎么看。
同意,设计模式 跟OO没有关系, 那几个设计原则是OO的 确实,设计模式跟OO没有直接的关系,我文中的意思是你的OO水平达到一定程度的话,理解设计模式会变得很容易,也就是说间接的关系,况且,我也说过,23种设计模式封装了不同的变化,是抽象和封装变化的实现例子,想一下面向对象的几大因素,抽象,封装,OO仅仅是一个思想,落实到具体实现,设计模式为我们指明了一条路。 说了这么多,你可能是误解了我那句话。 |
|
返回顶楼 | |
发表时间:2010-08-31
ArdenL 写道 楼主把 系统分析之路 看看吧,比你这个详细,许多东西要慢慢学,而且重要的是用
这句话说的比较中肯,实践才能出真理,期待我真正用到以后的理解吧。 |
|
返回顶楼 | |
发表时间: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字段(没有较长边则保持不变)” 我对于这句话比较怀疑,第一,你并不知道我的代码是怎么保持长方形的,也就是我可能没有定义这个方法,而且我也没有必要去保持一定要高的长度小于宽的长度,难道我反过来就不是个长方形了吗?而且你定义这种方法的动机只是针对长方形,对于正方形根本就没有这个方法的必要,这个方法对于正方形一点意义都没有,所以,你的假设我不认同。
|
|
返回顶楼 | |
发表时间:2010-08-31
设计模式是这几大原则的具体实现
|
|
返回顶楼 | |