6

早在 90 年代初期,我就参与了一个系统的设计和实现,该系统包括许多“代理”类。该系统运行良好且可合理维护。现在,我正在与新工作环境中的人们争论,他们声称“对象应该是名词”。有没有很好的文章解释为什么代理是一个坏主意?以及更详细地将代理与对象区别开来(我明白了一般的想法,但具体是什么被弃用了?)

最好不要整本书:我刚刚开始阅读 Bertrand Meyer 关于面向对象软件构建的书,这需要一些时间才能读完。

根据 Tomasz 和 Niko 的评论,我更改了主题行(从请求指向文章的指针),现在邀请人们直接回答而不是指向文章。

4

2 回答 2

4

OOP 就是将状态和相关行为封装在一起。

代理、经理和助手往往没有状态;它们通常只是一组对某些输入数据进行操作的方法。这样的代码也有大量的 getter 和 setter,因为数据对象太笨了,不能自己做任何事情。这不是 OOP,它是过程编程。

好的 OO 设计围绕着告诉对象要做什么而不是向他们询问数据然后用它做某事。每当您调用 getter 时,问问自己是否可以让对象直接执行操作。例如,不要这样做:

account.setBalance(account.getBalance() + x);

尝试做:

account.deposit(x);

请注意,在某些情况下,人们可能会以策略或服务对象的形式使用类似代理的对象,但如果使用得当,它们不会破坏封装。

于 2012-08-26T22:57:35.760 回答
4

维基百科说

面向代理的编程 (AOP) 是一种编程范式,其中软件的构建以软件代理的概念为中心。与以对象(提供具有可变参数的方法)为核心的面向对象编程相反(http://en.wikipedia.org/wiki/Active_object

但是,我不认为 AOP 与 OOP 是分开的,我个人使用 JADE(http://jade.tilab.com/,这是实现 FIPA 标准的最著名的框架之一(http://www.fipa.com/)。组织) 并且据我所知,JADE 代理可以拥有可以利用来执行复杂功能的对象(作为 java 类的实例)。在这个意义上,代理的概念类似于活动对象的概念(http://en.wikipedia.org/wiki/Active_object)。主要区别在于代理在黄页注册表中发布了他们提供的服务的描述,并且能够通过共享语言(可能基于本体)进行通信。还可以提供移动性,以便正在运行的代理可以迁移到保留其执行状态的不同设备。然而,这种复杂性可以在 Thread 的顶部实现,从而扩展了 OO 范式,而不是与之形成对比。

1990 年,Yoav Shoham 在他的人工智能研究中首次使用了代理的概念。

在此链接http://www.infor.uva.es/~cllamas/MAS/AOP-Shoham.pdf中,您可以找到 Shoham 出版物的摘录,其中他说

而 OOP 建议将计算系统视为由能够相互通信并具有处理传入消息的单独方式的模块组成,而 AOP 通过固定模块的状态(现在称为心理状态)(现在称为代理)由精确定义的成分组成,这些成分称为信念(包括关于世界的信念、关于自身的信念和关于一个事物的信念)、能力、选择,以及可能的类似规范。Compurarion 包括这些代理人的告​​知、请求、提供、接受、拒绝、竞争和帮助。这个想法直接来自言语行​​为文献(Grice 1989;Searle 1969;Austin 1962)。

关键词是 AOP专门化了 OOP 框架。因此,正如我所说,它扩展了 OOP(虽然不一定以一种好的方式)。我猜你可能想要使用这种架构,它的设计和实现都非常好,当你处理可能需要扩展以应对高度可变的任务的计算密集型系统时。在其他情况下,AOP 可能会过度杀伤力,但这取决于您的设计师/架构师的敏感性。

于 2012-08-26T18:53:08.187 回答