2012-02-19 2 views
0

Справочная информация: Недавно я завершил игру tic-tac-toe в AS3, используя простой простой функциональный код, который я написал на C много лет назад. Теперь я нахожусь в поиске «правильного пути», используя методы ООП и лучшие практики. Все теперь делится на аккуратные небольшие пакеты, это выглядит красиво, и последняя часть моего путешествия - заставить всех маленьких педерастов общаться друг с другом.Actionscript Getter/setter class & scope в OOP

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

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

package com.okaygraphics.model{ 

    public class GameState { 

     private var _player1State:uint=0x00000000; 
     private var _player2State:uint=0x00000000; 
     private var _activePlayer:int=0; 


     public function get p1GameState():uint { 
      return _player1State; 
     } 
     public function set p1GameState(value:uint):void { 
      _player1State = value; 
     } 

     public function get p2GameState():uint { 
      return _player2State; 
     } 
     public function set p2gameState(value:uint):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) Это ошибка? Неужели я просто запрограммировал себя в угол?

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

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

ответ

4

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

Вы можете сделать GameState a Singleton. Это гарантирует, что любой экземпляр 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, вы могли бы сделать эти частные вары открытые статические не вары вместо:

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

Вам больше не нужны геттеры/сеттеры, и вы бы установить их от других классов, как это:

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

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

+0

это одиночный пример пример красивый. только то, что я искал; Спасибо. – okayGraphics

2

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

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

3) Не может ответить.

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

+0

+1 для ответа все 4. спасибо – okayGraphics

1

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

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