面向切面(AOP)"与"面向对象(OOP)

AOP【面向切面编程】 文章目录AOP介绍AOP术语AOP的实现方式 AOP介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming),面向对象编程的补充和完善。   面向切面编程是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。常见的使用场景: 日志 事物 数据库操作 面向切面编程,... 阅读详情
"面向切面(AOP)"与"面向对象(OOP)"

(原来是按照原作者的格式分了4篇,现在整理了一下.合并为一篇. --译者注)


首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能 优雅 解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.

作为一个使用OOP多年的人来说,当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题时,我觉得应该去探个究竟了.对两种技术的比较最能给我们实际应用提供见解.这里我设计了一个例子:一个OOP应用,其中某些方面适合使用AOP.

本文展示了一个简单的例子.一开始介绍了问题域,然后分别给出OOP与AOP的解决方案.后者使用了 JDK5.0,JUnit,和AspectWerkz.最后说明如何编写代码.读完本文后,我希望你能知道AOP到底是什么,解决什么样的问题.(由于作者在后面AOP的例子中使用了Java5.0的批注(Annotation),建议读者先有所了解. -- 译者注).

问题域描述
一个软件公司雇佣一个程序员,指定给他一个业务部门并要求他随时向经理报告.当团队成员完成他们的目标时,经理会给他们相应的奖金.公司所需要的方案必须能够增加一个新的雇员并给当前的员工增加奖金.为了方便,我们用CSV文件存储数据.


图1 解决方案模型

类Manager(经理)继承自类Employee,包含一个额外的属性,Managing Project.一个部门可能包含很多员工.多个部门构成了公司.暂不考虑公司这样的一个类,因为它在问题域之外.

解决方案设计
以下流程图描述了解决方案设计.


图2 对象之间的交互(增加一个新的员工,指派给他一个部门和经理)

出于简单的考虑,本文只关注必需的细节.当然你也可以深入代码得到你想要的其他信息.
[link]http://www.devx.com/assets/sourcecode/13172.zip[/link]
EmployeeServiceTestCase,一个JUnit测试用例,模拟一个最终用户,创建新员工记录,指派部门和经理.它获取所有可用的部门和经理数据并显示在图形界面上.为了实例化域对象BusinessUnit和Manager,获得的记录将传递给工厂类.之后,通过给EmployeeService传递一个引用来创建一个Employee对象.这个服务类使用EmployeeFactory创建对象,并把这个对象传给EmployeeRepository 来进行持久化操作.

应用程序中需要面向哪些"切面"
到目前为止,对模型和设计的讨论还限于一个较抽象的层面.现在,我转向这个应用的其他方面 - 这对理解AOP的价值至关重要.

操作所需的资源
  1. public static Set findAllBusinessUnits() throws RepositoryException {
  2. Set businessUnits = new HashSet();
  3. try {
  4. FileReader businessUnitFile = null;
  5. BufferedReader bufferedBusinessUnitFile = null;
  6. try {
  7. businessUnitFile = new FileReader(FILE_NAME);
  8. bufferedBusinessUnitFile = new BufferedReader(businessUnitFile);
  9. String businessUnitRecord;
  10. while((businessUnitRecord = bufferedBusinessUnitFile.readLine()) != null) {
  11. BusinessUnit businessUnit = BusinessUnitFactory.createBusinessUnit(businessUnitRecord);
  12. businessUnits.add(businessUnit);
  13. }
  14. } finally {
  15. if(bufferedBusinessUnitFile != null) {
  16. bufferedBusinessUnitFile.close();
  17. }
  18. if(businessUnitFile != null) {
  19. businessUnitFile.close();
  20. }
  21. }
  22. } catch(IOException ioe) {
  23. String message = "IOError. Unable to find Business Unit records";
  24. logger.log(SEVERE, message, ioe);
  25. throw new RepositoryException(message, ioe);
  26. }
  27. logger.log(INFO, "Manager Records returned:" + businessUnits.size());
  28. return businessUnits;
  29. }

上面的代码通过FileReader和BUfferedReader来读取CSV文件中的业务数据.
应用程序 重复地 从资源文件中 取得数据 然后在操作 完成后释放 .我们会发现:去掉程序的这两个"切面"将提高代码的可读性并达到一个更好的设计,因为去掉这些"多余"的东西,剩下的代码才是这个方法真正的精髓.这个方法的作用是读取业务单位数据.所以不应该也不需要去知道"如何获取和释放资源以及这个过程中出现的异常"这个"切面".同样地,使用AOP处理异常也变得不同.(后面将详细介绍)

持久层
传统的OOP使用仓库类(repository classes)来打理应用程序的持久层.即: 
  1. public class EmployeeRepository {
  2. public static void createEmployee(Employee employee) throws RepositoryException {
  3. //使用print writer把数据放入csv文件
  4. }
  5. public static String findEmployeeRecordById(String id) throws RepositoryException {
  6. //使用file reader来获得指定id的员工数据
  7. }
  8. public static Employee findEmployeeById(String id) throws RepositoryException {
  9. //使用该方法获取员工数据,Employee对象由工厂类创建
  10. }
  11. public static void updateEmployee(Employee employee) {
  12. //更新员工数据
  13. }
  14. }

类EmployeeService 使用一个仓库类给应用中相关雇员提供服务,在一个企业应用中,从域模型(domain model)中去掉持久层代码是一种设计上的改进.模型设计者和程序员就可以关注各自的业务逻辑和持久层处理.后面你将会看到如何通过AOP来达到这样的效果.

日志
删除用于调试的日志代码将会极大地改进代码的可读性.考虑下面的代码片断:
  1. public Employee createEmployee(String name,
  2. String contactNumber,
  3. BusinessUnit businessUnit,
  4. Manager manager)
  5. throws EmployeeServiceException {
  6. String id = createNewEmployeeId();
  7. Employee employee =
  8. EmployeeFactory.createEmployee(id, name, contactNumber, businessUnit, manager);
  9. try {
  10. EmployeeRepository.createEmployee(employee);
  11. } catch(RepositoryException re) {
  12. String message = "Created employee successfully:" + employee;
  13. logger.log(SEVERE, message);
  14. throw new EmployeeServiceException(message, re);
  15. }
  16. logger.log(INFO, "Created employee successfully:" + employee);
  17. return employee;
  18. }

上面的代码里包含了一个致命错误和一个成功信息.输出日志这一"切面"同样可以移到业务模型外独立实现.

异常处理
异常处理的例子我这里不再赘述,但这节已经通过上面的代码讨论了潜在的问题.当你调用EmployeeRepository 对象的createEmployee 方法时,你可能会得到一个RepositoryException异常.传统的解决方法是,在这个类中处理.另一种方法是,当RepositoryException 异常被抛出时createEmployee 方法返回null,catch块中的其他逻辑可以在类外处理这一错误.
错误处理在不同的情况中也会不同.但是,通过AOP可以区分开每种情况.


图3

图3中描述了AOP方法的设计以及在一个更抽象的层次上类间的交互.你可以通过对比图1和图3来更好地理解AOP.
程序的目的是通过BusinessUnit对象读取CSV文件中的记录然后 填入类BusinessUnitService 中的map.使用AOP来填充这个map有点类似后门(backdoor)方法 -- 控制被委派给BusinessUnit 来读取存储介质中的记录.

AOP就是定义一些切入点(pointcut)和处理方法(advice).一个"切入点"是源代码中一个执行点.前面的例子定义了一个"切入点" --  类BusinessUnitService中的findBusinessUnits方法.一个"处理方法"顾名思义就是当执行到某个"切入点"时的一块代码.类BusinessUnitPersistentAspect 包括advice方法findAllBusinessUnits,该方法从存储介质中载入数据,然后使用工厂类创建BusinessUnit 对象.然后这个对象被加入map,map对象的引用通过BusinessUnitService 对象获得."切入点"和"处理方法"组成了所谓的"切面(Aspect)"

为了读取存储介质中的数据,OOP方法通过一个DAO类来做.而AOP中,你只要定义一个"切入点"和相应的"处理方法"来读取数据.AOP框架会以advice的形式注入代码,既可以在执行期也可以在编译期.

总而言之,当类BusinessUnitService 中的findAllBusinessUnits 方法被调用时,AOP框架会在"切入点"处注入处理方法,通过BusinessUnit 对象预先读取数据来填充map对象.这样,持久层方面的代码就可以移到业务代码之外了.

新方法里的"切面"

本节讨论如何用AOP为应用程序的各个"切面"建模

操作资源

类BusinessUnitPersistenceAspect 的持久方法使用了一个buffered reader.你甚至可以定义"切面"的"切面",但为了简单,这里只关注类的查找方法.
  1. @Aspect("perJVM")
  2. public class BufferedFileReaderAspect {
  3. @Expression("execution(* org.javatechnocrats.aop.withaop.aspects.BusinessUnitPersistenceAspect.find*(..))")
  4. Pointcut businessUnitPersistenceAspect;
  5. // 其他"切入点"定义
  6. @Expression("businessUnitPersistenceAspect ||
  7. employeePersistenceAspect ||
  8. managerPersistenceAspect")
  9. Pointcut allPersistencePointcuts;
  10. private Map<Class, String> fileNames;
  11. public BufferedFileReaderAspect() {
  12. System.out.println("BufferedFileReaderAspect created");
  13. fileNames = new HashMap<Class, String>();
  14. fillFileNames();
  15. }
  16. @Before("allPersistencePointcuts")
  17. public void assignReader(JoinPoint joinPoint) throws Throwable {
  18. System.out.println("assignReader advice called");
  19. Object callee = joinPoint.getCallee();
  20. IBufferedFileReaderConsumable bufReaderConsumable = (IBufferedFileReaderConsumable)callee;
  21. Class persistenceClass = callee.getClass();
  22. String fileName = fileNames.get(persistenceClass);
  23. FileReader fileReader = new FileReader(fileName);
  24. BufferedReader bufferedReader = new BufferedReader(fileReader);
  25. bufReaderConsumable.setBufferedReader(bufferedReader);
  26. }
  27. @AfterFinally("allPersistencePointcuts")
  28. public void releaseReader(JoinPoint joinPoint) throws Throwable {
  29. //释放buffered reader等资源
  30. }
  31. //其他方法
  32. }


上面的代码试图为每一个方法创建"切入点"-- 所有以find开头的方法.无论何时这些方法被调用,assignReader方法都会被提前执行.这里它获取被调用的类实例然后设置新建的buffered reader.

同样地,在releaseReader 方法里,代码会预先关闭buffered reader集合.本节只解释@before和@
AfterFinally 这两个"切入点".(以J2SE 5.0的标记定义).另外,你也可以在方面定义的xml文件中声明他们.你可以查看例程源代码中的aop.xml文件.

下载

持久化

前面提到,OOP方法使用BusinessUnit 来为应用的持久层填充Map.在下面的高亮代码中(@before一行,以及while循环代码 - 译者注),当BusinessUnitService 中的方法findAllBusinessUnits 被调用时"处理方法"findAllBusinessUnits 也将被调用.
  1. @Aspect("perJVM")
  2. public class BusinessUnitPersistenceAspect implements IBufferedFileReaderConsumable {
  3. private BufferedReader buffFileReader;
  4. @Before("execution(Collection org.javatechnocrats.aop.withaop.BusinessUnitService.findAllBusinessUnits())")
  5. public void findAllBusinessUnits(JoinPoint joinPoint) throws Throwable {
  6. System.out.println("findAllBusinessUnits advice called");
  7. Map<String, BusinessUnit> businessUnits =
  8. ((BusinessUnitService)joinPoint.getThis()).getBusinessUnits();
  9. String businessUnitRecord;
  10. while((businessUnitRecord = buffFileReader.readLine()) != null) {
  11. BusinessUnit businessUnit = BusinessUnitFactory.createBusinessUnit(businessUnitRecord);
  12. businessUnits.put(businessUnit.getId(), businessUnit);
  13. }
  14. }
  15. public void setBufferedReader(BufferedReader buffFileReader) {
  16. System.out.println("BusinessUnitPersistenceAspect.setBufferedReader called");
  17. this.buffFileReader = buffFileReader;
  18. }
  19. public BufferedReader getBufferedReader() {
  20. System.out.println("BusinessUnitPersistenceAspect.getBufferedReader called");
  21. return this.buffFileReader;
  22. }
  23. }

"处理方法"从数据存储中读取记录,使用工厂类创建一个BusinessUnit实例.然后这个实例被加入到Map.该Map掌管程序的所有持久化"切面".

日志
本文中的例子没有包含一个完整的日志AOP解决方案.但是,它为java.lang.Object类的toString方法定义了一个"切入点"来获取类的调试信息.因此,域中的类不需要实现toString方法.通常可能你可能需要为每一个类都要实现这个方法.

  1. @Aspect("perJVM")
  2. public class LoggingAspect {
  3. @Around("execution(String org.javatechnocrats.aop.withaop..*.toString())")
  4. public Object toStringAdvice(JoinPoint joinPoint) throws Throwable {
  5. System.out.println("toStringAdvice called");
  6. String toString = (String)joinPoint.proceed();
  7. Object target = joinPoint.getThis();
  8. Field fields[] = target.getClass().getDeclaredFields();
  9. List members = new ArrayList(fields.length + 1);
  10. members.add(toString);
  11. for(Field field : fields) {
  12. field.setAccessible(true);
  13. Object member = field.get(target);
  14. members.add(field.getName() + "=" + member);
  15. }
  16. return members.toString();
  17. }

你也可以用这个样例代码完成错误处理"切面".

深入源代码

为了理解样例需求的OOP设计,请参看源代码并思考以下几个问题:  下载

* 首先分析oldway包中EmployeeServiceTestCase 类中的代码
*查看testEmployeeCredit 方法
*搞懂业务类Employee和BusinessUnit
*学习 service,repository和factory概念.这些是业务驱动设计的主要概念.
*更深入地理解oldway包中的service,repository和factory类

而AOP地理解则应该是:
*分析newway包中EmployeeServiceTestCase 类
*查看service,repository和factory类,基本和前一种差不多.只是你要让"处理方法"截获程序的执行流程.
*研究aspect类学习"切入点"的定义

要执行程序,你需要做的工作:
* 下载AspectWerkz 2.0 http://aspectwerkz.codehaus.org/
*设置以下的环境变量:
set JAVA_HOME=c:/Program Files/Java/jdk1.5.0
set ASPECTWERKZ_HOME=C:/aw_2_0_2
set PATH=%PATH%;%ASPECTWERKZ_HOME%/bin
set CLASSPATH=
C:/aw_2_0_2/lib/aspectwerkz-2.0.RC2.jar;C:/aw_2_0_2/lib/aspectwerkz-jdk5-2.0.RC2.jar; classes;C:/ junit/3.8.1/resources/lib/junit.jar
*解压缩源代码和其他文件
*编译Java文件,但不要编译测试用例否则你调试时会遇到一个错误.
*进行离线调试.假设你把文件解压缩到c:/aop ,类文件解压到c:/aop/classes,在c:/aop目录下执行以下命令:
%ASPECTWERKZ_HOME%/bin/aspectwerkz -offline etc/aop.xml -cp classes classes
*AOP框架会修改类来注入必要的字节码
*编译测试用例,使用JUnit运行它.

后记
当你完成了上面的这些工作,你应该有以下的领悟:
*程序中的交叉关联
*关于AOP中深入源代码

为了理解样例需求的OOP设计,请参看源代码并思考以下几个问题:  下载

* 首先分析oldway包中EmployeeServiceTestCase 类中的代码
*查看testEmployeeCredit 方法
*搞懂业务类Employee和BusinessUnit
*学习 service,repository和factory概念.这些是业务驱动设计的主要概念.
*更深入地理解oldway包中的service,repository和factory类

而AOP地理解则应该是:
*分析newway包中EmployeeServiceTestCase 类
*查看service,repository和factory类,基本和前一种差不多.只是你要让advice截取程序的流程.
*研究aspect类学习point cut的定义

要执行程序,你需要做的工作:
* 下载AspectWerkz 2.0 http://aspectwerkz.codehaus.org/
*设置以下的环境变量:
set JAVA_HOME=c:/Program Files/Java/jdk1.5.0
set ASPECTWERKZ_HOME=C:/aw_2_0_2
set PATH=%PATH%;%ASPECTWERKZ_HOME%/bin
set CLASSPATH=
C:/aw_2_0_2/lib/aspectwerkz-2.0.RC2.jar;C:/aw_2_0_2/lib/aspectwerkz-jdk5-2.0.RC2.jar; classes;C:/ junit/3.8.1/resources/lib/junit.jar
*解压缩源代码和其他文件
*编译Java文件,但不要编译测试用例否则你调试时会遇到一个错误.
*进行离线调试.假设你把文件解压缩到c:/aop ,类文件解压到c:/aop/classes,在c:/aop目录下执行以下命令:
%ASPECTWERKZ_HOME%/bin/aspectwerkz -offline etc/aop.xml -cp classes classes
*AOP框架会修改类来注入必要的字节码
*编译测试用例,使用JUnit运行它.

后记
当你完成了上面的这些工作,你应该有以下的领悟:
*程序中的交叉关联
*关于AOP中"切面"的含义
*如何用AOP来把程序业务层中的交叉关联分离出来,使用"切入点"和"处理方法"
*OOP和AOP时在程序控制流上的不同

从本文你应该也得到一种看待实际开发的新视角.你应该有信心使用AOP来改进项目中的设计,建模,提高代码的重用性.至少,你可以开始使用AOP来处理日志,错误和持久化.

个人觉得,AOP的学习曲线相对较陡,尤其在理解定义"切入点"的句法时.理想的情况是,使用OOP来设计业务模型,使用AOP把业务模型中的交叉关联移出,从而使代码简洁并提高可读性.
AOP与OOP有什么区别,谈谈AOP的原理是什么 本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: 你知道什么是AOP吗?AOP与OOP有什么区别,谈谈AOP的原理是什么 心理分析:一旦问到aop面试官在开发自己的项目中 肯定是用到了aop切面编程的。这个时候求职者需要格外注意,特别是aop 在编译时的性能优势,apk编译的原理讲起。切勿将aop的概念弄混,一定要将oop面向对象与aop面向切面的场景说出来 求... 阅读详情

相关推荐

面向切面(AOP)与面向对象(OOP)

火龙果软件工程技术中心  首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能优雅解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.作为一个使用OOP多年的人来说,当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题时,我觉得应该去探个究竟了.对两种技术的比较最能给我们实际应用提供见解.这里我设计了一个例子:一个OOP应用,其中某些方面适合使用AOP.本文展示了一个简单的例子.一开始介绍了问题域,然后分别给出OOP与AOP的解决方

面向过程编程,面向对象编程和面向切面编程理解

面向过程(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到

小鼠标的博客 7456

html python mysql交互_干货!Python与MySQL数据库的交互实战

安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。https://www.lfd.uci.edu/~gohlke/pythonlibs/使用Python连接MySQL数据库1)六个常用的连接参数参数...

weixin_31043555的博客 1561

"面向切面(AOP)"与"面向对象(OOP)"

"面向切面(AOP)"与"面向对象(OOP)"(原来是按照原作者的格式分了4篇,现在整理了一下.合并为一篇. --译者注)首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能优雅解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.作为一个使用

danning之道 1298

嵌入式工程师必看:BLDC电机驱动电路设计全流程(附MOS管选型指南)

本文为嵌入式工程师提供了BLDC电机驱动电路设计的全流程实战指南。文章深入解析了三相全桥逆变电路的核心原理,并重点阐述了功率MOSFET的选型关键参数,如Vds、Rds(on)和Qg。同时,详细介绍了栅极驱动设计、PCB布局布线要点及调试安全步骤,旨在帮助开发者构建稳定高效的BLDC驱动系统。

weixin_29194817的博客 588

Proteus仿真实战:ADC0832时序解析与51单片机精准电压采集

本文详细解析了ADC0832模数转换芯片在Proteus仿真环境中的时序控制与51单片机驱动实现。通过实战代码示例和精度优化技巧,帮助开发者掌握电压采集的关键技术,包括时序配置、数据校验和噪声抑制等核心要点,提升嵌入式系统设计的精准度与可靠性。

weixin_29172963的博客 873

JAVA基础-面向对象和对象切面

1.面向对象(OOP) 类是对象的抽象,对象是类的具体 OOP的主要特征主要有以下几个方面: -抽象(将一类对象的共同特征抽象出来,只关注对象的属性和方法,并不关注这些行为的细节) -继承(从已有的类中得到继承信息并创建新类的过程,提供信息的类称为‘父类/基类’,创建的新类为子类) -封装(将具体实现隐藏在方法或类内部,对数据的访问只能通过已经定义的接口) -多态(简单说就是:同样...

qq_38667881的博客 812

scGPT-spatial 复现

文章摘要:Spatial scGPT项目复现流程 本文详细介绍了复现Spatial scGPT项目的完整流程,包含数据预处理、模型训练等关键步骤。首先需要使用scanpy加载H5AD文件并进行归一化、对数变换等预处理。然后构建基因词汇表(vocab),提取基因表达值和空间坐标信息。接着使用DataCollator进行数据分箱、掩码和填充处理。最后搭建TransformerModel进行训练。文章特别指出了需要自行补全的缺失部分,包括基因词汇表构建、空间坐标提取、数据集类定义和训练主循环脚本等。作者还提供了详

victory0431的博客 1683

谈谈面向过程、面向对象、面向切面三种编程思维

面向过程、面向对象、面向切面是三种不同的编程思维,它们有各自的特点、优缺点和应用场景。下面简单介绍一下:

人生不怕起点低,就怕没追求 826

win2012 r2 + IIS8.5 伪静态设置脚本映射

win2012 r2 + IIS8.5 伪静态设置脚本映射,网站用的.net fromwork 2.0 ,应用程序池设置了32位支持

xueking87的专栏 3240

YOLO26改进策略【卷积层】| DWRSeg :高效获取多尺度上下文信息,二次改进C3k2

本文记录的是利用DWR 模块改进 YOLO26 的特征提取部分。(Dilation-wise Residual)通过两步残差流程(区域残差化-语义残差化)与分支化空洞卷积结合,引导解码器处理特征与跳接特征的多尺度精准融合。本文利用模块,通过区域残差化生成简洁区域型特征图以简化融合基础,再通过分支化空洞卷积捕捉多尺度空间上下文,同时依托残差连接保留原始特征信息,对YOLO26中不同尺度目标特征进行针对性强化、抑制无效背景特征干扰,在特征融合阶段实现多尺度语义与细节信息的高效互补,避免传统多感受野卷积的冗余计算

Limiiiing的博客 159

米老师讲课:面向过程和面向对象的区别、面向切面编程

文章目录面向过程(Procedure Oriented)面向对象(Object Oriented)面向切面(AOP)一、面向过程(POP)与面向对象(OOP)的区别: 面向过程(Procedure Oriented) 面向对象(Object Oriented) 面向切面(AOP) 最近非常有幸,米老师亲自给我们讲课,首先让我们就面向过程编程(POP)、面向对象编程(OOP)和面向切面编程(AOP)...

Ariel_欢 1490

扩散模型实战:从零开始训练手写数字生成模型

手写数字的数据集是绝大部分炼丹师的深度学习初恋,这篇博客以代码为主,手把手带读者搭建一个基于扩散模型的手写数字生成模型,非常适合刚接触扩散模型的初学者学习。

沉迷单车的追风少年 1914

面向切面(AOP)"与"面向对象(OOP)"

 "面向切面(AOP)"与"面向对象(OOP)"(原来是按照原作者的格式分了4篇,现在整理了一下.合并为一篇. --译者注)首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能优雅解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.作为一个使

๑۩۞۩๑ oiote的专栏 ๑۩۞۩๑ 729

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1514

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

"面向切面(AOP)"与"面向对象(OOP)"(图)

首先你要明确的一点,AOP和OOP是两种不同的认识事物的角度,并不是说有了AOP就不要用OOP.AOP所关注的是传统OOP不能优雅解决的问题.(程序员通常都是完美主义者,当解决某个问题不优雅的时候,那就意味着不完美.)下面将就一个简单的例子来说明他们到底如何的不同.    作为一个使用OOP多年的人来说,当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题时,我觉得应该去探个究竟了.对两种技

JAVA|J2EE|J2ME|JDK|JSP 523

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

猿创征文|Spring系列框架之面向切面编程AOP

本篇文章将介绍一种特别重要的思想,AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。 AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。

未见花闻的博客 3072

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

AOP面向切面编程和OOP面向对象编程

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率...

9240

面向切面(AOP)和面向对象编程(OOP)

综述:挺常见的两个概念,温习一些 1.面向对象编程 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。O...

我的博客 3883

【编程思想】理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)

但是也有它的缺点,最明显的就是关注点聚焦时,面向对象无法简单的解决这个问题,一个关注点是面向所有而不是单一的类,不受类的边界的约束,因此OOP无法将关注点聚焦来解决,只能分散到各个类中。大多数支持面向对象的语言,同时也支持面向过程,不论是JAVA、PHP,还是JS,它们都还无法完全面向对象,因为面向过程是必然的,面向过程代表着必要的程序流程,调动对象进行组合或对象内部能力的实现,都一定会存在“过程”,它最终还是需要通过拆分步骤来指导最具体的执行细节。else的判断,这段代码,无疑是很恶心的。

DreamSun的博客 3126

AOP面向切面和OOP面向对象的简单理解比较

【转】   AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。   AOP与OOP是面向不同领域的两种设计思想。   OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。   AOP则是针对业务处理过程中的切面进行提取,它所面对的

Gentlering的博客 1953

Spring AOP:面向切面编程的实现【与OOP比较】

AOP即面向切面编程,它是编程的一个范式,用于通过分离横切关注点来提高代码模块化。Spring AOP(面向切面编程)是核心Spring框架的一个关键组成部分。它允许开发者将一些横切关注点(cross-cutting concerns)比如日志记录、事务管理、安全等,从业务逻辑代码中分离出来。通过使用AOP,开发者可以将这些横切关注点模块化成特殊的类,这些类在Spring术语中被称为切面(aspects)。这样可以使得业务逻辑更加清晰,并且提高代码的可复用性和可维护性。

m0_71685576的博客 1076

OOP与AOP的区别和联系

一、OOP及AOP的定义 1.OOP 面向对象程序设计(Object Oriented Programming),其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。特点是封装、继承、多态、抽象。 ①封装:把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量定义,行为用方法定义,方法可以直接访问同一个对象的属性 ②抽象:把现实生活中的对象抽象为类。分为过程抽象和数据抽...

Aaron的博客 5287

面向切面编程——Aop

一、概念        AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。 二、Aop原理               1.面向对象编程模型         OOP(面向对象编程)

不忘初心 ,方得始终 2266
上一篇: IT人不可不听的10个职场故事
下一篇: 负载均衡技术
疯疯爱吃辣
博客等级 码龄15年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值