Sablonfüggvény programtervezési minta

A számítógép-programozásban a sablonfüggvény programtervezési minta vagy röviden sablonfüggvény minta egy olyan viselkedési, tervezési minta, amely egy sablonfüggvény nevű metódus algoritmusával definiálja a program vázát. Ezek némely lépése felüldefiniálható alosztályokban.[1] Lehetővé teszi egyes algoritmusok lépéseinek az újradefiniálását anélkül, hogy az algoritmus struktúrája megváltozna.[2]

Az itt használt sablon kifejezés alatt nem a „C++” -os sablonokat kell érteni.

Bevezetés szerkesztés

Ebben a tervezési mintában a sablonmetódusnak egy vagy több algoritmikus lépése felüldefiniálható az alosztályokban, megengedve eltérő viselkedéseket, miközben a teljes algoritmus lényegében változatlan.[1]

Az objektumorientált programozásban az elsőnek létrehozott osztály biztosítja a tervezési algoritmus alaplépéseit. Ezek a lépéseket az absztrakt metódusok valósítják meg. Később, az alosztályokban az absztrakt metódusokat megváltoztatva jönnek létre a valódi változások.[3] Így az általános algoritmus egy helyen van definiálva, de a konkrét lépések változtathatóak az alosztályokon keresztül.

A sablonfüggvény minta így kezeli a nagyobb szemantika képeit. Ezt a nagyobb képet absztrakt vagy nem absztrakt metódusnak hívják. A nem absztrakt metódusokat teljesen a tervezési minta irányítja, de az absztrakt metódusok az alosztályokban vannak megvalósítva, ezáltal biztosítva a minták erejét és a szabadság mértékét. A tervezési minták absztrakt osztályai szintén meghatározzák a „hook” metódusokat is, melyeket az alosztályokban lehet felül definiálni.[2] Néhány, vagy akár az összes absztrakt metódus specializált lehet egy alosztályban, engedélyezve az írójának bizonyos viselkedéseket minimális módosításokkal a nagyobb szemantikáért. A sablonfüggvény változatlan marad ebben a mintában, biztosítva az alárendelt nem absztrakt és absztrakt metódusok meghívását az eredetileg tervezett szekvenciában.

A sablonfüggvény tervezési minta gyakran előfordul, legalábbis a legegyszerűbb esetben, ahol a metódus csak egyetlenegy absztrakt metódust hív meg egy objektumorientált nyelvben. Ha egy szoftverprogramozó többalakú metódust használ végig, lehet, hogy ez a tervezési minta lesz a természetes velejárója. Ez azért van, mert egy absztrakt vagy többalakú függvény hívása maga az indoka az absztrakt vagy többalakú metódusnak. A sablonfüggvény mintát arra is lehet használni, hogy azonnal plusz értéket adjunk egy szoftvernek.

A sablonfüggvény minta implementációk valósítják meg a védett változók GRASP elvet, mint ahogy az illesztő minta teszi. A különbség annyi, hogy az illesztő minta ugyanazt az interfészt adja néhány operációval, míg a sablonfüggvény minta csak egyet ad egynek.

Struktúra szerkesztés

 
Sablonmetódus: UML osztálydiagramban
 
Sablonmetódus LePUS3-ban (legend)

Használata szerkesztés

A sablonfüggvény minta leginkább keretrendszerekben használatos. Álljon itt egy példa a kontroll megfordításával kapcsolatosan.

Érvek a sablonfüggvény minta használata mellett:[3]

  • Lehetővé teszi az alosztályok megvalósítását (metódus felülírással) változó viselkedésekkel.[4]
  • Megóv a kódismétlésektől: Az általános folyamat struktúrát csak egyszer valósítjuk meg az absztrakt osztály(ok) algoritmusában.[4]
  • Azoknál az alosztályoknál irányít, ahol megengedett. Szemben egy egyszerű többalakú felülírással, ahol az alap metódus teljesen újraírt lenne, amely radikális változásokat hozna a folyamatba, itt csak egy speciális részlete változik a folyamatban.[4]

Az irányító struktúra az eredménye az alkalmazásnak a tervezési mintából gyakran említve van „Hollywood” alapelvként. Ezt az alapelvet használva, a sablonfüggvény minta egy szülő osztályban irányítja az egész folyamatot, az alosztályok metódusainak meghívásával, ahol szükséges. Ezt láthatjuk a lentebbi Java kódban:

A sablonfüggvény tervminta hasznos, ha automatikusan generált kóddal kell együttműködni. A nehézség abban áll, hogy ha változik a forrás,akkor változik a generált kód is. Ezt még kézi módosítások is változik. Ezt a sablon tervminta használatával ez megoldható, mivel így elkülöníthetők a generált és a kézileg módosított kódrészek. A sablon osztály lehet absztrakt osztály, vagy lehet interfész.[5]

Példa szerkesztés

/**
 * An abstract class that is common to several games in
 * which players play against the others, but only one is
 * playing at a given time.
 */
 
abstract class Game {
 
    protected int playersCount;
    abstract void initializeGame();
    abstract void makePlay(int player);
    abstract boolean endOfGame();
    abstract void printWinner();
 
    /* A template method : */
    public final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}

//Now we can extend this class in order
//to implement actual games:

class Monopoly extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Initialize money
    }
    void makePlay(int player) {
        // Process one turn of player
    }
    boolean endOfGame() {
        // Return true if game is over
        // according to Monopoly rules
    }
    void printWinner() {
        // Display who won
    }
    /* Specific declarations for the Monopoly game. */
 
    // ...
}

class Chess extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Put the pieces on the board
    }
    void makePlay(int player) {
        // Process a turn for the player
    }
    boolean endOfGame() {
        // Return true if in Checkmate or
        // Stalemate has been reached
    }
    void printWinner() {
        // Display the winning player
    }
    /* Specific declarations for the chess game. */

    // ...
}

Fordítás szerkesztés

Ez a szócikk részben vagy egészben a Template method pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Jegyzetek szerkesztés

  1. a b Template Method, Design Patterns. Addison-Wesley, 325–330. o. (1994). ISBN 0-201-63361-2 
  2. a b Head First Design Patterns (paperback), O'REILLY, 289, 311. o. (2004). ISBN 978-0-596-00712-6. Hozzáférés ideje: 2012. szeptember 12. 
  3. a b Template Method Design Pattern. Source Making - teaching IT professional. (Hozzáférés: 2012. szeptember 12.) „Template Method is used prominently in frameworks.”
  4. a b c Chung, Carlo. Pro Objective-C Design Patterns for iOS. Berkely, CA: Apress, 266. o. (2011). ISBN 978-1-4302-3331-2 
  5. Pattern Hatching: Design Patterns Applied. Addison-Wesley Professional, 85–101. o. (1998. június 22.). ISBN 978-0201432930