команда определена в своём модуле.
При запуске бота делается os.listdir('commands') и каждый модуль запускается в цикле.
А объекты класса Command при инициализации закидываются в глобальный список команд (это прямо в конструкторе прописано).
Хочется выпилить эти глобальный список и нечистый конструктор.
Можно импортнуть каждую команду вручную вместо этого. Но можно ли сделать как-то лучше?
Есть идея ввести __commands__ = (...) в каждом модуле, и всё так же пробегаться по модулям команд и закидывать оттуда команды, лежащие в __commands__. Насколько это уместно и приемлемо?
лучше сделать какой-нибудь глобальный роутинг, и пусть сам себя нужными командами наполняет
Это очень хрупко
Возможно стоит создать некий класс CommandManager, сделать его Singleton"ом, реализовать метод register(command: Command), который будет класть комманды в аттрибут self._commands = [] и сделать getter на _commands. Затем оттуда, откуда нужно забрать все команды вызвать CommandManager и забрать все зарегестрированные.
Забудьте про синглтоны
аргументации не будет?
Гуглится в лоб "Antipattern Singleton", узнал некоторые новые детали.
Просто синглтон имеет непонятный жизненный цикл. Синглтон с доступом к экземпляру через gwtInctace() или аналог имеет все те же проблемы что глобальные переменные. В том числе, сильное сцепление программы
А как сделать норм? Только импортнуть каждую команду вручную?
Да. Это 1. Просто 2. Понятно 3. Очень гибко
Обсуждают сегодня