【问题标题】:Inheritance as a way of adding modular abilities继承作为添加模块化能力的一种方式
【发布时间】:2016-08-16 08:07:56
【问题描述】:

我正计划创建一个简单的机器人,但不想重做一次,如果将来变得更复杂。所以我想知道我的方法是否会在未来引起任何问题。如果有更好的解决方案/方法。

我打算做什么:

  • 拥有一个读取用户输入的Communicator
  • 拥有一个Ability 类,其中包含接收消息和回复消息的基本方法
  • 继承 Ability 类和所有其他能力类
  • 将所有Ability 类存储在主Communicator 类的数组/列表中
  • Communicator 收到一条消息时,它通过调用Communicator 类中的方法将其发送给该列表中的所有类以及该命令用于回复的类(发回一条消息)。

例子:

  • 继承Ability的类:GreetBackflip
  • 用户输入:“后空翻”
  • “做一个后空翻”被发送到 Greet 和 Backflip 类。
  • 两个类都处理字符串
  • 类 Backflip 检测到后空翻命令并以 “Backflip” 回复

这种解决方案的规模如何?另一个主要目标是让其他人更容易实现自己的能力并将其纳入计划,类似于Hubot

【问题讨论】:

  • 如果您要将Ability 与动词或短语相关联,那么您可能会考虑使用字典或类似工具来存储可以处理每个特定动词/短语的Ability 对象.此外,出于可扩展性的目的,最好不要对Ability 对象的列表进行硬编码,而是有一些在运行时配置它们的机制,这样您将来就可以添加更多的功能而无需接触您的@987654334 @类。
  • 您建议在这里使用什么样的自动机制?
  • 至少在Communicator 上使用控制反转,这样它就不会知道Ability 的实现。您的程序在代码中设置它们。即使它仍然是硬编码的,您也可以通过这种方式实现更松散的耦合。如果它还需要更加动态,也许它会在运行时通过 .config 文件确定它们。或者通过某种插件模式的实现。但主要思想是Communicator 不知道将使用哪些Ability 类,它是由您的程序在别处告诉的。
  • 听起来很聪明。您认为该解决方案是否具有其他可扩展性?你会采取不同的方式吗?
  • 语言处理需要有多复杂?我可以看到一些潜在的需要在两者之间有一个解析器来计算特定的命令。实际上,Backflip 能力是否需要理解除Backflip 以外的任何命令?它不应该负责解析语言(即不需要知道Do a 的含义)。

标签: c# inheritance scalability


【解决方案1】:

从概念上讲,您所描述的内容与 MVC 没有太大区别……您的 Ability 很好地映射到控制器,而回复映射到视图。您甚至可以选择像 ASP.NET/MVC 这样的 MVC 框架。

MVC 与您所描述的不同之处在于,通常有某种路由器将传入命令路由到特定控制器,而不是将消息广播到所有控制器以决定它们是否可以响应。您考虑的广播似乎有点矫枉过正......因为每个Ability 都必须解析并决定响应。这带来了可扩展性问题……尤其是同时进行大量对话时。

此外,如果您的世界变得庞大而复杂,多个Abilities 回复会怎样?

在 MVC 中,路由器负责将输入中的模式映射到控制器中预先注册的或更可能基于约定的操作。路由器将具有用于确定调用哪个控制器的启发式方法(通常是首先发现的胜利)。框架通常有各种自定义路由器的方法。

除非这只是一件有趣的事情,并且不会产生沉重的负担,否则您最好调查某种 MVC 框架来为您完成繁琐的工作。

【讨论】:

  • 我编辑了我的问题并添加了这一点:主要目标之一是让其他人更容易实现自己的能力并将其包含在程序中。你还会推荐 MVC 吗?
  • 至少对于 ASP.NET MVC,制作新控制器就像从原木上掉下来一样容易……而且我已经从原木上掉下来了。社区有很多支持。我建议查看教程。看看asp.net,你会发现很多有趣的信息。
  • 我有点担心,因为它说的是 web 框架,我正在考虑独立的 helper bot,类似于 Hubot。
  • Gotcha...无论您是否可以使用该产品,您仍然可以从 MVC 模式的一些研究中受益。从谷歌搜索“MVC 模式”开始,它会带你走向有趣的方向。
猜你喜欢
  • 2014-01-02
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多