C# 继承作为增加模块化能力的一种方式

C# 继承作为增加模块化能力的一种方式,c#,inheritance,scalability,C#,Inheritance,Scalability,我计划创建一个简单的机器人,但不想重做一次,如果将来变得更复杂的话。所以我想知道我的方法是否会在将来引起任何问题。以及是否有更好的解决方案/方法 我计划做什么: 拥有读取用户输入的通信器类 拥有一个能力类,该类具有接收消息和回复消息的基本方法 将该能力类与所有其他能力类一起继承 将所有能力类存储在主通信器类的数组/列表中 当Communicator接收到一条消息时,它会通过调用Communicator类中的方法将其发送到该列表中的所有类以及该命令用于回复的类(发回消息) 例如: 继承能力的

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

我计划做什么:

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

  • 继承能力的类:
    Greet
    Backflip
  • 用户输入:“做一次后空翻”
  • “做一个后空翻”被发送到班级问候和后空翻
  • 这两个类都处理该字符串
  • 类Backflip检测一个Backflip命令并用返回“Backflip”

这种解决方案的可扩展性如何?另外一个主要目标是让其他人更容易实现他们自己的能力,并将其包括在程序中,类似于。

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

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

此外,如果一旦你的世界变得庞大复杂,多个
能力
做出反应,会发生什么

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


除非这只是一个有趣的事情,而且不会被重征税,所以你会很好地研究某种类型的MVC框架来为你做肮脏的工作。

如果你要把一个<代码>能力>代码>与一个动词或短语联系起来,那么你可以考虑使用字典或类似的方法来存储<代码>能力> /Cord>对象(s)。可以处理每个特定的动词/短语。此外,出于可扩展性的目的,最好不要硬编码
Ability
对象列表,而是使用某种机制在运行时配置它们,这样,您就可以在将来添加更多的能力,而不必接触您的
通信器
类。您建议在这里使用哪种自动机制?至少,在
通信器
上使用控制反转,以便它不知道
能力
的实现。您的程序用代码设置它们。尽管它仍然是硬编码的,但通过这种方式实现了更松散的耦合。如果它需要更具动态性,可能会在运行时通过.config文件确定它们。或者通过插件模式的某种实现。但是主要的想法是,
Communicator
不知道将使用哪个
能力
类,这是由您的程序在其他地方告诉的。听起来很聪明。您是否认为此解决方案在其他方面是可扩展的?你会做不同的事情吗?语言处理需要有多复杂?我可以看到,在这两者之间可能需要一个解析器来分析特定的命令。实际上,
Backflip
能力是否需要理解作为命令的
Backflip
之外的任何东西?它不应该负责解析语言(也就是说,不需要知道
doa
的意思)。我编辑了我的问题并添加了这一点:另外一个主要目标是让其他人更容易实现他们自己的能力,并将他们包括在程序中。你还会推荐MVC吗?至少在ASP.NET MVC中,制作新的控制器就像从日志上掉下来一样容易…我已经从日志上掉下来了。社区里有很多支持。我建议你看看教程。看看,你会发现很多有趣的信息。我有点担心,因为上面说的是web框架,我正在考虑独立助手机器人,类似于Hubot。明白了。。。无论您是否可以使用该产品,您仍然可以从对MVC模式的少量研究中获益。从googlin的“MVC模式”开始,它将带您进入有趣的方向。