Python - Опции доступа к атрибутам / методам класса из других классов при сохранении инкапсуляции классов? - PullRequest
0 голосов
/ 06 марта 2020

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

У меня есть один класс AlienInvasion, который инициализирует кучу игровых объектов и запускает l oop для игры (в настоящее время он также делает некоторые другие вещи, которые, вероятно, должны быть в их собственных классах). Когда я создаю каждый объект, я передаю ему объект AlienInvasion, чтобы каждый класс мог получить доступ к объектам, с которыми ему нужно взаимодействовать. Например, вот класс, который проверяет события и отвечает на них:

import sys

import pygame


class EventHandler:

    def __init__(self, ai_game):
        """Initialize attributes."""
        self.ai_game = ai_game
        self.settings = ai_game.settings
        self.display = ai_game.display
        self.stats = ai_game.stats
        self.sb = ai_game.sb
        self.ship = ai_game.ship

    def check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.sb.record_high_score()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_button(mouse_pos)

    def _check_keydown_events(self, event):
        """Respond to keypresses."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            self.ai_game.quit()
        elif event.key == pygame.K_SPACE:
            self.ship.fire_bullet()
        elif event.key == pygame.K_e and not self.stats.game_active:
            self.settings.set_difficulty(self.settings.easy)
            self.ai_game.start_game()
        elif event.key == pygame.K_n and not self.stats.game_active:
            self.settings.set_difficulty(self.settings.normal)
            self.ai_game.start_game()
        elif event.key == pygame.K_h and not self.stats.game_active:
            self.settings.set_difficulty(self.settings.hard)
            self.ai_game.start_game()

    def _check_keyup_events(self, event):
        """Respond to key releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _check_button(self, mouse_pos):
        """Set the difficulty setting."""
        if self.display.easy_button.rect.collidepoint(mouse_pos):
            self.settings.set_difficulty(self.settings.easy)
            self.ai_game.start_game()
        elif self.display.normal_button.rect.collidepoint(mouse_pos):
            self.settings.set_difficulty(self.settings.normal)
            self.ai_game.start_game()
        elif self.display.hard_button.rect.collidepoint(mouse_pos):
            self.settings.set_difficulty(self.settings.hard)
            self.ai_game.start_game()
        elif self.display.quit_button.rect.collidepoint(mouse_pos):
            self.ai_game.quit()

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

Мне интересно узнать, как сделать мой код более ремонтопригодны. Я провел последние несколько дней в поисках ответа. Я не видел ничего, что объясняло бы, как я должен обрабатывать взаимодействия объектов (или, точнее, я не видел ничего, что я мог бы распознать как нечто, что я мог бы / должен применить здесь, чтобы минимизировать, сколько каждый объект «знает» о другом объекты).

Полный код можно посмотреть по адресу https://github.com/nmoore32/Space-Invaders-Clone

...