查看: 1351|回复: 0

[Java学习] JAVA面向过程编程、面向对象编程和面向切面编程理解

发表于 2018-2-1 16:46:46
面向过程(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
面向切面编程(Aspect Oriented Programming(AOP)),是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

通过以下案例深入了解三者区别:
项目背景:大学新生报名,需要去相应学院注册登记。接着去财务处进行缴费,缴费完毕,拿着单子领取军训服装,最后去宿舍整理床铺。
需求分析对每个同学需要完成以下功能:(假设新生有小明,小李,小王,小周)
(注:四位同学不是同一学校的,但是都需要通过以下程序进行注册报名,各个学校可能参考下面流程进行定制)
(1). 去相应学院注册登记
(2). 去财务处进行缴费
(4). 缴费完毕
(5). 拿着单子领取军训服装
(6). 去宿舍整理床铺。

一 面向过程:
小明来学校报名
–>小明去相应学院注册登记
–>小明去财务处进行缴费
–>小明缴费完毕
–> 小明拿着单子领取军训服装
–>小明去宿舍整理床铺
小明注册完毕!
小李来学校报名
–>小李去相应学院注册登记
–>小李去财务处进行缴费
…….
小李注册完毕!
……..
可以明显的看出来,面向过程主要是对对整个事情的过程通过记流水账的方式进行实现。当然开发效率比较低,不适合做大型应用(当然操作系统内核主要是面向过程语言写的这比较特殊,写起来肯定得好久好久( ▼-▼ ))。
当需求变化时,比如需要去掉领取军训服的业务,那就麻烦了,需要对每位同学的过程进行修改,,( ▼-▼ )想想都有点可怕!
或者某些同学无法正常报道,需要改动和这些学生相关的代码,这工作量也不小。可见面向过程的变成想法还是需要进一步提高。
要是再加上各个学校定制的话,作为萌萌哒程序员,该哭了( ▼-▼ )

要朝这java程序员发展或者真心有兴趣的。可以找我要一些java的学习视频java学习交流群:450936584,这个是免费的,希望同学找我要的时候不要有理所应当的态度,毕竟都是我的心血,希望你是真的有一颗想要学好java的心,我也会尽所能的去帮助你成为一名优秀的程序员。
二 面向对象
首先,对学生报名进行抽象,抽象出来一个学生类,具有下面这几个方法
(1). 去相应学院注册登记
(2). 去财务处进行缴费
(4). 缴费完毕
(5). 拿着单子领取军训服装
(6). 去宿舍整理床铺。
小明来学校报名
通过上面抽象出来的学生类创建学生实例:小明。然后一次调用它的方法:
小明.去相应学院注册登记();
小明.去财务处进行缴费();
小明.缴费完毕();
小明.拿着单子领取军训服装();
小明.去宿舍整理床铺();
小明注册完毕!
小李来学校报名
小李.去相应学院注册登记();
小李.去财务处进行缴费();
…….
小李注册完毕!
……..
比起面向过程编程,面向对象编程简化了代码量,通过抽象,实现代码的复用,提高了开发效率。但是依然需要对每个对象进行引用。只能说是效率相对较高。
当需求发生变化时,例如,某些同学未能正常报到,需要删除相关代码,任务量相对小点。改动某个环节的内容,也很方便
但是,当每个学校进行定制的时候尼?这会就有点尴尬了,之前抽象的学生类都得改,改成每个学校的定制类,这样就会有多个学校类,还得该业务代码,,,不敢再想了,有点想哭的感觉。( ▼-▼ )

三 面向切面
首先对业务逻辑进行抽象,针对上面的六个业务进行各自封装实现。(已经六个类了)
然后,制作代理类,根据学校需求进行个性化封装学生类(好多类,至少一个)。
小明来学校报名
创建代理类,
根据学校规定调用相应方法,完成报名注册功能
小明注册完毕!
小李来学校报名
创建代理类,
根据学校规定调用相应方法,完成报名注册功能
…….
小李注册完毕!
……..
切面,指的是项目模块中某些业务逻辑。面向切面编程通俗一点就是面向业务的一种编程思想(当然业务需要一定的共性),然后通过代理完成类的创建,极大程度的降低代码的重复,有效的提高了代码的重用率和开发效率。。。当然结合IOC(控制反转),将对象直接注入到代理类中,通过代理完成调用方法,那就更完美了

例子比较牵强,看下图形象一点:
切面是横跨流程的,实现某个特定位置的功能,面向功能进行抽象。具体流程只需做引用即可,而不至于不同流程中冗余很多类似代码。



回复

使用道具 举报