Программирование игр на Python: является ли мой объект ввода-вывода законным кандидатом на роль глобальной переменной? - PullRequest
5 голосов
/ 27 марта 2009

Я программирую игру на Python, где все операции ввода-вывода выполняются объектом ввода-вывода (в надежде, что будет легко заменить этот объект на другой, который реализует другой пользовательский интерфейс). В какой-то момент почти все другие объекты в игре должны получить доступ к системе ввода-вывода (например, распечатать сообщение, обновить позицию игрока, показать специальный эффект, вызванный игровым действием), поэтому мой вопрос таков: 1001 *

Имеет ли смысл, чтобы ссылка на объект ввода-вывода была доступна глобально?

Альтернативой является передача ссылки на объект ввода-вывода в __init__() каждого объекта, который должен его использовать. Я понимаю, что это хорошо с точки зрения тестирования, но стоит ли это в результате "загрязнения сигнатуры функции"?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 27 марта 2009

Да, это законное использование глобальной переменной. Если вы не хотите, передача другого объекта контекста, эквивалентного этому глобальному объекту, - это еще один вариант, как вы упомянули.

Поскольку я предполагаю, что вы используете несколько файлов (модулей), почему бы не сделать что-то вроде:

import io
io.print('hello, world')
io.clear()

Это распространенный способ, которым программы, которые требуют более сложных операций ввода-вывода, чем простая печать, делают такие вещи, как ведение журнала.

1 голос
/ 27 марта 2009

Да, я так думаю.

Другой возможностью было бы создание модуля loggerModule, который имеет такие функции, как print() и write(), но это будет лишь незначительно лучше.

0 голосов
/ 27 марта 2009

Нет.

Переменные слишком специфичны для передачи в глобальном пространстве имен. Вместо этого спрячьте их внутри статических функций / классов, которые могут делать с ними магические вещи во время выполнения (или вызывать другие целиком).

Подумайте, что произойдет, если IO может периодически менять состояние или если ему нужно какое-то время блокировать (как это делают многие сокеты).

Рассмотрим, что произойдет, если один и тот же блок кода будет включен несколько раз. Экземпляр переменной также дублируется?

Подумайте, что произойдет, если вы захотите иметь версию 2 с той же переменной. Что делать, если вы хотите изменить его интерфейс? Вам нужно изменить весь код, который ссылается на него?

Имеет ли смысл заражать весь код, использующий переменную, со знанием того, как она может испортиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...