一、面向过程编程:(POP:Procedure Oriented Programming)

面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是功能(即系统的数据被加工和处理的过程),在程序设计中主要以函数或者过程为程序的基本组织方式,系统功能是由一组相关的过程和函数序列构成。
从思维上来讲,面向过程更强调细节,忽视了整体性和边界性。
典型代表是 C/C++的结构体

理解:
分析解决问题所需要的步骤,然后用函数把这些步一一实现,使用的时候按顺序依次调用就可以了
代码线性,严格按着顺序,侧重解决步骤,着眼局部或者具体。

优点

  1. 流程化编程任务明确,在开发之前基本考虑了实现方式和最终结果;
  2. 开发效率高,代码的短小精悍,善于结合数据结构来开发高效率的程序;
  3. 流程明确,具体步骤清楚,便于节点分析。

缺点

  1. 需要深入的思考,耗费精力;
  2. 代码重用性低,不易扩展,维护起来难度大;
  3. 对复杂业务,面向过程的模块化难度较高,耦合度比较高。

二、面向对象编程:(OOP:Object Oriented Programming)

面向对象编程以对象为中心,面向对象作为一种新型的程序设计方法,其是以对象模型为基础进行的抽象过程,并在应用过程中形成了描述自己的抽象概念定义,包括对象、类、封装、继承以及多态等。
面向对象是一种编程范式,满足面向对象编程的语言,一般会提供类、封装、继承等语法和概念来辅助我们进行面向对象编程。

理解:
万物皆对象,可以搭建大型的复杂系统
首先,它必须将数据抽象为模块结构;
其次,必须存在某种方式来实现代码的多态执行;
最后,它至少能部分压缩代码和函数。

优点

  1. 结构清晰,注重 对象和职责,不同的对象承担不同的职责;
  2. 封装性,将事务高度抽象,便于流程中的行为分析、操作;
  3. 容易扩展,代码重用率高,可继承,可覆盖;
  4. 实现简单,可有效地减少程序的维护工作量。

缺点

  1. 面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少,从而不适合底层开发和游戏开发,甚至是多媒体开发;
  2. 复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。

三、面向切面编程:(AOP:Aspect Oriented Programming)

面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

理解:
可以让类动态化,动态粒度更小,可以修改类中的成员
专注实现自身业务功能,周边业务功能可动态加进来(用户验证/日志处理/...)

优点

  1. 简单,易用;
  2. 降低模块的耦合度;
  3. 使系统容易扩展;
  4. 设计决定的迟绑定:设计师可以推迟为将来的需求作决定;
  5. 更好的代码复用性。

缺点

  1. 增加额外重复代码,且紧耦合;
  2. 每个业务逻辑需要一个装饰器实现或代理;
  3. 使用麻烦,须增加容器。

总结

POP编程是以功能为中心来思考和组织程序,注重功能的实现,达到效果就可以了;
OOP则注重封装,以对象为中心,强调整体性,代码整体变得更规范;但是OOP的耦合性还是很高,一旦代码需要修改,会对很多类造成影响,代码冗余问题严重,而且核心业务中总夹杂着一些它并不关心的通用业务,比如日志记录、性能统计、安全控制、事务处理、异常处理等;
AOP正好解决了OOP周边通用业务的解耦问题。
三者之间是一个相互补充和完善的关系。

理解POP、OOP、AOP编程的更多相关文章

  1. 使用spring方式来实现aop编程

    1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  2. 简述AOP编程

    aop是面向切面编程的简称,对业务逻辑中的各个部分切割隔离,使耦合度降到最低,不仅增加了开发效率,还增强了系统的重用性和可维护性. 个人理解是把面向对象编程和面向函数编程结合在了一起. 说了这多的好处 ...

  3. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  4. 聊Javascript中的AOP编程

    Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...

  5. struts2.1笔记03:AOP编程和拦截器概念的简介

    1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用A ...

  6. Method Swizzling以及AOP编程:在运行时进行代码注入-备用

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  7. AOP编程,spring实现及JDK,CGLIB实现

    什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程)和OOP(Object-Oriented Programing,面向对象编程)思想不同,两者并非对立关系,前 ...

  8. AOP编程和ASP.NET MVC

    AOP编程和ASP.NET MVC AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名 ...

  9. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  10. Java基础-SSM之Spring的AOP编程

    Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...

随机推荐

  1. 1067 试密码 (20分)C语言

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...

  2. 小小知识点(二十二)显示屏与主机之间连接,出现无信号字样时,应检查是否正确选择集显和独显VGA接口

    显示屏与主机之间连接,出现无信号字样时,应检查是否正确选择集显和独显VGA接口 通过VGA接口判断集成显卡和独立显卡.在台式机主机上,VGA接口竖着放置的说明是集成显卡,VGA接口横着放置的说明是独立 ...

  3. beetlex网关之聚合和url请求过虑

    在这里主要介绍beetlex应用网关的两个插件,分别是聚合和url请求过虑.通过聚合插件可以把整合多个请求的数据来应答请求端,而Url请求过虑同可以拒绝一些有非常关键字的请求. 请求聚合 在网关服务中 ...

  4. 原生javascript实现仿QQ延时菜单

    一.实现原理 定时器和排他思想 二.代码 <!DOCTYPE html> <html> <head> <title></title> < ...

  5. Scala与Mongodb实践1-----mongodbCRUD

    目的:如何使用MongoDB之前提供有关Scala驱动程序及其异步API. 1.现有条件 IDEA中的:Scala+sbt+SDK mongodb-scala-driver的网址:http://mon ...

  6. 从零开发一款txt小说下载器

    在日常开发中,列表是一个非常常用的一个东西,可以用listview和recyclerview实现.当然,由于recyclerview更为实用且强大,它也是更好的方案. 而我以前为了方便,习惯直接拿网上 ...

  7. 通过例子进阶学习C++(六)你真的能写出约瑟夫环么

    本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...

  8. 「BZOJ4173」数学

    题面 已知 \[\large{S(n,m)=\{k_{1},k_{2},\cdots k_{i}\}}\] 且每个 \(k\) 满足 \[\large{n \%k+m\%k\geq k}\] 求 \[ ...

  9. element-ui input 组件 回车事件

    直接在el-input 标签上添加@keyup.enter="funName" 是不起作用的,在组件中使用需要加上.native. <el-input v-model = & ...

  10. PTA - 堆栈模拟队列

    设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0: in ...