Разочарование в дизайне классов при переходе с Java на ActionScript - PullRequest
4 голосов
/ 13 ноября 2010

Я в основном работаю на Java, но недавно я начал использовать ActionScript 3.0 для многопользовательской Flash-игры, которую я помогаю разрабатывать.Проект находится на ранней стадии, поэтому я все еще работаю над структурой классов.Я продолжаю сталкиваться с ограничениями на языке ActionScript, когда пытаюсь использовать многие функции ООП, которые ожидаются в Java.

Например:

  • Мне нужен абстрактный класс Character,Нет никаких причин, по которым Character когда-либо будет создаваться, но ActionScript не поддерживает абстрактные классы.В результате мой код имеет этот комментарий вверху:

Символ должен быть абстрактным классом, но AS не поддерживает абстрактные классы.

НЕ СОЗДАТЬ ANМОМЕНТ ЭТОГО КЛАССА.(Только экземпляры классов, которые расширяют этот класс (например, Player, Zombie))

  • В результате разработки Flixel (библиотеки, которую мы используем), мне нужно иметь CharacterGroup класс с внутренним классом Character, так что CharacterGroup может также содержать другие спрайты, такие как оружие и прочее.В Java я бы использовал внутренний класс.ActionScript не поддерживает внутренние классы.Существует нечто, называемое «вспомогательный класс», но вспомогательные классы не наследуются, что делает их бесполезными в этом контексте.

Мой вопрос таков: способность ActionScript работать с дизайном ООП менее развита?или я нахожу ActionScript таким разочаровывающим, потому что я пытаюсь написать его так, как если бы он был Java, вместо того чтобы разбираться в том, как разрабатывался ActionScript?

Другими словами, является ли «правильный» способ создания ОО-дизайна другимв ActionScript, чем в Java?

(Примечание: я не спрашиваю мнения о том, почему ActionScript лучше / хуже, чем Java. Я только спрашиваю, правильно ли я пишу код или пытаюсь тянуть слишком многомоего опыта с Java.)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010

AS3 не пропускает функции, и вы не можете определить его как «менее развитый».

Во-первых, для вашей проблемы - существуют способы обойти методологию абстрактного класса.Для вашего абстрактного класса Character - вы можете сделать так, чтобы пользовательский разработчик получил ошибку при попытке его создания.

package com.strangemother.database.abstract
{ 

    public class CentralDispatch extends EventDispatcher
    {
        private static var _centralDispatch:CentralDispatch;


        public static function getInstance():CentralDispatch
        {
            if(!_centralDispatch)
                _centralDispatch = new CentralDispatch(SingletonLock);

            return _centralDispatch;

        }

        public function CentralDispatch(lock:Class)
        {
            if(!lock is SingletonLock)
            {
                throw new Error("CentralDispatch is a singleton. Use CentralDispatch.getInstance() to use.");
            }
        }

    }
}

internal class SingletonLock{}

КАК вы можете видеть - это должно использоваться методом .getInstance - нов дополнение к этому, только этот класс может создать новое собственное существо, поскольку единственный класс которого может видеть внутренний класс SingletonLock {}.Для вашей цели - вы можете удалить метод 'getInstance ()' и заставить пользователя другим способом получить экземпляр этого класса.

Это также должно отображать возможность создания внутренних классов.Они не могут быть видны никакому другому классу - только этот пакет и родительский класс CentralDispatch могут использовать его.


Другой способ, которым вы можете использовать метод абстрактной функции - это записать затем в interface

package com.strangemother.database.engines
{
    import com.strangemother.database.Model;
    import com.strangemother.database.ModelSchema;
    import com.strangemother.database.events.ModelEvent;

    public interface IEngine
    {
        /**
         * Reads modelSchema and calls generateModel upon
         * each model found.
         * */
        function generateModelSchema(modelSchema:ModelSchema=null):String

        /**
         * Generate your CREATE syntax model to output to your SQL
         * 
         * If you are extending the framework with your own database
         * engine, you must override this with your own model generation
         * format.
         * */
        function generateModel(model:Model):String

    }
}

затем в любой момент, чтобы использовать это, вы реализуете его на уровне класса

public class SQLite3 extends EngineBase implements IEngine
{

теперь мой класс SQLite3 должен иметь методы, определенные в IEngine


Я предпочитаю писать классы с определенными функциями, которые переопределяются при реализации.

AbstractBase.as

/**
         * connect to the database. This is not usually
         * required as the abstraction layer should
         * automatically connect when required.
         * */
        public function connect(onComplete:Function=null):void
        {

SQLite3 из которых расширяется AbstractionBase в некоторый момент

overide public function connect(onComplete:Function=null):void

Теперь, чтобы опровергнуть @ комментарий Аллана о том, что он менее развит (Извините, чувак)

Нет перегрузки операторов - это правильно, но и Java тоже.он не был применен для обеспечения читабельности AS3.

Перегрузка функции - вы не можете ввести ее жестко, но вы можете function makeTea(...args) передавать столько данных, сколько вам нужно.у вас также есть getter / setters.

для встроенных функций вы можете создавать анонимные функции.

var myFunction:Function = Function(name:String):String{ return name + ' - rocks!'; }

У вас есть динамические классы, поэтому перегрузка уровня класса -


и хорошим примером реального кода является Flex Lib - он с открытым исходным кодом, и вы можете прочитать, как все эти элементы управляются, просматривая код.

2 голосов
/ 13 ноября 2010

Это несколько субъективно, но лично я бы сказал, что «правильный» способ проектирования ОО в AS3 такой же, как в Java, и да, AS3 чуть менее развит.

AS2 был очень прототипомоснованный на JavaScript в настоящее время, хотя, как и в случае с JavaScript, вы все равно можете программировать его в соответствии с классическим стилем.Затем появился AS3, основанный на проекте редакции ECMAScript 4. Обновление ECMAScript сделало его более классическим, похожим на Java (JavaScript 2, который собирался основываться на нем, но был отброшен, поскольку члены комитета считалисьэто изменилось слишком сильно).Итак, хотя AS3 теперь является более классическим языком стилей Java, как вы выяснили, в нем мало возможностей языка.Вдобавок ко всему мне не хватает таких вещей, как:

  • перегрузка оператора
  • перегрузка функции
  • обобщение
  • абстрактные классы
  • встроенные функции
  • внутренние классы, на которые вы указали

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

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

* Вы также можете попробовать взглянуть на язык Haxe .Код компилируется в LLVM в байт-код ABC.Язык Haxe поддерживает дженерики, встроенные функции, условную компиляцию (и многое другое).Я использую его всякий раз, когда пишу библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...