Комментарии к моему дизайну v2

Я опубликовал не так давно диаграмму классов для приложения, которое я делаю. Получил несколько полезных советов и принялся за работу. Конечно, дизайн — это сложно! В любом случае, я сделал версию 2.0, но столкнулся с другими вещами. Может быть, кто-нибудь может дать указатели, комментарии или советы относительно моей диаграммы классов :-)

Архитектура космических захватчиков, версия 2.0

Сначала у меня была «Скорость» в SomeInterface как часть абстрактного класса Sprite. Поразмыслив, я понял, что это не лучшее место для «Скорости». Не очень хорошо было то, что я не смог дать правильное имя интерфейсу и не знал, куда поместить «Скорость» в разделе «Атрибуты» или «Операции», поскольку это свойство...

Каждый объект (Пуля, Захватчик, Корабль) движется со своей скоростью, поэтому я добавил «Скорость» в интерфейс. Все объекты наследуются от суперкласса Sprite и переопределяют только метод Update(). Абстрактный класс Bullet ничего не делает с методом Update, полученным от Sprite, он просто показывает, что он получил его оттуда. Я не знаю, правильный ли это способ, или я должен оставить его и показывать только в классах, которые его переопределяют?

Еще одна проблема, с которой я не знаю, как справиться, это анимация, которую делают захватчики. Я получил следующие свойства: SheetSize, FrameSize и CurrentFrame. Лист содержит изображения пришельцев (например, флип-книгу), FrameSize предназначен для выбора только кадра на листе, а CurrentFrame... ну, содержит текущий кадр. Поскольку Корабль и Пуля не анимируются, эти свойства для них бесполезны. Куда их положить?

Наконец, я не знал, где реализовать IBulletBehavior. Сначала у меня было каждое поведение пули, реализующее IBulletBehavior, но я переключился на то, чтобы позволить реализовать его абстрактному классу Bullet. Есть ли какое-то правило, которое говорит, какой из них взять?


person TheDude    schedule 21.02.2011    source источник
comment
Медленно, быстро, разрушительно звучит плохо для классов ИМХО, это больше похоже на действие, чем на объекты. И действительно ли Пуля Спрайт? Или просто какой-то объект спрайта должен рисовать пули?   -  person Dainius    schedule 21.02.2011
comment
Буллит должен быть спрайтом, да. Это объект, который перемещается по экрану. Или вы, возможно, имеете в виду, что я не должен использовать для этого спрайт, потому что он не анимирован? Объекты «Медленный», «Быстрый» и «Разрушительный» являются частью шаблона стратегии — динамическое поведение и т. д.   -  person TheDude    schedule 21.02.2011


Ответы (1)


Абстрактные классы описывают, что такое класс. Вам не нужно реализовывать реальную функциональность вызовов методов, поэтому не думайте, что вам нужно реализовать все, что касается пули, в вашем классе Bullet. Кроме того, интерфейсы отлично подходят для описания того, на что способен ваш класс. Абстрактные классы показывают, чем что-то является (Is-A), а интерфейсы описывают, что может делать класс.

(Я не знаю, является ли это просто упражнением по классу/интерфейсу или вы на самом деле делаете игру. Если это просто упражнение, вы можете перейти к следующему абзацу). Что касается вашего интерфейса SomeInterFace, как насчет чего-то вроде IMoveable или IMobile? Здесь вы также можете посмотреть математические векторы. Интерфейс не должен раскрывать скорость, если только вы не хотите, чтобы объекты, не реализующие его, взаимодействовали со скоростью. Вместо этого это должно быть что-то вроде Move() и/или DetectCollision(). Внешние взаимодействия происходят в интерфейсе — вы рассказываете миру, что вы можете сделать.

Наконец, что такое IBulletBehavior и почему спрайт должен заботиться об этом? Это возвращается к описанию того, что может сделать ваш класс. Пуля — это спрайт, но реализующий IBulletBehavior (что бы это ни было). Вы хотите, чтобы все спрайты реализовывали IBulletBehavior? Что происходит, когда вы хотите, чтобы камень или что-то еще стояло на пути игрока? Теперь у вас будет объект, который не реализует указанное поведение.

person Jim D'Angelo    schedule 21.02.2011
comment
Да, я пытаюсь сделать игру :-) Мой абстрактный класс реализует только метод Draw(). Кажется, я понимаю, что ты пытаешься сказать Спидом. Может вместо свойства приватная переменная и метод? Но нельзя ли то же самое сделать с собственностью? IbulletBehavior не должен находиться в классе Sprite, так как другие классы также могут наследовать от спрайта, и само по себе поведение маркера не требуется. IBulletBehavior существует потому, что инопланетяне могут стрелять каждой из трех пуль. Мне нужно было какое-то динамическое изменение поведения (паттерн стратегии). - person TheDude; 21.02.2011
comment
Я думаю, что лучшим названием для такого интерфейса было бы что-то вроде IShooter. Затем у вас может быть куча классов, которые могут реализовать это, и когда наступит их очередь, они могут запустить свои раунды (и игре все равно, как они это реализуют). Ваши интерфейсы должны четко описывать, что может делать реализующий объект. - person Jim D'Angelo; 21.02.2011