论坛首页 Java企业应用论坛

我与OO老师的问答(SSH与OO可以兼得吗),邀你继续...

浏览 28860 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (3) :: 隐藏帖 (4)
作者 正文
   发表时间:2011-01-13   最后修改:2011-01-13
TonyLian 写道
LS问的好! 但这个和OO有什么联系呢?

我也是这个疑问,但这个和OO有什么联系呢?

SSH里的dao,service,action,页面jsp都可以通过代码生成器生成(其实这些生成器我已实现了)

但是,当我学习到建模的时候,课程中讲述的几乎没有是对框架建模的,
什么 Service里要关联DAO,或者依赖注入。。。

而是都在讲业务建模,什么 订单类 要关联 客户类,付款通知类 要聚合付 付款详细类,等等。。。

我是不明白,这些 订单、客户、付款通知、付款明细Class,如何出现在dao,service,action,这样的体系中? 它们都是Service?都是POJO? 显然都不合适。

我还是不明白,你说的这句是什么意思?
我再说一次,订单,客户,什么明细类这些是针对领域模型的OO设计,而这些是企业业务应用的重要组成部分和抽象,做设计的时候当然首先考虑企业的OO模型。SSH这些是具体的东西,是框架,做这些就是具体的OO设计实现。框架和设计实现做得怎么样,要看一个人的水平。老师也有可能没有研究过这些框架的实现,也不知道框架的OO设计,你让他怎么给你讲?
我们来回顾一下OO:
OO原则:Abstraction(抽象)
Encapsulation(封装)
Modularity(模块化)
Hierarchy(分层)

面向对象设计五大原则
单一职责原则(Single-Resposibility Principle)。
开放封闭原则(Open-Closed principle)。
Liskov替换原则(Liskov-Substituion Principle)。
依赖倒置原则(Dependecy-Inversion Principle)。
接口隔离原则(Interface-Segregation Principle)。

Object Oriented Analysis
用面向对象方法分析问题域,建立基于对象、消息的业务模型,形成对客观世界和业务本身的正确认识。
生成业务对象的动、静态模型和抽象类。

Object Oriented Design
针对OOA给出的问题域模型,用面向对象方法设计出软件基础架构(概要设计)和完整的类结构(详细设计),以实现业务功能。
生成对象类的动、静态模型(解决域)。

你想想看,在这些框架的设计与实现中,是不是用了各种设计模式,大师们是不是用了上面这些OO的东西?

ok,大师们的太高深,我们可以暂时不去想它们。那么我们再来看看我们日常的struts,service,dao:
1.平常在jsp里面填一大堆表单,用了sturts,是不是在action类中放一个model接收这些数据,这算不算是封装?
2.我们区分action,service,dao,这是不是oo原则里的分层?
3.我们在用spring的依赖注入,比如service类中的setDao,getDao,是不是把恶性依赖转成良性依赖,是不是OO的应用?
4.我们在画时序图时,从action-->service-->dao层,是不是传递Domain Object,是不是一种依赖关系,是不是通过消息传递?那么是不是用了oo分析:建立基于对象、消息的业务模型?
5.我们在设计dao类时,是不是一个dao类只做增删改查的事情?在一个service类里,是不是只关注单个业务的一些操作?这是不是应用了单一职责的原理?
ok,当然还有很多。我就当复习和总结OO了。哈哈。
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
spring struts hibernate 本身是OOP的。 但是业务逻缉不是OOP的。想一下你怎么表达业务逻缉的。是不是:
第一步取这个数据做这样那样的运算
第二步取那个数据做这样那样的运算

然后这些放到Service和Dao里。这就是面向过程。

如果一个业务逻缉是:
第一步:给某个领域对象发消息,让它做去
第二步:给某个领域对象发削息,让它做去

这是面向对象的。领域对象里是有逻缉的,即充血。
0 请登录后投票
   发表时间:2011-01-13  
OO的最终目的就为了代码的可重用,可维护,可扩展。我想分层也是
0 请登录后投票
   发表时间:2011-01-13  
peterwei 写道
TonyLian 写道
LS问的好! 但这个和OO有什么联系呢?

我也是这个疑问,但这个和OO有什么联系呢?

SSH里的dao,service,action,页面jsp都可以通过代码生成器生成(其实这些生成器我已实现了)

但是,当我学习到建模的时候,课程中讲述的几乎没有是对框架建模的,
什么 Service里要关联DAO,或者依赖注入。。。

而是都在讲业务建模,什么 订单类 要关联 客户类,付款通知类 要聚合付 付款详细类,等等。。。

我是不明白,这些 订单、客户、付款通知、付款明细Class,如何出现在dao,service,action,这样的体系中? 它们都是Service?都是POJO? 显然都不合适。

我还是不明白,你说的这句是什么意思?
我再说一次,订单,客户,什么明细类这些是针对领域模型的OO设计,而这些是企业业务应用的重要组成部分和抽象,做设计的时候当然首先考虑企业的OO模型。SSH这些是具体的东西,是框架,做这些就是具体的OO设计实现。框架和设计实现做得怎么样,要看一个人的水平。老师也有可能没有研究过这些框架的实现,也不知道框架的OO设计,你让他怎么给你讲?
我们来回顾一下OO:
OO原则:Abstraction(抽象)
Encapsulation(封装)
Modularity(模块化)
Hierarchy(分层)

面向对象设计五大原则
单一职责原则(Single-Resposibility Principle)。
开放封闭原则(Open-Closed principle)。
Liskov替换原则(Liskov-Substituion Principle)。
依赖倒置原则(Dependecy-Inversion Principle)。
接口隔离原则(Interface-Segregation Principle)。

Object Oriented Analysis
用面向对象方法分析问题域,建立基于对象、消息的业务模型,形成对客观世界和业务本身的正确认识。
生成业务对象的动、静态模型和抽象类。

Object Oriented Design
针对OOA给出的问题域模型,用面向对象方法设计出软件基础架构(概要设计)和完整的类结构(详细设计),以实现业务功能。
生成对象类的动、静态模型(解决域)。

你想想看,在这些框架的设计与实现中,是不是用了各种设计模式,大师们是不是用了上面这些OO的东西?

ok,大师们的太高深,我们可以暂时不去想它们。那么我们再来看看我们日常的struts,service,dao:
1.平常在jsp里面填一大堆表单,用了sturts,是不是在action类中放一个model接收这些数据,这算不算是封装?
2.我们区分action,service,dao,这是不是oo原则里的分层?
3.我们在用spring的依赖注入,比如service类中的setDao,getDao,是不是把恶性依赖转成良性依赖,是不是OO的应用?
4.我们在画时序图时,从action-->service-->dao层,是不是传递Domain Object,是不是一种依赖关系,是不是通过消息传递?那么是不是用了oo分析:建立基于对象、消息的业务模型?
5.我们在设计dao类时,是不是一个dao类只做增删改查的事情?在一个service类里,是不是只关注单个业务的一些操作?这是不是应用了单一职责的原理?
ok,当然还有很多。我就当复习和总结OO了。哈哈。

说的很好啊~+1,我再来扯2句,简单说,就是一切皆对象,并不仅仅是业务逻辑是oo的~书上总拿个业务逻辑来做例子,是为了方便理解~
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
TonyLian 写道
LS问的好! 但这个和OO有什么联系呢?

我也是这个疑问,但这个和OO有什么联系呢?

SSH里的dao,service,action,页面jsp都可以通过代码生成器生成(其实这些生成器我已实现了)

但是,当我学习到建模的时候,课程中讲述的几乎没有是对框架建模的,
什么 Service里要关联DAO,或者依赖注入。。。

而是都在讲业务建模,什么 订单类 要关联 客户类,付款通知类 要聚合付 付款详细类,等等。。。

我是不明白,这些 订单、客户、付款通知、付款明细Class,如何出现在dao,service,action,这样的体系中? 它们都是Service?都是POJO? 显然都不合适。

它们都是服务于业务过程的数据。基本上是如下公式:

业务逻缉=业务过程+业务数据

业务过程和业务数据是明显分开的。这就不是面向对象,是面向过程的。
0 请登录后投票
   发表时间:2011-01-13  
综上几位的意思
1)框架内部是OO的,这个无疑
2)使用SSH框架时,只能PO(即 想充血也充不起来)

另,我认为,peterwei 最后用绿色文字说的5点,都是只是技术角度看上去的OO。
action、service、dao、domain。。。这些都是技术词汇

而gdpglc 引用的robin 的话,恰恰说明了,从业务角度看上去的OO,
如:订单、客户。。。 在SSH架构里,是没法做到充血的。

它们只能作为贫血的domain object。

我开始就是想不明白,如何在 客户Class里写 public 订单 make订单() 这样的充血方法。现在 Robin 已经给了结论——这是不可能的。

换句话说,在SSH里,死了那条心吧,业务分析时话的类图,就只当是为自己整理思路吧,进入编码阶段它们就用不上了。
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
OOA对于分析领域问题是很有效的。我觉得OOA本身并不是为了OOD和OOP存在的。在现实的需求分析过程中。第一个难点根本不是如何实现软件,而是如何理解用户的领域。这时OOA的方法论是有效的。

但是OOA的结果,如何变成实际的软件,是另一回事了。
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
gdpglc 写道
spring struts hibernate 本身是OOP的。 但是业务逻缉不是OOP的。想一下你怎么表达业务逻缉的。是不是:
第一步取这个数据做这样那样的运算
第二步取那个数据做这样那样的运算

然后这些放到Service和Dao里。这就是面向过程。

如果一个业务逻缉是:
第一步:给某个业务对象发消息,让它做去
第二步:给某个业务对象发削息,让它做去

这是面向对象的。业务对象里是有逻缉的,即充血。

你这样说行不通,举个例子:支付
service里的方法:
savePayment(Payment p){
 //我们都是调用相关service类操作
  paymentDao.save(p);
 //封装消息通知接口支付
  messageService.sendMessage(message notice);
  logService.log(...);
}

实际的支付接口方法可能是:
receiveMessage(..){
  //parse message
  userService.findAccountByUser(...);
  billService.bill(XXX); 
  accountService.save(account);  
}

这算不算:给某个业务对象发消息,让它做去?是不是面向对象?

那么具体操作的复杂逻辑肯定要一步步来,总要有个地方做。
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
TonyLian 写道
综上几位的意思
1)框架内部是OO的,这个无疑
2)使用SSH框架时,只能PO(即 想充血也充不起来)

另,我认为,peterwei 最后用绿色文字说的5点,都是只是技术角度看上去的OO。
action、service、dao、domain。。。这些都是技术词汇

而gdpglc 引用的robin 的话,恰恰说明了,从业务角度看上去的OO,
如:订单、客户。。。 在SSH架构里,是没法做到充血的。

它们只能作为贫血的domain object。

我开始就是想不明白,如何在 客户Class里写 public 订单 make订单() 这样的充血方法。现在 Robin 已经给了结论——这是不可能的。

换句话说,在SSH里,死了那条心吧,业务分析时话的类图,就只当是为自己整理思路吧,进入编码阶段它们就用不上了。


引用
客户Class里写 public 订单 make订单() 这样的充血方法。

你说的东西,一直说得不够清楚。这个是指什么?

引用
换句话说,在SSH里,死了那条心吧,业务分析时话的类图,就只当是为自己整理思路吧,进入编码阶段它们就用不上了。

为什么用不上?我就不明白。你是怎么个用不上法,你举个实例的例子来说说。

为什么一定要充血,你们说的充血是什么概念?pojo不能满足你们的需求?

引用
现在 Robin 已经给了结论——这是不可能的。

我们先不讨论robin说的结论对不对。为什么他说的就是不可能的,他是神吗?你有没有经过自已的思考?
0 请登录后投票
   发表时间:2011-01-13   最后修改:2011-01-13
peterwei 写道

service里的方法:
savePayment(Payment p){
 //我们都是调用相关service类操作
  paymentDao.save(p);
 //封装消息通知接口支付
  messageService.sendMessage(message notice);
  logService.log(...);
}

实际的支付接口方法可能是:
receiveMessage(..){
  //parse message
  userService.findAccountByUser(...);
  billService.bill(XXX); 
  accountService.save(account);  
}

这算不算:给某个业务对象发消息,让它做去?是不是面向对象?

那么具体操作的复杂逻辑肯定要一步步来,总要有个地方做。


关键是业务逻缉是由谁来做。 Service Dao是过程对象,换句话说,这只是功能的简单划分。Service和Dao都可以是单粒的,几乎没有属性,这样的对象相当于一个名子空间。


我之前说业务对象,说的不准确。我是指领域对象。比如:对于支付,会有Account,那Account就是领域对象。要让它充血才是采用了面向对象分解。


总之:
业务逻缉=业务过程+业务数据
就是面向过程的。

Java Eye有专门讨论领域模型的地方,建议多到那里看看牛人贴。
0 请登录后投票
论坛首页 Java企业应用版

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