OOP VS. FP VS. AOP VS. COP

来源:互联网 发布:c语言汉诺塔 编辑:程序博客网 时间:2024/05/17 03:23

OOP (Object-oriented Programming) e.g., C++, Enterprise JAVA, Object-oriented PHP

FP (Functional Programming) e.g., Haskell, Scheme, Erlang

AOP (Aspect Oriented Programming) e.g., AspectJ

COP (Concurrency Oriented Programming)

应该说OOP和FP有一定的可比性,AOP看起来更像是另一个角度的事情,且把它放进来凑数吧。某位萌同学问这些有什么区别呀,都在说什么,本以为可以较为良好的解答,却稀里糊涂说了很多发现自己也不甚了解。且写个博文,记录看到想到的相关内容。

//-----------------------------------------------------------------------------------------------------------------

OOP

特征:面向对象的特征是绑定数据(Data)和数据相关函数(Function)。面向对象思想认为软件开发应参考与软件相关的现实世界中的事物,并对其进行抽象,得到对象(Object)以及对象的特点(属性Property)和行为(方法Method)。

数据:绝大部分情况下,一个对象的属性(数据)为该对象独有,外界不能直接访问,只能通过对象提供的方法操作其拥有的属性(数据)。大多数时候,不同的对象通过调用其他对象的方法(方法调用)进行交互,共同完成工作。

状态:一个对象在某一时刻的所有属性(数据)的组合表示这个对象在这个时刻的状态。对象的状态通常会随着软件的工作发生变化,这意味着在不同时刻调用相同对象的相同方法,得到的结果(获得的效果)可能会不同。

组合方式:组合方式指多个对象直接如何进行整合或者说具体如何协作以完成某项工作。OOP需要借助一定手段进行组合,其中最为典型的组合方式是通过接口实现的,一个接口定义一个或多个功能,成功实现该接口的类之间便可以互相替换,这些类的使用者(通常也是类)和这些类通过接口“签订条约”,实现互相协作。

(PS:笔者认为OOP的一个重要概念,继承,实际与这个话题关系不大。继承的主要意义在于代码重用。进一步思考继承,越发认为,继承实际是一种很强的耦合关系,子类接受一切父类的属性和方法,却不能有效的向外界表达自己的功能(相比接口,继承并没有一种机制告诉外界使用者,我继承了谁,因此我有何种何种的功能),我们可以通过文档提供这方面的支持,但这同时增加了开发者和使用者的工作量。)(未完待续)

//-----------------------------------------------------------------------------------------------------------------

FP

特征:函数式编程的特点是将软件的工作拆分成一些列函数组合序列,函数读入输入值,产出输出值,没有保存的数据。

数据:通常,数据只出现作为函数的输入值和输出值,函数中定义的数据旨在辅助函数的运算过程并在函数调用结束后销毁,函数自身不保留数据。

状态:函数不保存状态,所以函数式编程实际上基本没有所谓状态的定义。正因为如此,无论什么时候运行一个相同的函数,给予相同的输入值,总会得到相同的输出值。

组合方式:FP使得组合变得极其容易,一个函数可以作为另一个输入值(只要前者的输出值类型符合后者的输入值类型),最简单的例子,如f(g(x))。(未完待续)

//-----------------------------------------------------------------------------------------------------------------

AOP

特征:面向对象编程的特征在于对于软件事务流程的横切。它的核心是关注点(Concerns),可以解释为软件某一方面的特定需求(如,效率,安全性,可靠性……)。AOP的精髓在于将这些关注点相关代码抽出来,统一写入特定的代码片段中,而在需要确保这些需求的地方动态的插入这些代码片段。

要求:不必显示地在功能代码中引用关注点特定代码,功能代码只需负责自己的功能,无需关注这些特定的关注点。关注点可以更改(可以增加,可以减少,可以修改),任何时候,AOP代码开发者都可以在任何地方插入需要的代码,甚至通过AOP代码修改原有的功能代码。

实现方式:正常代码(目标代码)+AOP代码 -》代码编织器-》最终代码。AOP代码即为关注点相关代码,它们会被插入到特定目标代码中,代码编织器通过AOP代码中定义的条件将其插入,生成完整的功能(符合关注点需求)的代码。

AOP示例

public aspect HelloAJ {after(): call(* Hello.sayHello(..)){System.out.println(" AspectJ!");};}

关键字Aspect表明这是一个aspect结构,关键字after表明AOP代码在某个事件结束后调用,这个事件就是call(* Hello.sayHello(..)),即调用Hello类中的sayHello方法,

所以说当程序在任何时候执行完Hello.sayHello方法,AOP代码“System.out.println(" AspectJ!");”都将会被执行。

假设目标代码如下

目标代码

public class Hello {public static void main(String[] args){sayHello();}public static void sayHello(){System.out.print("Hello");}}

加入AspectJ之后执行,控制台打印“Hello AspectJ!”


//-----------------------------------------------------------------------------------------------------------------

cOP

面向并发编程

特征:


0 0
原创粉丝点击