Как правильно спроектировать «космический корабль»? Здравствуйте, это снова я. Есть космический корабль. Класс Ship. В нем лежит массив отсеков корабля. Класс Hardpoint. В каждом отсеке может быть установлено оборудование. Там такая схема - IEquipment - базовый абстрактный класс, определяет общие параметры вроде массы, размеров и т.д. Наследники IEquipment - типы оборудования, Generator, Engine и т.д. Ну и их экземпляры, лежащие в отсеках - конкретные модели этого оборудования. Проблема в их действии. Простой пример - двигатель определяет скорость корабля (физика, прости). Соответственно чтобы внешние скрипты (движения в данном случае) узнавали скорость корабля пришлось разместить свойство Speed в главном классе (Ship), которое проходит по всем двигателям на корабле и считывает результирующую скорость с них. Проблема в том, что по ходу разработки добавляется множество новых свойств и все это висит в Ship. Это нормально или это плохая архитектура и нормальные люди делают все по другому? В общем, прошу гуру проанализировать это и вынести вердикт.
По-моему, в вашем случае можно применить паттерн проектирования "Посетитель". Этот паттерн позволяет добавить новые операции к классам объектов, не изменяя их самодийный код.
Вы можете создать интерфейс Visitor с методами для обработки каждого типа оборудования. Затем создайте классы-посетители, реализующие этот интерфейс и содержащие логику для работы с конкретными типами оборудования.
Далее вам нужно добавить метод accept(Visitor visitor) в классы оборудования, чтобы они могли передать себя посетителю для обработки.
Таким образом, каждый раз, когда вам нужно обработать все типы оборудования на корабле, вы просто создаете нового посетителя и передаете его в метод accept каждого оборудования. Это позволит избежать загромождения класса Ship новыми методами и свойствами и сделает вашу архитектуру более гибкой и расширяемой.
По-моему, в вашем случае можно применить паттерн проектирования "Посетитель". Этот паттерн позволяет добавить новые операции к классам объектов, не изменяя их самодийный код.
Вы можете создать интерфейс Visitor с методами для обработки каждого типа оборудования. Затем создайте классы-посетители, реализующие этот интерфейс и содержащие логику для работы с конкретными типами оборудования.
Далее вам нужно добавить метод accept(Visitor visitor) в классы оборудования, чтобы они могли передать себя посетителю для обработки.
Таким образом, каждый раз, когда вам нужно обработать все типы оборудования на корабле, вы просто создаете нового посетителя и передаете его в метод accept каждого оборудования. Это позволит избежать загромождения класса Ship новыми методами и свойствами и сделает вашу архитектуру более гибкой и расширяемой.