Seriál návrhových vzorů – 1. díl
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Seriál návrhových vzorů – 1. dílSeriál návrhových vzorů – 1. díl

 

Seriál návrhových vzorů – 1. díl

Google       Google       10. 4. 2012       44 514×

Znalost návrhových vzorů je jednou ze základních vlastností dobrého programátora v objektově orientovaném jazyce. V krátkém seriálu se pokusím přiblížit ty nejzákladnější z nich. V tomto díle se podíváme na utility class (knihovní třídu), singleton (jedináčka) a messenger (přepravku).

Reklama
Reklama

Co jsou návrhové vzory?

Toto je první otázka, kterou jste si (možná) položili. Návrhový vzor je způsob postupu, dle kterého upravíme náš postup při tvorbě programu. Je to, jako když stavíte dům. Můžete to udělat mnoha způsoby, ale který si vyberete? Ten který je lety ověřený a funkční. Návrhové vzory jsou ověřené programovací "styly" nebo "postupy".

Proč bych měl nějaký návrhový vzor používat?

Toto je pravděpodobně druhá nejčastější otázka. Kdykoliv něco děláme, můžeme použít dva způsoby. První způsob je ten, který funguje, a druhý je ten, kterým je to správně. Použití návrhových vzorů nám umožňuje napsat kód, ve kterém je pro jiného člověka snazší se orientovat. Jelikož jsou to ověřené způsoby, je menší šance, že uděláme chybu. Takovýchto důvodů je více. Teď si možná říkáte, že není třeba je využívat, ale až si o nich něco přečtete, uvidíte, že to má svou logiku.

Pokud si při čtení seriálu řeknete například: "Tohle dělám běžně, jen mě nikdy nenapadlo tomu říkat messenger," tak je vše v naprostém pořádku. Většina návrhových vzorů jsou velmi jednoduché a standardní postupy, jen je někdo sepsal, dal jim název a určil jim nějaká pravidla.

Pro ukázky zdrojových kódů budu používat programovací jazyk Java, protože je mi nejbližší. Správně ale tušíte, že návrhové vzory nemají s Javou vůbec nic společného a jedná se o věc, která je víceméně jazykově nezávislá.

Utility class (knihovní třída)

Začínáme trošku paradoxně. Knihovní třída návrhový vzor tak nějak je a tak trošku není. Je to osvědčený a používaný postup, který je ale lehce proti objektově orientovanému programování.

Utility class je třída, která má všechny atributy a metody statické. Ve třídě uvádíme privátní konstruktor, abychom předešli možnosti vytvoření instance. Dále také znemožňujeme od třídy dědit, což uděláme například klíčovým slovem final v Javě nebo sealed v C#. Více viz zdrojový kód.

final class KnihovniTrida{
    private KnihovniTrida(){} // privátní konstruktor
    
    public static int secti(int a, int b){
        return a + b;
    }
    
    public static double umocniOdmocni(double a){
        return Math.sqrt(a*a);
    }
}

public class Main{
    public static void main(String[] args) {
        KnihovniTrida.secti(1, 1);
        KnihovniTrida.umocniOdmocni(-5.0);
    }
}

Metody z utility class budeme tedy vždy volat staticky a objekty či proměnné, se kterými budou metody pracovat, jí musíme předat jako formální parametry. Typickým Javovským příkladem knihovní třídy je třída Math viz Java Core API.

Messenger (přepravka)

Messenger je druh třídy, která má přesně tolik atributů, kolik v ní potřebujeme "přenést" hodnot. To sice může vypadat jako úplně normální třída, přeci jen se ale v něčem liší.

Jelikož instance messengeru jsou tzv. immutable objects, atributy jsou veřejné konstanty. Tyto konstanty jsou nastaveny v konstruktoru a pak už je nelze změnit, což nám zajišťuje bezpečné předání dat. Díky tomu, že jsou konstanty veřejné, k nim lze jednoduše přistupovat. Přesto se však k těmto atributům někdy dělají gettery, ze zvyku.

Kdy messenger využijeme? Laicky řečeno, pokud potřebujeme donutit metodu, aby vracela více hodnot najednou (vrátí sice stále jen jeden messenger, ale ten má více atributů), nebo když potřebujeme předat více hodnot jedním parametrem. Typické použití: puntík se souřadnicemi. Více nám opět poví zdrojový kód.

class Puntik{ // přepravka
    public final int x;
    public final int y;
    
    public Puntik(int x, int y){
        this.x = x;
        this.y = y;
    }
}

class Platno{
    /**
     * nějaké metody, definice, konstruktory
     */
    
    public nakresliPuntik(Puntik p){
        /* nějaká implementace kreslení */
    }
    
    public nakresliPuntik(int x, int y){
        /* nějaká implementace kreslení */
    }
}

public class Main{
    public static void main(String[] args) {
        Platno pl = new Platno(); // vytvoříme instanci plátna
        Puntik puntik = new Puntik(5,5); // budeme kreslit na souřadnice 5,5
        pl.nakresliPuntik(puntik); // s využitím přepravky
        pl.nakresliPuntik(puntik.x,puntik.y); //s podivným využitím přepravky
        pl.nakresliPuntik(5,5); // špatně, bez využití přepravky
    }
}

Myslím, že z ukázkového zdroje musí být jasné, k čemu slouží přepravka. A po přečtení další části uvidíte, že třída Platno v tomto příkladu může být klidně jedináčkem.

Singleton (jedináček)

Singleton je třída, která se vyznačuje tím, jak už název napovídá, že má právě jednu instanci. Zdá se to zbytečné? Opak je pravdou. Navrhujeme-li například systém pro restauraci, restaurace bude pravděpodobně jedináček. Takovýchto případů bychom mohli vymyslet spoustu. 

Jediné instance docílíme tak, že třída bude mít jako atribut statickou konstantu dané třídy, která bude ihned inicalizována voláním privátního konstruktoru. Dále stačí vytořit k této instanci, samozřejmě statický, getter, zpravidla pojmenovaný getInstance(). Tato možnost se lehce překrývá s návrhovým vzorem static factory method (statická tovární metoda), který si popíšeme v některém z dalších dílů seriálu. Nyní se však zaměříme na příklad zdrojového kódu našeho singletonu.

class Programujte{ // jedináček, pravé Programujte je jenom jedno

    private static final Programujte INSTANCE = new Programujte(); // naše jediná instance Programujte
    
    private Programujte(){} // privátní konstruktor, zamezuje vytvoření další instance
    
    public static Programujte getInstance(){ // k té jediné se dostaneme tímto gettrem
        return INSTANCE;
    }
    
    public void vypisClanky(){
        System.out.println("Vypisuji články...");
    }
}

public class Main{
    public static void main(String[] args) {
        Programujte.getInstance().vypisClanky();
    }
}

Tím jsme u konce tohoto dílu seriálu. Doufám, že pro vás byl zajímavý. V příštím díle se můžete těšit na static factory method (statickou tovární metodu) a servant (služebníka). Máte-li nějaké připomínky, náměty či poznámky, neváhejte se podělit v komentářích.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
33 hlasů
Google
(fotka) Radek BoudaRadek Bouda studuje na Fakultě aplikovaných věd Západočeské univerzity v Plzni. Programuje v jazyce Java a zajímá se platformu .NET. Kromě programování má rád také cyklistiku, volejbal, skauting a pohyb venku obecně.
Web     Twitter     Facebook    

Nové články

Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Reklama
Reklama
Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý