`
freemanxm84
  • 浏览: 21182 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

关于面向对象设计的疑问

阅读更多

    在面向对象设计中有两条重要原则:一,代码高度重用,避免冗余代码。这样的好处是显而易见的,代码的高度重用带来的好处很多。它可以使维护变的简单,如果程序中存在冗余代码,这段代码发生错误需要修改时,我们需要修改所有冗余的代码片,而实际中我们往往漏掉某些片段导致程序中留下BUG。二,设计短小通用的方法。我理解为一个方法只做一件事,这样做的目的就是为了让方法变得更通用,修改起来也变的容易,降低程序的耦合度。
但是,在我们程序设计的时候却往往会发现表面上这两条是相矛盾的,比如对一张表设计查询方法时,需要对不同字段进行查询,而这样的方法大部分代码看起来是一样的,只是SQL有所不同。我们或许会考虑(实际上我们已经这样做了)把所有查询放到一个方法里,而通过查询类型标志来调用不同的SQL以期到达目的。这样做达到了代码重用的效果,如果说这些不同的查询经抽象后确实就是对表的查询,这完全符合面向对象设计的思想。不过,从另一角度来思考,我们设计的方法可能功能过于强大,参数过多,代码结构也比较复杂这违背了第二条原则。

在我把以上文字写完后我已经有了答案,说明我在写之前可能还思考不够。
在我的设计中,觉得应该如下:
如果采用webwork+spring实现的话(因为我就用这种框架:)) 可以将DAO里面的方法设计为最短小的方法,而在service里面放置判断逻辑,action当然只是简单的调用service了。
就是说我将DAO里面的方法设计得短小精干通用。而降低或根本不用考虑service里面方法的可重用性(因为几乎不可能也不需要重用)。
不知道我的设计是否合理??

自我介绍下哈。我是刚从大学里毕业的学生,没多少经验,才疏学浅,望大家指教。
分享到:
评论
20 楼 icefire 2007-03-19  
个人觉得OO真的不错!
我也是个学生,一开始设计一个系统的时候,
就是用Web那种流程在设计,也首先考虑到了数据库的设计,
但是后来发现这样太被动了,业务逻辑变得越来越复杂,
更可怕的是,有的逻辑由于一些设计上的失误,竟然无法重用!
19 楼 xuni 2007-03-19  
建议看一下 敏捷软件开发:原则、模式与实践  这本书,虽然不能说这就是准则,不过看过几遍后我的收益是很大的....
18 楼 lane_cn 2007-03-19  
freemanxm84 写道
在面向对象设计中有两条重要原则:一,代码高度重用,避免冗余代码。二,设计短小通用的方法。

这两条不是原则,这是运用oo设计能够达到的一个效果,并且不是最终效果,只是一个附带效果。
我有一篇文章谈了最基本的oo设计方式,希望对你有帮助:http://www.cnblogs.com/lane_cn/archive/2007/01/25/629731.html
17 楼 yiding_he 2007-03-19  
向楼主推荐《重构》这本书。
16 楼 geutopia 2007-03-19  
  在我看来,web应用程序,用面向对象就不太合适。面试对象比较适合于,大而负责,且需求变化不大的应用,个人应用程序就比较适合。而web应用,需求变化非常之快,用面向对象,会导致逻辑复杂,维护困难,而特别稳定和复杂的部分,如数据库连接应用,已经有了很好的开源库,拿来用即可。
  在我看来,必须遵守的一条规则就是分层,简直是不变的真理。
15 楼 lelong 2007-03-18  
hermitte 写道

对,面向对象的原则是信息隐藏之类的,而不是复用。

复用是面向对象的目的,而不是面向对象的内容。我们用面向对象思想只是用来更好的复用。



还有,更简单而明确地设计系统。
14 楼 billy1770 2007-03-18  
lgx522 写道
OOP说到底是为了业务逻辑的重用。为此,我们不断地抽象,不断地解耦。代码提炼到一定程度后,便可轻松适应多种View及数据存储的变化需求。好归好,必然要付出长久的劳动。
如果体系架构确定的话(如Web+DB),那就不必如此麻烦了,采用简单直接的方式才是最好的(如LAMP)。
说的和我同感!
13 楼 lgx522 2007-02-05  
OOP说到底是为了业务逻辑的重用。为此,我们不断地抽象,不断地解耦。代码提炼到一定程度后,便可轻松适应多种View及数据存储的变化需求。好归好,必然要付出长久的劳动。
如果体系架构确定的话(如Web+DB),那就不必如此麻烦了,采用简单直接的方式才是最好的(如LAMP)。
12 楼 hermitte 2007-02-04  
bencode 写道
引用
楼主说:

在面向对象设计中有两条重要原则:
1.代码高度重用,避免冗余代码
2.设计短小通用的方法。



这不是面向对象设计的原则..面向对象设计的基本原则, 像 SRP OCP LSP DIP ISP 等等 才算吧, 而设计模式就是这些基本原则的体现



对,面向对象的原则是信息隐藏之类的,而不是复用。

复用是面向对象的目的,而不是面向对象的内容。我们用面向对象思想只是用来更好的复用。

11 楼 bencode 2007-02-04  
引用
楼主说:

在面向对象设计中有两条重要原则:
1.代码高度重用,避免冗余代码
2.设计短小通用的方法。



这不是面向对象设计的原则..
面向对象设计的基本原则, 像 SRP OCP LSP DIP ISP 等等 才算吧, 而设计模式就是这些基本原则的体现

引用
楼主说:
但是,在我们程序设计的时候却往往会发现表面上这两条是相矛盾的,比如对一张表设计查询方法时,需要对不同字段进行查询,而这样的方法大部分代码看起来是一样的,只是SQL有所不同


嘿, 用过spring 对 jdbc 的包装吗? 你会轻松很多, 正像你所说的,只有SQL不同,那么你几乎只要写 SQL语句.

引用
楼主说:
可以将DAO里面的方法设计为最短小的方法,而在service里面放置判断逻辑,action当然只是简单的调用service了。


是否什么WEB项目,都要采用 DAO 和 Service 这种方式吗?

我在项目中就很少用 很多个DAO , 我只用了一个 PersistenceService.. 对对象进行统一的序列化管理..

10 楼 freemanxm84 2007-02-02  
wzw9258 写道
引用:在我们程序设计的时候却往往会发现表面上这两条是相矛盾的,比如对一张表设计查询方法时,需要对不同字段进行查询,而这样的方法大部分代码看起来是一样的,只是SQL有所不同。我们或许会考虑(实际上我们已经这样做了)把所有查询放到一个方法里,而通过查询类型标志来调用不同的SQL以期到达目的。这样做达到了代码重用的效果,如果说这些不同的查询经抽象后确实就是对表的查询,这完全符合面向对象设计的思想。不过,从另一角度来思考,我们设计的方法可能功能过于强大,参数过多,代码结构也比较复杂这违背了第二条原则。

对以上查询的情况,我建议是设计一个方法把表的所有字段都查询出来,不需要区分
面向对象的设计原则一般情况下还是有很大的好处的!

可能我没把问题表述清楚。我的意思是以不同字段作为查询条件来查询,而这样的查询只是SQL有区别而已。
9 楼 wzw9258 2007-02-02  
引用:在我们程序设计的时候却往往会发现表面上这两条是相矛盾的,比如对一张表设计查询方法时,需要对不同字段进行查询,而这样的方法大部分代码看起来是一样的,只是SQL有所不同。我们或许会考虑(实际上我们已经这样做了)把所有查询放到一个方法里,而通过查询类型标志来调用不同的SQL以期到达目的。这样做达到了代码重用的效果,如果说这些不同的查询经抽象后确实就是对表的查询,这完全符合面向对象设计的思想。不过,从另一角度来思考,我们设计的方法可能功能过于强大,参数过多,代码结构也比较复杂这违背了第二条原则。

对以上查询的情况,我建议是设计一个方法把表的所有字段都查询出来,不需要区分
面向对象的设计原则一般情况下还是有很大的好处的!
8 楼 basicbest 2007-02-02  
freemanxm84 写道
basicbest 写道
面向对象设计这块,我的意见是,代码冗余就冗余吧,除非他威胁到了你的工作
还有一个,在你理解那些原则前,不要被原则匡住,那个和OO一样只是历史的产物。顺便问一句,你从哪里看见的这些原则,另外定原则的人是谁???

这两条原则在在很多地方看到过,不过最近一次看到是在《重构与模式》里面,而且我在对以前的代码重构的时候也发现这两条原则给了我很大帮助。应该还是很有道理的,不过我我想在设计中也不应该被原则限制,在没有理解的时候可以借鉴别人的成果,理解了之后再超越原则应该是比较好的方法吧,:)


这说明你知道什么叫原则 原则是人定的,既然叫原则自然有有价值的地方,但是被套住就......
赫赫
7 楼 freemanxm84 2007-02-02  
fangang 写道
建议freemanxm84看看我的文章如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件中我的那个下载包(Spring-Hibernate.rar),可以很好地解决你的问题。我通过将查询条件放在对象Condition中传给DAO,DAO收到并解析Condition中的条件,就可以执行各种查询,还可以实现翻页。

fangang兄的文章我已经看过了,受益非浅。我们的项目也准备在框架内加入hibernate,不过最近产品正在推广,要真正给项目动大手术可能要等很久了,:)
6 楼 freemanxm84 2007-02-02  
basicbest 写道
面向对象设计这块,我的意见是,代码冗余就冗余吧,除非他威胁到了你的工作
还有一个,在你理解那些原则前,不要被原则匡住,那个和OO一样只是历史的产物。顺便问一句,你从哪里看见的这些原则,另外定原则的人是谁???

这两条原则在在很多地方看到过,不过最近一次看到是在《重构与模式》里面,而且我在对以前的代码重构的时候也发现这两条原则给了我很大帮助。应该还是很有道理的,不过我我想在设计中也不应该被原则限制,在没有理解的时候可以借鉴别人的成果,理解了之后再超越原则应该是比较好的方法吧,:)
5 楼 fangang 2007-02-02  
建议freemanxm84看看我的文章如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件中我的那个下载包(Spring-Hibernate.rar),可以很好地解决你的问题。我通过将查询条件放在对象Condition中传给DAO,DAO收到并解析Condition中的条件,就可以执行各种查询,还可以实现翻页。
4 楼 dennis_zane 2007-02-02  
hermitte 写道
basicbest 写道
面向对象设计这块,我的意见是,代码冗余就冗余吧,除非他威胁到了你的工作
还有一个,在你理解那些原则前,不要被原则匡住,那个和OO一样只是历史的产物。顺便问一句,你从哪里看见的这些原则,另外定原则的人是谁???


你这句话我也有同感,面向对象只是一部分,根本不是编程的全部

最近就是感觉OO思想有点力不从心了。


好PP的MM 
3 楼 hermitte 2007-02-02  
basicbest 写道
面向对象设计这块,我的意见是,代码冗余就冗余吧,除非他威胁到了你的工作
还有一个,在你理解那些原则前,不要被原则匡住,那个和OO一样只是历史的产物。顺便问一句,你从哪里看见的这些原则,另外定原则的人是谁???


你这句话我也有同感,面向对象只是一部分,根本不是编程的全部

最近就是感觉OO思想有点力不从心了。
2 楼 basicbest 2007-02-02  
面向对象设计这块,我的意见是,代码冗余就冗余吧,除非他威胁到了你的工作
还有一个,在你理解那些原则前,不要被原则匡住,那个和OO一样只是历史的产物。顺便问一句,你从哪里看见的这些原则,另外定原则的人是谁???
1 楼 hermitte 2007-02-02  
freemanxm84 写道

    在面向对象设计中有两条重要原则:一,代码高度重用,避免冗余代码。这样的好处是显而易见的,代码的高度重用带来的好处很多。它可以使维护变的简单,如果程序中存在冗余代码,这段代码发生错误需要修改时,我们需要修改所有冗余的代码片,而实际中我们往往漏掉某些片段导致程序中留下BUG。二,设计短小通用的方法。我理解为一个方法只做一件事,这样做的目的就是为了让方法变得更通用,修改起来也变的容易,降低程序的耦合度。
但是,在我们程序设计的时候却往往会发现表面上这两条是相矛盾的,比如对一张表设计查询方法时,需要对不同字段进行查询,而这样的方法大部分代码看起来是一样的,只是SQL有所不同。我们或许会考虑(实际上我们已经这样做了)把所有查询放到一个方法里,而通过查询类型标志来调用不同的SQL以期到达目的。这样做达到了代码重用的效果,如果说这些不同的查询经抽象后确实就是对表的查询,这完全符合面向对象设计的思想。不过,从另一角度来思考,我们设计的方法可能功能过于强大,参数过多,代码结构也比较复杂这违背了第二条原则。

在我把以上文字写完后我已经有了答案,说明我在写之前可能还思考不够。
在我的设计中,觉得应该如下:
如果采用webwork+spring实现的话(因为我就用这种框架:)) 可以将DAO里面的方法设计为最短小的方法,而在service里面放置判断逻辑,action当然只是简单的调用service了。
就是说我将DAO里面的方法设计得短小精干通用。而降低或根本不用考虑service里面方法的可重用性(因为几乎不可能也不需要重用)。
不知道我的设计是否合理??

自我介绍下哈。我是刚从大学里毕业的学生,没多少经验,才疏学浅,望大家指教。


简单业务的情况下,你的设计是合理的,毕竟贫血模型只是听着难听而已,能解决问题就是好办法

毕竟现在绝大多数系统都是CRUD搞定的。用不着为了复杂而复杂

相关推荐

    UML面向对象设计基础

    本书的最后章节分析了软件的这些特点,为开发者提供了关于如何有效利用软件面向对象设计优势的同时,注意并规避可能存在的问题。 #### 面向对象技术的学习与提高 作者在回答读者问题时提出,无论读者是面向对象技术...

    面向对象设计UML实践课后答案

    面向对象设计(Object-Oriented Design,OOD)是一种软件开发方法,它基于“对象”的概念,将现实世界的问题域转化为计算机程序。UML(Unified Modeling Language)是面向对象设计的一种标准化建模语言,用于可视化...

    面向对象设计理论

    面向对象设计理论是软件开发领域中的核心概念,它是一种基于现实世界中对象和它们之间交互的编程模型。这种设计方法论极大地提高了代码的可维护性、可扩展性和重用性。下面将详细阐述面向对象设计的基本概念、原则...

    面向对象分析与设计.pdf

    在面向对象设计中,设计模式如工厂模式、单例模式、观察者模式等被广泛应用于解决特定类型的设计问题。 7. 软件开发生命周期(SDLC): 面向对象分析与设计是软件开发生命周期中的关键组成部分。SDLC包括需求收集、...

    面向对象设计原理与模式(Java版)

    《面向对象设计原理与模式(Java版)》全面介绍了Java面向对象程序设计的原理和模式,帮助解决Java程序中的设计问题。此外,该书十分注重Java面向对象程序设计的每个细节,以及继承、方法、类、设计模式等在程序设计...

    23种面向对象设计模式

    面向对象设计模式是软件开发中的一种重要思想,它通过总结和提炼在软件设计过程中常见的问题和解决方案,形成了可复用的设计规范。标题提到的“23种面向对象设计模式”涵盖了设计模式的主要分类,这些模式在Java、...

    面向对象程序设计—图书管理系统设计.pdf

    面向对象程序设计可以解决这个问题,它可以带来 convenience、fastness、low expenses等优点,提高图书管理员的工作效率,减少工作量,提高读者的阅读体验。同时,面向对象程序设计也可以提高系统的可维护性、可扩展...

    面向对象设计之3_基于UML的图书管理系统的分析与设计说明.pdf

    面向对象设计之3_基于UML的图书管理系统的分析与设计说明 本资源摘要信息主要介绍面向对象设计和UML(Unified Modeling Language)在图书管理系统中的应用。面向对象设计是一种程序设计方法,强调使用对象、类、...

    面向对象系统分析与设计.pdf

    7. 设计模式:设计模式是解决问题的通用模板,它们总结了面向对象设计中常见问题的解决方案。常见的设计模式包括工厂模式、单例模式、装饰模式、观察者模式等。 8. 系统分析:系统分析阶段是理解问题和需求的过程,...

    面向对象设计原则.ppt

    例如,对于计算员工工资的问题,传统的结构化做法可能会导致大量重复代码,而采用面向对象设计,我们可以通过创建不同的员工类并让它们继承自抽象的`Employee`类,将薪金计算的责任分配给各自对应的类。这样,当需求...

    面向对象分析与设计1

    国外计算机科学经典教材-面向对象分析与设计(UML 2.0版) 简介:本书详细介绍了面向对象的分析与设计,全面探讨了面向对象概念、软件开发过程、UML和多层技术。 本书使用最常见的技术和方法,通过一个贯穿全书的...

    面向对象分析与设计UML2.0(PDF)

    详细介绍了面向对象的分析与设计,全面探讨了面向对象概念、软件开发过程、UML和多层技术。本书使用最常见的技术和方法,通过一个贯穿全书的案例分析,对面向对象的软件开发过程和使用面向对象技术的编程过程进行了...

    面向对象设计uml实践(第二版)课后题答案

    在《面向对象设计UML实践》第二版的课后题中,读者可能会遇到各种问题,如绘制特定类型的UML图,解释图中的元素含义,或者分析系统设计的问题。答案将详细解答这些问题,帮助读者深入理解UML的每个概念,并提升在...

    戏说面向对象设计原理

    面向对象设计的核心在于将问题分解为多个独立的对象,每个对象负责一部分功能,并且可以独立修改而不影响其他部分。这种设计方式与活字印刷有着异曲同工之妙: 1. **可维护性**:就像活字印刷中的文字可以单独修改...

    面向对象程序设计课程设计题目

    面向对象程序设计课程设计是一门旨在提高学生实际分析问题、编程和动手能力的课程设计。课程设计旨在引导学生学习掌握面向对象思想和 Java 编程语言,熟练运用 Java 工具,通过课程设计各个项目的综合训练。 知识点...

    门禁系统的面向对象设计 accp北大青鸟S2项目实战 参考代码

    首先,面向对象设计(Object-Oriented Design,OOD)是一种基于对象模型的设计方法,它强调将现实世界的问题域转化为计算机程序中的对象。在门禁系统中,可以识别出几个核心概念:用户、权限、门禁设备和控制策略。...

Global site tag (gtag.js) - Google Analytics