Přejít k navigační liště

Zdroják » Různé » Návrhové vzory v ActionScript3 – úvod

Návrhové vzory v ActionScript3 – úvod

Články Různé

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

Komentáře

Subscribe
Upozornit na
guest
9 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
cavo

ach jaj, to sa zle cita =]
nebolo by lepsie v kode pouzivat vyhradne anglictinu? mimo stringov samozrejme

Pepca

Jen takové malé doplnění: Singleton je pěkná prasárna. Je to jen objektový obal kolem globální proměnné a má všechny její nevýhody. Takže pokud je to možné, vyhněte se tomu. Dependency injection je obvykle mnohem vhodnější postup.

georgiksk

Singleton je jeden zo vzorov, ktorý by sa mal začiatočníkom úplne zakázať.
Prináša viac problémov ako úžitku a znižuje rozšíriteľnosť aplikácie.

Prosím, pokiaľ môžete, vyhnite sa vo vývoji používaniu singletonov.
Na tento vzor napríklad silne doplácali aplikácie používajúce staršie verzie Cairngormu.

Predtým, než to použijete niečo tak strašné ako singleton, tak si prečitajte toto: http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks

Existuje kopec lepších a flexibilnejších riešení, ktoré vývoj nezablokujú tak ľahko ako singleton. Odporúčam pozrieť Swiz framework a Mate framework, tam je implementácia vzorov vyladená celkom pekne.

Viktor Bezděk

to cavo: osobne pisu kod striktne anglicky, ale v tomto pripade jsem pouzil cestinu kde to bylo mozne, aby i ne-anglictinari vedeli co ctou.

to pepca, georgiksk: Singleton je prasarna, pokud se prasacky pouziva. Nezatracoval bych jej jen proto, ze ho lze „zneuzit“ na tisic zpusobu. Existuje mnoho prikladu, kdy je zadouci mit pouze jednu instanci tridy. Co se tyce Swiz a Mate, to je trosku jina pisnicka a MVC to nerozebirame. Krome toho oba tyto frameworky jsou urcene pro Flex a jejich pouziti v ciste AS3 prostredi je znacne nekomfortni. Kdyz uz je o MVC rec, doporucel bych spise RobotLegs, ktere sam pouzivam, a ktere lze snadno pouzivat jak ve Flexu, tak ve Flashi i AS3 projektech.

wdolek

mam ale pocit, ze ne-anglictinari asi nebudou mit zajem cist neco o programovani… programator, ktery neumi anglicky alespon „cist“, ma docela velky problem v dnesni dobe.

Viktor Bezděk

A skutecne je ceske pojmenovani promennych a metod takovy problem?

František Kučera

Čeština je v pořádku, ale i já bych se držel standardních předpon, jako jsou get, set, is…, ty se nepřekládají.

jos

Existuje mnoho prikladu, kdy je zadouci mit pouze jednu instanci tridy

a prasáčtí programátoři který se toho nedokážou držet si hážou Singletonem klacky pod nohy

když chci mít jednu instanci třídy, tak jí prostě nainstancuju jednou, v čem je problém?

btw proč by se třída která závisí na nějaký jiný třídě měla zajímat o to, kolik jejích instancí se může v aplikaci vytvořit?

Franta.

Místo „Potřebujeme mít informace přístupné napříč vrstvami aplikace – Bohatě se využívá v MVC architektuře“ asi mělo být „bohatě prasata využívají v MVC architektuře“. Můžete popsat, jak se potom takový kód testuje? Když už někdo používá MVC tak stejně injektuje modely do controleru atd. tak proč neinjektovat i „singletony“?

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.