`
- 浏览:
139189 次
- 性别:
- 来自:
福州
-
(下面是发在javaeye上的帖子,因为觉的还有点意思,转到blog来,关于Domain和AOSD已经有了一些新的想法)
应用Domain开发的系统,通常把逻辑放在Domain Service层中,而Domain Service做两个工作:
1. 和表现层通信,表现为把表现层的平面数据(VO)转换为相关联的Domain对象,把Domain对象计算的结果转换成平面数据(VO)返回给表现层;
2.根据Use Case完成商业逻辑的调度。
以下主要讨论Use Case的内容。
通常Use Case所描述的Business Flow分为四种:Basic Flow,Alternate Flow,Exception Flow和Extension Flow。
虽然Business Flow可能包含很多领域对象,由于每个use case的目标带有浓厚的领域逻辑,因而可以通过分析提炼出一个主domain对象。然后重组转换来自BA或者PM的BP设计文档,使其中的Basic Flow基于主domain对象,而把 Alternate Flow,Exception Flow和 Extension Flow基于其它的Domain Service和Domain Object(当然包括Util objects), 最后利用AOP把Alternate Flow, Exception Flow和Extension Flow 与Basic Flow在Service层组织起来。
使用AOP来组织Use Case时,与使用AOP组织技术问题(比如日志,权限检查和事务处理等)不同。
在AOP组织技术问题时,我们不关心join point的目标对象和目标方法以及入口参数。比如:
public class BankServiceImpl implements BankService{
public void transfer(UserAccount src, UserAccount dist,
BigDecimal amount)throws Exception{
src.subtract(amount);
dist.add(amount);
}
//Other code goes here
}
< bean id = " BankService " class = " org.
springframework.transaction.interceptor.TransactionProxyFactoryBean " >
< property name = " transactionAttributes " >
< props >
< prop key = " transfer " > PROPAGATION_REQUIRED </ prop >
</ props >
</ property >
</ bean >
我们不关心参数,或者在一些方法重载的地方利用参数来识别区分我们的方法入口。
但当我们利用AOP来组织Use Case时我们关心目标对象和目标方法以及入口参数。因为AOP所要织入的方法是另一个Use Case是另一个Biz Flow。(这个在AOSD中显示讨论的不多,只有在12章12.4.中有提到)
比如我们要在转帐成功后发手机短信通知客户。那么在没有用AOP代码中我们这样写:
public class BankServiceImpl implements BankService{
public void transfer(UserAccount src, UserAccount dist,
BigDecimal change)throws Exception{
src.subtract(change);
dist.add(change);
SMSService.sendSMS(src, change);
SMSService.sendSMS(dist, change);
}
//Other code goes here
}
Public class SMSService {
public static void sendSMS(UserAccount user, BigDecimal change){
Long phone = user.getPhoneNumber();
BigDecimal balance = user.getBalance();
send(phone, change, belance)
}
private static void send(Long phone, change, balance){
}
}
事实用User Case的观点分析,发送短信通知是另一个use case,是转帐这个use case的extend flow。用AOP的方法应该如下:
public class BankServiceEx {
public static void notify(UserAccount src, BigDecimal change) {
SMSService.sendSMS(src, change);
}
//Other code goes here
}
public aspect BankServiceAspect {
pointcut transfer():call(void BankService.transfer(..));
after(UserAccount src, UserAccount dist, BigDecimal change) returning : transfer() && args(src, dist, change){
BankServiceEx.notify(src, change);
BankServiceEx.notify(dist, change);
}
}
这样我们完成了两个用例的分离,两个用例独立,可以重用和测试。比如上述短信通知用例其实可以被重用到其它情况如:存款,消费,以及银行分红等等。
不过可能面临一个情况是,两个独立用例的代码部分都可能用到某个对象, 那么在两个用例中可能重复一部分代码。虽然从概念上看,不应该重复(在使用用旧的方法实现时不会重复),但从不同use case看,这个重复是值得的。曾经考虑利用代码生成,直接获得Local Variable,这样可以减少重复,但是这个想法是错误的,不仅仅是实现上的困难,更重要在于,分离出的发送短信用例便绑定了转帐用例,依赖于转帐用例,而无法独立重用和测试。
这样,对象、方法以及方法参数构成了一个完整的pointcut,成为不同用例切片的共同入口,相当于一个占位符。这个时候就需要不同的用例实现人员协调好该入口。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
面向切面编程是一种编程范式,旨在将关注点分离,使程序的业务逻辑与横切关注点(如日志、事务管理、权限检查等)解耦。AOP的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和...
可以看到,采用AOP之后,日志记录和业务逻辑代码完全分开了,以后要改变日志记录的话只需要修改日志记录处理器就行了,而业务对象本身(BusinessObject)无需做任何修改。并且这个日志记录不会造成重复代码了,所有...
- **面向方面编程**:AOP通过提供一种机制来分离横切关注点,使得这些关注点可以独立于业务逻辑被管理和维护。 - **用例切片**:在AOSD中,用例被进一步细分为不同的切片,每个切片对应一个关注点,这有助于更清晰地...
通过AOP,开发人员可以更专注于业务逻辑,而将系统级关注点的实现交给侧面来处理,从而提高软件的可维护性和可扩展性。然而,AOP也并非万能,它可能会增加系统的学习曲线,且过度使用可能会导致代码难以理解和调试。...
它通过将横切关注点(如日志、事务管理、权限控制等)从核心业务逻辑中解耦出来,实现了代码的高内聚和低耦合。在传统面向对象编程中,这些横切关注点往往需要在多个类或方法中分散实现,而AOP则提供了一种集中处理...
AOP(面向切面编程)是一种编程范式,主要用于增强应用程序的功能,如日志记录、性能监控、事务管理等,而无需在核心业务逻辑中硬编码这些行为。在C#中,有许多开源AOP框架可供选择。 - **Encase**:这是一个为.NET...
面向方面的软件开发(Aspect-Oriented Software Development,AOSD)是一种编程...阅读这个文件将有助于深入理解AOSD的原理和实际应用,同时也可以了解到如何将AOP应用于SOA环境,以实现更高效、更模块化的软件设计。
- 使得开发者可以更加关注业务逻辑的变化而不是流程的复杂性。 #### 四、编辑器相关资源 **1. FCKeditor** - **简介**:FCKeditor 是一个强大的开源 HTML 编辑器。 - **特点**:支持 Web 页面中的富文本编辑,...
AOSD 提出了一种新的抽象层次——“方面”,来封装这些横切关注点,使得核心业务逻辑与系统服务逻辑可以更清晰地分离。 面向方面的编程引入了几个关键概念: 1. **方面**:方面是封装横切关注点的独立单元,它包含...
**AOP**(Aspect Oriented Programming,面向切面编程)是一种编程范式,它旨在通过将横切关注点(如日志记录、安全控制等)从业务逻辑中分离出来,从而提高代码的可维护性和可读性。以下是一些C#中的AOP框架: 1. ...
AOP允许将横切关注点与主业务逻辑分离,提高代码的模块化和可维护性。 本文探讨了将AOP概念融入MDA的扩展策略,分析了两种主要的方法:基于MOF(Meta Object Facility)的扩展和基于UML 2.0 Profile的扩展。 1.1 ...
这部分可能解释了AOP的基本概念,展示了如何使用AOP框架(如Spring AOP)来解耦核心业务逻辑,实现代码的模块化和简洁性。 7. **07_软件架构通用服务.pdf**:通用服务是指在多个应用或系统中都能复用的服务组件,如...
AspectWerkz是一个备受关注的开源项目,专为Java开发者设计,它提供了强大的面向切面编程...通过利用其提供的功能,开发者可以更加专注于业务逻辑,而不是被横切关注点所分散注意力,从而提高软件开发的效率和质量。