Actionscript Getter / setter class & scope в OOP - PullRequest
0 голосов
/ 20 февраля 2012

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

Моя дилемма: Я хочу переместить код, содержащий состояние игры, из моего основного класса в собственный класс в 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. Если я должен вызывать мои методы получения / установки как методы экземпляра, как я могу заставить каждый другой класс ссылаться на тот же экземпляр из их соответствующих пакетов?

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

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

Вы можете сделать 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.

2 голосов
/ 20 февраля 2012

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

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

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

4) Нет.Похоже, путь.

1 голос
/ 20 февраля 2012

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

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

...