【发布时间】:2016-08-16 08:07:56
【问题描述】:
我正计划创建一个简单的机器人,但不想重做一次,如果将来变得更复杂。所以我想知道我的方法是否会在未来引起任何问题。如果有更好的解决方案/方法。
我打算做什么:
- 拥有一个读取用户输入的
Communicator类 - 拥有一个
Ability类,其中包含接收消息和回复消息的基本方法 - 继承
Ability类和所有其他能力类 - 将所有
Ability类存储在主Communicator类的数组/列表中 - 当
Communicator收到一条消息时,它通过调用Communicator类中的方法将其发送给该列表中的所有类以及该命令用于回复的类(发回一条消息)。
例子:
- 继承Ability的类:
Greet和Backflip - 用户输入:“后空翻”
- “做一个后空翻”被发送到 Greet 和 Backflip 类。
- 两个类都处理字符串
- 类 Backflip 检测到后空翻命令并以 “Backflip” 回复
这种解决方案的规模如何?另一个主要目标是让其他人更容易实现自己的能力并将其纳入计划,类似于Hubot。
【问题讨论】:
-
如果您要将
Ability与动词或短语相关联,那么您可能会考虑使用字典或类似工具来存储可以处理每个特定动词/短语的Ability对象.此外,出于可扩展性的目的,最好不要对Ability对象的列表进行硬编码,而是有一些在运行时配置它们的机制,这样您将来就可以添加更多的功能而无需接触您的@987654334 @类。 -
您建议在这里使用什么样的自动机制?
-
至少在
Communicator上使用控制反转,这样它就不会知道Ability的实现。您的程序在代码中设置它们。即使它仍然是硬编码的,您也可以通过这种方式实现更松散的耦合。如果它还需要更加动态,也许它会在运行时通过 .config 文件确定它们。或者通过某种插件模式的实现。但主要思想是Communicator不知道将使用哪些Ability类,它是由您的程序在别处告诉的。 -
听起来很聪明。您认为该解决方案是否具有其他可扩展性?你会采取不同的方式吗?
-
语言处理需要有多复杂?我可以看到一些潜在的需要在两者之间有一个解析器来计算特定的命令。实际上,
Backflip能力是否需要理解除Backflip以外的任何命令?它不应该负责解析语言(即不需要知道Do a的含义)。
标签: c# inheritance scalability