Я планирую создать простого бота, но не хочу повторять его один раз, и если он станет более сложным в будущем. Поэтому мне интересно, если мой подход вызовет какие-либо проблемы в будущем. И если есть лучшее решение/подход.Наследование как способ добавления модульных способностей
Что я планирую сделать:
- Есть
Communicator
класса, который считывает ввод данных пользователя - Уже
Ability
класса, который имеет основные методы получения сообщения и ответ на сообщение - Наследственных что
Ability
класс со всеми другими классами умений - Хранить все классы
Ability
в массиве/в основномCommunicator
класс - Когда
Communicator
получает сообщение, оно отправляет его всем классам в этом списке и классу, который команда предназначена для ответов (отправляет сообщение назад), вызывая метод в классеCommunicator
.
Пример:
- Классы, наследуемые Способность:
Greet
иBackflip
- вход Пользователь: "Do бэкфлип"
- "Do бэкфлип" отправляется классы Приветствуйте и Backflip ,
- Оба класса обработает строку
- Класс Backflip обнаруживает Backflip команду и отвечает «Backflip»
Как хорошо может это своего рода масштаба решения? Также одна из основных целей - облегчить другим реализовать свои способности и включить их в программу, аналогичную Hubot.
Если вы собираетесь связывать «способность» с глаголом или фразой, то вы можете подумать о том, чтобы иметь словарь или подобное хранилище объектов (возможностей) «Способности», которые могут обрабатывать каждый конкретный глагол/фразу. Кроме того, для целей расширяемости было бы лучше не жестко кодировать список объектов «Способность», а скорее иметь какой-то механизм, который настраивает их во время выполнения, чтобы вы могли добавлять дополнительные возможности в будущем, не прикасавшись к своему «Communicator» 'класс. –
Какой автоматический механизм вы предлагаете использовать здесь? – Shard
Как минимум, используйте инверсию управления на «Communicator», чтобы он не знал о реализациях «Способности». Ваша программа устанавливает их в коде. Несмотря на то, что он по-прежнему жестко закодирован, вы достигли более свободной связи таким образом. Если он должен быть более динамичным, возможно, он определяет их во время выполнения через файл .config. Или через какую-то реализацию плагина. Но основная идея заключается в том, что «Communicator» не знает, какие классы «Способности» будут использоваться, о чем говорится в вашей программе в другом месте. –