Объектно-ориентированное программирование в AS3 - PullRequest
1 голос
/ 28 мая 2010

Я создаю игру в as3, в которой шары движутся и отскакивают от стен. Когда пользователь щелкает, появляется взрыв, и любой шар, который поражает этот взрыв, тоже взрывается. Любой шар, который затем попадает в этот взрыв, взрывается и т. Д.

Мой вопрос: какая структура класса будет лучшей для шаров? У меня есть система уровней для контроля уровней и тому подобное, и я уже придумала рабочие способы кодирования шаров. Вот что я сделал.

Моей первой попыткой было создать класс для Movement, Bounce, Explosion и, наконец, Orb. Все они расширяли друг друга в том порядке, в котором я их назвал. Я получил его, но с помощью Bounce, расширяющего Movement и Explosion, расширяющего Bounce, он просто не выглядит объектно-ориентированным, потому что, если бы я хотел добавить класс box, который не двигался, но взорвался? Мне нужен отдельный класс для этого взрыва.

Моя вторая попытка состояла в том, чтобы создать Движение, Отскок и Взрыв, не расширяя ничего. Вместо этого я передал ссылку на класс Orb каждому. Затем класс сохраняет эту ссылку и делает то, что ему нужно сделать, основываясь на событиях, отправляемых Сферой, таких как обновление, которое передавалось от Сферы каждый входящий кадр. Это привело бы в движение и отскок, а также взрыв, когда придет время. Эта попытка тоже сработала, но, похоже, она не выглядит правильной.

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

Мне кажется, что я ищу какую-то форму множественного наследования для классов, которые as3 не поддерживает.

Может кто-нибудь объяснить мне лучший способ сделать то, что я пытаюсь сделать? Я нахожусь в «Объектно-ориентированном», будучи классифицированным для Движения, Отказов, Взрыва и Сферы? Интерфейсы - это путь? Любые отзывы приветствуются!

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

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

Например, вы определяете интерфейс IMovable. Двигатель может справиться с этим и перемещаться вокруг таких объектов. Затем вы можете предоставить реализацию по умолчанию, скажем, MovableBase, которая может, но не должна использоваться другими объектами, через наследование или композицию.

Обратите также внимание, что состав, как правило, считается лучше и чище, чем наследство. Чрезмерное использование наследования чрезвычайно часто приводит к нарушению принципа замены Лискова , который является одним из принципов 5 SOLID . Вы можете найти множество статей о наследовании и составе в Google .

Наследование в обычном использовании на самом деле имеет тенденцию нарушать многие принципы ООП и вносить большую зависимость. Это часто рассматривается как фундаментальная концепция в ООП, но вам лучше, если вы задумываетесь об этом как об одном из многих способов добиться повторного использования кода.

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

Вы можете обнаружить, что на самом деле попытка разделить ваши сущности на несколько уровней наследования имеет мало смысла, потому что вещи становятся излишне многословными и странно переплетающимися. Однако, абстрагирование различных «аспектов» или «ролей» ваших сущностей, таких как IMovable, IBounceable, IExplodable и т. Д., Окажется полезным. Любая сущность может выбрать реализацию любого интерфейса по желанию и, таким образом, будет обработана соответствующим образом движком.

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

Greetz
back2dos

0 голосов
/ 28 мая 2010

Я думаю, вы ищете что-то вроде того, что делает PushButton Engine : использование сущностей и компонентов. Идея в том, что у вас есть класс Entity ( Orb ), который может содержать свойства шара (возможно, положение и размер) и, возможно, ваш код рендеринга. Затем у вас есть классы компонентов ( Движение , Отскок , Взрыв ), которые вы прикрепляете к своему классу сущностей.

альтернативный текст http://img.skitch.com/20100528-kph48r4t1bb73tuk8rq4b2u5f5.jpg

Компоненты должны содержать только те функции, которые они должны выполнять (т.е. компонент Bounce должен обрабатывать только когда / где Bounce, а не перемещать шар в каждом кадре). Они также должны иметь прямой доступ к классу своего владельца (сущности). Например, они могут изменять свойства (перемещение, подпрыгивание) или вызывать взрыв.

Затем можно использовать шаблон Factory, чтобы иметь отдельный класс Factory, который создает объекты и присоединяет к ним соответствующие компоненты.

0 голосов
/ 28 мая 2010

Gidday,

Это напоминает мне пример, который я прочитал не так давно, и он использовал почти те же имена классов для точно вашего примера! Если это поможет вам найти ответы, я помню, что книга была изданием Friends of Ed и называлась «Объектно-ориентированный ActionScript», и, хотя она была для AS2, концепция в AS3 та же.

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

-d

...