2010-09-02 3 views
1

При работе на ранних этапах римейка Python на основе консоли классической игры «Змея» кто-то отправил патч для появления пищи в случайных местах. Код определил класс Food, который отлично работал, но логика за ним казалась немного странной.Имеет ли смысл логика объектов?

Я думаю, что мы должны удалить пищу после ее потребления, а затем создать другую. Однако этот человек просто перемещает пищу в новое случайное место после ее потребления. Хотя последнее кажется мне нелогичным, кажется, что он делает то же самое, может быть, даже более эффективно.

Мой вопрос: было бы лучше использовать прежнюю логику или позже, или я просто ничего не собираю?

Все это началось в: https://bugs.launchpad.net/snakes-game/+bug/628180

ответ

4

Либо хорошо - в пределах определенных границ здравого смысла.

Последний подход позволит сэкономить переназначение объекта, поэтому его утилизация будет более эффективной - коэффициент усиления может быть неактуальным в вашем конкретном примере, хотя, если фрагментация кучи является проблемой (например, во встроенном приложении с очень ограниченной ОЗУ).

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

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

+0

Спасибо, очень подробное объяснение. Отвечает на мой вопрос отлично. – Zaz

4

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

Я бы поспорил, в то время как создание нового предмета пищи более логично и ближе к модели реальной жизни, перемещение более эффективно.

+0

+1: Хорошее краткое объяснение, но ответ Джейсона более подробно описывает практические последствия решений. – Zaz

1

Основная проблема, о которой идет речь в ООП, заключается не столько в том, что перепроизводство пищи происходит, либо за перемещение, а в том, что это поведение остается прозрачным вне объекта. Игровой движок должен сообщать объект «вы были съедены» и тому подобное, но как объект обрабатывает, что внутренне не должно быть известно игровому движку. Если внутренне объект поддерживает одноэлемент «пищи», а метод «потреблять» просто перерабатывает пищевой объект с новыми значениями, это прекрасно. Все это внутренне связано с реализацией «пищи» и просто не должно быть известно за пределами этого класса.

+0

+1 для хорошего объяснения базовой объектно-ориентированной логики, но некоторые из других ответов были более подробными из-за моего конкретного вопроса. – Zaz

Смежные вопросы