- 作者: gigix 2004年05月21日, 星期五 21:20
你可以使用这个链接引用该篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=166013
在不需要重用的时候,使用transaction script
fghfgh
如果我没记错,oo不是目的,而只是一个手段,基本上传说中的"复用".
这个"transaction script"虽然看上去"不太oo",但其实在我们的某些项目,比方说无复杂逻辑等等,还是蛮好用的,起码对开发来说.但的确有service层复杂的问题,我发现了一个1k多行代码的service,唉.
hehe,tell和ask有区别吗?
在agent交互的讨论中,一个一致的结论是实际上只需要tell就能把所有东西表达出来(虽然每个基于speech-act的语言不仅仅有tell原语)。而实际上,tell也好,ask也好,或者别的什么东西,一个动作或者交互的目的都是对接收方产生影响,所谓的原语是从影响的角度来划分的。
tell或者ask和是不是oo一点关系都没有。
感觉上blog来blog去都只是些fancy words,对什么是OO都还没搞清楚。
推荐一篇Dave Thomas的文章《Tell Don't Ask》
http://www.pragmaticprogrammer.com/ppllc/papers/1998_05.html
Transaction Script是Ask方式,
而Domain Model是Tell方式——真正的OO。
去读Domain Driven Design吧,Martin Fowler,Ward Cunningham,Kent Beck等人都对它赞叹到无以复加。
我感觉大家对service的定义有点太狭义了。
我说了一万遍了,service层的目的两个:
1 一般是客户代码,随客户而变
2 一般是服务代码,封装内部模型的复杂性
在分布式程序中的一个副作用是提高效率(通过DTO)
补充一下,关于Transaction Script,Table Module,Domain Model 的选择从martin Fowler的那张图可以
看出他的选择。我没有系统的研究过三者的差异,我感觉这对的。
按照图上的含义,对于小型项目首选应该是Table Module,随着业务逻辑的复杂程度的增加Domain Model 将是首选。
在.NET环境中因为有ADO.NET类似“内存数据库”的支持使得使用Table Module很自然。
Java环境中也可以通过组合纪录集的形式实现Table Module。
对于批量类型的对象操作可以考虑Transaction Script,因为单个记录或者单个对象操作效率可能太低。
服务层本质上是facade,确实不应该包含业务逻辑。
按照你们现在的做法,业务层还不能说是面向对象,因为对象的数据和操作这些数据的行为不是封装的而是分离的。
要发挥面向对象的所有威力需要将整个Domain层对象化,行为和数据必须封装,这是最基本的,然后还要考虑分层,对业务层进行抽象等等。
你们的做法我说一个缺点,不知道你们的应用同参与者是否只有一种交互形式?比如只通过WEB。然而参与者进行业务
可能有很多种方式,拿银行来说吧,可以通过柜台,也可以通过ATM,还有电话,和网上银行。很明显这些应用后台都需要服务,而且这些服务的交互方式是不同的,也就是用例不同。所以Service层会不同,DTO会不同。但是如果我在这些
应用中都进行转账业务,那么不管我使用的是哪一种途径,
负责转账的代码都该只有一份。Service层的代码没多少复用
价值,真正需要考虑的是Domain层的复用。
领域对象不单包含实体对象,还应该包含控制对象。很明显
转账的整个操作没法划给单个对象,但是分解出的转出和转入操作还是可以作为帐户实体的方法的。
不过我感觉有人常常将领域层的控制对象同应用层的服务对象混淆。区分两者很简单,一个是不针对特定应用的,一个是针对特定应用的,也就是系统中烟囱的部分。
服务层充当的是系统中烟囱的部分,所以在不同应用中不考虑复用。或者说尽量避免进行复用,这样各应用就可以独立演化了。
可以看看下面的网站,作者的书里提到了很多如何进行
领域层开发的方法。
http://domaindrivendesign.org
是不是一些经典的模式将成为反模式?
好了好了,原来有大师支持哦们了。商业对象一定应该包含商业逻辑,只是简单封装数据库数据的算什么商业对象啊,session bean+DAO算什么OO啊。
现在还很土的用javabean,因为OO得自然。
我很早就在hibernate中文论坛说过,我反对使用DAO,因为在使用or mapping之后,不应该再有data access的概念。
只不过很惭愧的是,我的论断大多只是自己的工程做出来的一些小经验,远远无法提高到模式的地步。
service加上transaction script的问题之一就是难以重用。