2016-04-22 3 views
1

Я планирую создать простого бота, но не хочу повторять его один раз, и если он станет более сложным в будущем. Поэтому мне интересно, если мой подход вызовет какие-либо проблемы в будущем. И если есть лучшее решение/подход.Наследование как способ добавления модульных способностей

Что я планирую сделать:

  • Есть Communicator класса, который считывает ввод данных пользователя
  • Уже Ability класса, который имеет основные методы получения сообщения и ответ на сообщение
  • Наследственных что Ability класс со всеми другими классами умений
  • Хранить все классы Ability в массиве/в основном Communicator класс
  • Когда Communicator получает сообщение, оно отправляет его всем классам в этом списке и классу, который команда предназначена для ответов (отправляет сообщение назад), вызывая метод в классе Communicator.

Пример:

  • Классы, наследуемые Способность: Greet и Backflip
  • вход Пользователь: "Do бэкфлип"
  • "Do бэкфлип" отправляется классы Приветствуйте и Backflip ,
  • Оба класса обработает строку
  • Класс Backflip обнаруживает Backflip команду и отвечает «Backflip»

Как хорошо может это своего рода масштаба решения? Также одна из основных целей - облегчить другим реализовать свои способности и включить их в программу, аналогичную Hubot.

+0

Если вы собираетесь связывать «способность» с глаголом или фразой, то вы можете подумать о том, чтобы иметь словарь или подобное хранилище объектов (возможностей) «Способности», которые могут обрабатывать каждый конкретный глагол/фразу. Кроме того, для целей расширяемости было бы лучше не жестко кодировать список объектов «Способность», а скорее иметь какой-то механизм, который настраивает их во время выполнения, чтобы вы могли добавлять дополнительные возможности в будущем, не прикасавшись к своему «Communicator» 'класс. –

+0

Какой автоматический механизм вы предлагаете использовать здесь? – Shard

+0

Как минимум, используйте инверсию управления на «Communicator», чтобы он не знал о реализациях «Способности». Ваша программа устанавливает их в коде. Несмотря на то, что он по-прежнему жестко закодирован, вы достигли более свободной связи таким образом. Если он должен быть более динамичным, возможно, он определяет их во время выполнения через файл .config. Или через какую-то реализацию плагина. Но основная идея заключается в том, что «Communicator» не знает, какие классы «Способности» будут использоваться, о чем говорится в вашей программе в другом месте. –

ответ

1

Понятное дело, то, что вы описываете, мало чем отличается от MVC ... где ваш Ability хорошо отображает контроллер, и ответ сопоставляется с представлением. Возможно, вы даже сможете кооптировать структуру MVC, такую ​​как ASP.NET/MVC.

Что отличает MVC от того, что вы описываете, так это типичный маршрутизатор, который направляет входящие команды на определенные контроллеры, а не передает сообщение всем контроллерам, чтобы решить, могут ли они ответить. Трансляция вашего рассмотрения кажется немного излишней ... в том, что каждый Ability должен разобрать и принять решение ответить. Это представляет проблему масштабируемости ... особенно много разговоров происходит в одно и то же время.

Кроме того, что произойдет, если, как только ваш мир станет большим и сложным, несколько Abilities ответили?

В MVC маршрутизатор отвечает за отображение шаблонов во входных данных для предварительно зарегистрированных или, более вероятно, действий, основанных на соглашениях в контроллерах. Маршрутизатор будет иметь эвристику (часто впервые найденные победы) для определения того, какой контроллер вызывать. Обычно в структурах есть всевозможные способы настройки маршрутизатора.

Если это не просто забавная вещь и не будет сильно облагаться налогом, вам будет полезно исследовать структуру MVC, чтобы сделать грязную работу для вас.

+0

Я отредактировал свой вопрос и добавил этот бит: Также одна из главных целей - облегчить другим реализовать свои собственные Способности и включить их в программу. Вы по-прежнему будете рекомендовать MVC? – Shard

+0

По крайней мере, с ASP.NET MVC, создание новых контроллеров - это просто, как падение с журнала ... и я отвалился от журналов. В сообществе много поддержки. Я бы рекомендовал проверить учебник. Посмотрите на http://asp.net, и вы найдете много интересной информации. – Clay

+0

Я немного обеспокоен тем, что он говорит, что веб-фреймворк, и я думаю о самостоятельном помощнике, подобном Hubot. – Shard