早在90年代初,我参与了包含大量“代理”类的系统的设计和实现。该系统运行良好,并且可以合理维护。现在,我正在与新工作环境中的人们争论,他们声称“对象应该是名词”。是否有好的文章解释为什么代理商是一个坏主意?什么区分Agent和Object更详细(我得到了一般的想法,但具体是什么被弃用?)
最好不要全书:我刚刚开始阅读Bertrand Meyer关于面向对象软件构建的书,要花点时间才能完成。
根据Tomasz和Niko的评论,我改变了主题(从询问指针到文章),现在邀请人们直接回答,而不是指向文章。
答案 0 :(得分:4)
维基百科说
面向代理编程(AOP)是一种编程范式 软件的构建以概念为中心 软件代理商。与面向对象编程相比 对象(提供带有可变参数的方法)的核心 (http://en.wikipedia.org/wiki/Active_object)
但是我不认为AOP与OOP分开,我个人使用JADE(http://jade.tilab.com/,这是实施FIPA标准(http://www.fipa.org)最着名的框架之一,并且我记得在JADE代理中可以拥有可以利用来执行复杂功能的对象(作为java类的实例)。从这个意义上说,代理的概念类似于活动对象的概念(http://en.wikipedia.org/wiki / Active_object)。主要区别在于Agent在黄页注册表中发布了它们提供的服务的描述,并且能够通过共享语言进行通信(可能基于onthologies)。还可以提供移动性以便运行代理可以迁移到保留其执行状态的不同设备。但是这种复杂性可以在线程的顶部实现,从而扩展OO范例而不是与之形成对比。
代理的概念最早由Yoav Shoham在1990年的人工智能研究中使用。
在此链接http://www.infor.uva.es/~cllamas/MAS/AOP-Shoham.pdf中,您可以找到他所说的Shoham pubblication的摘录
然而,OOP建议查看由...组成的计算系统 能够彼此通信并具有的模块 处理传入消息的各种方式,AOP专门从事 框架通过修复模块的状态(现在称为精神状态) (现在称为代理)由精确定义的组件组成 信仰(包括关于世界的信仰,关于自己的信仰,以及关于一个人的信仰), 能力,选择和可能类似的规范。一个 compurarion由rhese agent的通知,请求,提供, 接受,拒绝,竞争和互相帮助。这个想法 直接从言语行为文献中借用(Grice 1989; Searle 1969; Austin 1962)。
关键是AOP 专攻 OOP框架。所以我说它扩展了OOP(虽然不是很好)。我猜你可能想要使用这种架构,当你处理可能需要扩展以应对高度可变任务量的计算密集型系统时,这种架构非常适合设计和实现。在其他情况下,AOP可能过度使用,但这取决于您的设计师/建筑师的灵敏度。
答案 1 :(得分:4)
OOP就是将状态和相关行为封装在一起。
代理人,经理和助手往往没有国家;它们通常只是一些操作某些输入数据的方法。这样的代码也有大量的getter和setter,因为数据对象太笨了,不能自己做任何事情。这不是OOP,而是程序编程。
良好的面向对象设计围绕告诉对象做什么而不是向他们询问数据然后用它做什么。无论何时调用getter,都要问问自己是否可以让对象直接执行操作。例如,而不是:
account.setBalance(account.getBalance() + x);
尝试做:
account.deposit(x);
请注意,在某些情况下,可能会以策略或服务对象的形式使用类似代理的对象,但如果操作正确,则不会破坏封装。