ActionScript класс/область и класс setter в OOP

Предыстория: Недавно я завершил игру в стиле tic-tac-toe в AS3, используя несколько простых функциональных кодов, которые я написал на C много лет назад. Теперь я нахожусь в поиске "правильного пути", используя методы ООП и лучшие практики. Все теперь разделено на аккуратные небольшие пакеты, это выглядит красиво, и последняя часть моего путешествия - заставить всех маленьких ********** общаться друг с другом.

Моя дилемма: я хочу переместить код, содержащий состояние игры, из моего основного в него собственного класса в com.okaygraphics.model.GameState. Проблема почти в каждом пакете получает и устанавливает эти свойства состояния игры. Я пытаюсь найти самый простой способ инкапсулировать этот материал, сохраняя доступ к другим моим классам.

Где я нахожусь:

package com.okaygraphics.model{ public class GameState { private var _player1State:****=0x00000000; private var _player2State:****=0x00000000; private var _activePlayer:int=0; public function get p1GameState():**** { return _player1State; } public function set p1GameState(value:****):void { _player1State = value; } public function get p2GameState():**** { return _player2State; } public function set p2gameState(value:****):void { _player2State = value; } public function get activePlayer():int { return _activePlayer } public function set activePlayer(value:int):void { _activePlayer = value; } }
}

Qestions:

1) Нужен ли мне конструктор? Я имею в виду, моя программа никогда не будет иметь более одного GameState. Если мне нужно вызвать мои методы getters/setters как методы экземпляра, как мне получить класс друг друга, чтобы ссылаться на SAME-экземпляр из их соответствующих пакетов?

2) Мне даже нужны геттеры и сеттеры? Возможно, у класса может быть только 3 общедоступных объекта? Если да, то каким образом я мог бы получить надлежащий охват в отношении моих других классов?

3) Должен ли я назначать все самому классу, используя ключевое слово static? Если да, то как мне реализовать и использовать эти статические методы?

4) Это ошибка? Неужели я просто запрограммировал себя в угол?

Это кажется довольно распространенной задачей, но тем не менее я до сих пор не совсем понимаю. Было бы весьма полезно получить краткое объяснение, некоторые ссылки или название техники, в которой я нуждаюсь.

Спасибо заранее, -Max

3 ответа

Вы могли бы подойти к этому несколько разных способов.

Вы можете сделать GameState синглтон. Это гарантирует, что любой экземпляр GameState будет одним и тем же экземпляром. Вот как это сделать:

private static var _gameState:GameState;
private static var _allowInstantiation:Boolean;
public function GameState()
{ if (!_allowInstantiation) { throw new Error("GameState is a Singleton. Use GameState.getInstance() instead of new GameState()."); } else { _allowInstantiation = false; }
}
public static function getInstance():GameState
{ if (!_gameState) { _allowInstantiation = true; _gameState = new GameState(); } return _gameState;
}

Затем, в любое время, когда вы хотите получить GameState, вы используете этот синтаксис:

var _gameState:GameState = GameState.getInstance();

Используя Singleton, вы все равно можете использовать получатели и сеттеры, которые вы уже сделали, но Singleton обеспечит доступ к каждому классу, который обращается к GameState, к одному экземпляру.

Или, если вы не хотите использовать Singleton, вы можете сделать эти частные vars общедоступными статическими vars:

public static var player1State:****=0x00000000;
public static var player2State:****=0x00000000;
public static var activePlayer:int=0;

Вам больше не понадобятся геттеры/сеттеры, и вы бы установили их из других классов следующим образом:

GameState.player1State = 0xFF0000;
GameState.player2State = 0xFF0000;
GameState.activePlayer = 1;

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


1) Что вы можете сделать, так это создать одноэлементный класс. Это класс, который только один раз намечен. Быстрый google вокруг (это поиск stackoverflow для AS3 Singleton), и вы должны найти хорошие примеры одноэлементного класса. С помощью singleton вам нужно включить класс GameState, и вы получите доступ только к одному.

2) Может только делать больше пользы, чем вред, когда в дальнейшем появляются геттеры и сеттеры.

3) Не могу ответить.

4) Нет. Похоже на то, как идти.


Я настоятельно рекомендую вам посмотреть шаблон дизайна MVC и использовать его в своей игре. (Состояние игры является частью модели.)

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

licensed under cc by-sa 3.0 with attribution.