【问题标题】:Why are Agents & Managers considered poor O-O design为什么代理和经理被认为是糟糕的 O-O 设计
【发布时间】:2012-08-24 18:24:23
【问题描述】:

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

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

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

【问题讨论】:

  • 看看这些天 akka 周围有多少炒作(而且永远是好的!)只要选择最好的工具。 PS:投票结束,不具建设性。
  • 让您投票以非建设性的方式关闭真是令人沮丧。在这里我特意不请人指点,求文章指点。
  • SO 通常不是推荐列表的好地方。您应该考虑重新表述您的问题,并在此处直接询问“(为什么)代理是个坏主意”,而不是询问有关该主题的文献。

标签: oop object


【解决方案1】:

维基百科说

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

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

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

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

而 OOP 建议将计算系统视为由 能够相互通信并且具有 处理传入消息的单独方式,AOP 专门 通过固定模块的状态(现在称为心理状态)来构建框架 (现在称为代理)由精确定义的组件组成,称为 信念(包括对世界、对自身和对另一个事物的信念), 能力、选择和可能或类似的准则。一种 Compurarion 包括这些代理人的通知、请求、提供、 接受、拒绝、竞争和互相帮助。这个想法 直接从言语行为文学中借用(Grice 1989; 塞尔 1969 年;奥斯汀 1962 年)。

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

【讨论】:

  • 我拒绝仅仅因为“维基百科说...”开始回复而投反对票的冲动
  • 我想引用某人的话并没有错。重要的是始终像我实际所做的那样引用源代码。你为什么不喜欢它?
  • 因为 Wikipedia 是几乎所有内容的未经身份验证的来源,由任何人编写,几乎不对其准确性负责。不介意引用,但我不喜欢维基百科。
  • 我明白你的意思,虽然我只是想引用民间对 AOP 的理解(维基百科)和 Shoham 的观点
【解决方案2】:

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

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

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

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

尝试做:

account.deposit(x);

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

【讨论】:

  • 为什么说代理没有状态,只是一堆方法。这实际上是错误的。 AOP 正好相反。代理的目标是自主的,可能是智能的(显然就人工智能而言),能够执行复杂操作并合作处理更复杂操作的实体(或在工作量增加时适当扩展整体功能)。它们有状态,它们不只是由一堆方法组成,因为它们通过具有特定语言的消息进行通信,符合复杂的协议和本体(参见fipa.org
  • @Silli:我的回答根本与 AOP 代理无关(OP 也没有特别提到 AOP)。在“代理和管理器”的上下文中,“代理类”通常是代表另一个对象执行操作的类,根据我的经验,这往往会导致数据和行为分离。
  • 根据我的经验,代表另一个对象执行操作的对象是“委托”。代理其实更多。
  • @Silli:我不是在争论“代理实际上更多”。但是由于代理是一个通用术语(在 AOP 之外),并且由于 OP 还提到了“经理”,我只是说我见过类似的“代理”,其中包含理应属于另一个对象的逻辑——这样的代理最终会做另一个对象应该做的工作。这与委托完全不同,委托只是将调用转发给另一个对象。
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多