Návrhové vzory v ActionScript3 – úvod

Návrhový vzor je obecný popis řešení problému, který už někdo vyřešil za nás. Znamená to, že když si osvojíme alespoň základy této problematiky, ušetříme dost práce. V této sérii článků si ukážeme, jak a proč návrhové vzory používat v jazyce ActionScript 3.0, na němž je založené skriptování v Adobe Flex.

Pokud nejste příznivci produktů z platformy Flash, vězte, že ActionScript je implementací standardu ECMAScript a je tudíž příbuzný JavaScriptu a Javy.

Co jsou návrhové vzory?

Představte si guláš. Obyčejné jídlo, které lze připravit podle desítek receptů, základ je však vždy stejný – olej, cibule, paprika, pepř, sůl a maso. Tento základ lze vnímat jako návrhový vzor. Samostatné recepty pak jako jeho různé implementace.

Co potřebujeme k tomu, abychom je mohli používat?

V první řadě velmi dobré znalosti principů objektově orientovaného programování – můžete být začátečník, ale bez teoretických znalostí se nepohnete ani o píď dál. Značná dávka trpělivosti je také nutností – návrhové vzory nejsou jednoduchou záležitostí a právě jejich obecnost komplikuje snadné pochopení. Na druhou stranu: když je pochopíte, povedou vás správným směrem a usnadní a zpřesní komunikaci mezi programátory.

Rozdělení návrhových vzorů

Návrhové vzory dělíme do tří kategorií. V diplomové práci M. Dvořáka lze vyčíst vyčerpávající definice těchto kategorií – pro doplnění si je uvedeme.

Vytvářecí

Řeší problémy související s vytvářením objektů v systému. Snahou těchto návrhových vzorů je popsat postup výběru třídy nového objektu a zajištění správného počtu těchto objektů. Většinou se jedná o dynamická rozhodnutí učiněná za běhu programu.

Strukturální

Představují skupinu návrhových vzorů zaměřených na možnosti uspořádání jednotlivých tříd nebo komponent v systému. Snahou je zpřehlednit systém a využít možnosti strukturaliza­ce kódu.

Behaviorální

Zajímají se o chování systému. Mohou být založeny na třídách nebo objektech. U tříd využívají při návrhu řešení především princip dědičnosti. V druhém přístupu řeší spolupráci mezi objekty a skupinami objektů, která zajišťuje dosažení požadovaného výsledku.

Nyní už zanechme teorie a přejděme k praxi. Jako první příklad si ukážeme notoricky známý návrhový vzor Singleton / Jedináček, jehož použití je velmi jednoznačné a pochopitelné, což se ale nedá říct o implementaci v AS3.

Singleton / Jedináček

Patří do kategorie vytvářecích návrhových vzorů. Zajišťuje, aby byla možná existence pouze jedné instance třídy, k níž bude možné přistupovat odkudkoli. Ačkoli Singleton je jedním z nejjednodušších návrhových vzorů, korektní implementace v AS3 neexistuje, protože třída neumožňuje mít jiný než public konstruktor. Proto je při návrhu nutné použít nějaké méně ortodoxní postupy.

Jedináček musí umět

  • Vrátit unikátní instanci objektu
  • Vytvořit unikátní instanci, pokud ještě neexistuje
  • Vyhodit výjimku uživateli, který se snaží instanciovat třídu

Implementace

Po internetu lze nalézt nespočet implementací, které lze rozlišit podle toho, zda vyhazují výjimku nepovolené instanciace při běhu programu, nebo při kompilaci.

Přístup první – výjimka při běhu programu

Singleton.as

package {

    public class Singleton {

        private static var unikatniInstance : Singleton;
        private static var povolitVytvareniInstance : Boolean = false;

        public function Singleton()
        {
            if(!povolitVytvareniInstance) {
                throw new Error('Pristupuj pomoci Singleton.vratInstanci()');
            }
        }

        public static function vratInstanci() : Singleton
        {
            if(unikatniInstance == null) {
                povolitVytvareniInstance = true;
                unikatniInstance = new Singleton();
                povolitVytvareniInstance = false;
            }

            return unikatniInstance;
        }

    }

}

Uživatel k třídě přistupuje pomocí Singleton.vra­tInstanci(). Metoda zajištuje i vytvoření instance v případě, že ješte neexistuje. Vytvořit instanci je možné pouze v této metodě a to díky proměnné povolitVytvare­niInstance, kterou si v případě vytváření  instance nastavíme na true a pak hned zase vrátíme na false – pokud je hodnota false, program vyhodí vyjímku (viz konstruktor). Toto nastane při nepovoleném vytváření instance var promenna : Singleton = new Singleton(). Stane se tak pouze pří běhu programu.

Přístup druhý – výjimka při kompilaci

Singleton.as

package {

    public class Singleton {

        private static var unikatniInstance : Singleton; 
        public function Singleton( singletonZamek : SingletonZamek )
        {
            if(singletonZamek == null) {
                throw new Error('Pristupuj pomoci Singleton.vratInstanci()');
            }
        }

        public static function vratInstanci() : Singleton
        {
            if(unikatniInstance == null) {
                unikatniInstance = new Singleton( new SingletonZamek() );
            }

            return unikatniInstance;
        }

    }

}
internal class SingletonZamek {}

Uživatel k třídě přistupuje stejným způsobem jako v prvním přístupu tedy Singleton.vra­tInstanci(). V tomto případě však nepotřebujeme proměnnou, kterou budeme nastavovat na true či false a tím umožnovat vytváření instance.  Tuto kontrolu nám zajistí interní třída uvnitř naší třídy Singleton. Pokud je interní třída umístěná uvnitř souboru jiné třídy, je přístupná pouze v této třídě. Tento fakt nám zajistí, že je možné vytvořit instanci pouze uvnitř třídy Singleton, takže stačí v konstruktoru vyžadovat instanci této třídy. Pokud není k dispozici, vyhodíme vyjímku. V metodě Singleton.vra­tInstanci() naší interní třídu přístupnou máme, takže budeme moct vytvořit instanci, neexistuje-li ještě.

Tento přístup může na první pohled vypadat zvláštně, ale je naprosto korektní. Jeho hlavní výhodou je vyhození chyby při kompilaci (kompiler při vytváření SWF ověruje přístupnost instanciovaných tříd). Tu nám umožnuje právě interní třída, kterou vyžaduje konstruktor.

Kdy Singleton použít

  • Nelze mít více instancí třídy
    • Máte povolené jen jedno připojení do databáze
    • Instance obsahuje velké množství dat a kvůli paměti není žádoucí mít více instancí
  • Potřebujeme šetřit výpočetní výkon
    • Náročné operace budeme cachovat a při opakovaném požadavku vrátíme předpočítanou hodnotu
  • Potřebujeme mít informace přístupné napříč vrstvami aplikace
    • Bohatě se využívá v MVC architektuře
    • Konfigurace

Existuje mnoho dalších možností, jak Singleton použít. Některé z nich jsou méně korektní – možná  efektní, nicméně je nelze doporučit, protože nevedou ke kýžené architektonické čistotě aplikace.

Co vás čeká

V následujícím dílu seriálu si ukážeme, co je Object pool / Fond a jak se s ním v ActionScript3 pracuje. Příkladem bude vizuální experiment, který představí pádné důvody, proč jej použít.

Poděkování: SiteOne, s.r.o. – Váš partner na internetu v oblasti webdesignu, RIA, online marketingu a grafiky

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 9

Přehled komentářů

cavo jazyk mixing
Pepca Re: Návrhové vzory v ActionScript3 – úvod
georgiksk Jaromíre, to nedeláš dobře s těma singletonama
Viktor Bezděk Odpovědi
wdolek Re: Odpovědi
Viktor Bezděk Re: Odpovědi
František Kučera Re: Odpovědi
jos Re: Odpovědi
Franta. Singleton
Zdroj: https://www.zdrojak.cz/?p=3335