Комментарии к моему дизайну v2 - PullRequest
0 голосов
/ 21 февраля 2011

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

Space Invaders Architecture V. 2.0

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

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

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

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

1 Ответ

0 голосов
/ 21 февраля 2011

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

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

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

...