Politika na bazi dizajna

S Vikipedije, slobodne enciklopedije

Politika na bazi dizajna, takođe poznata kao politika zasnovana na klasi dizajna ili politika na bazi programiranja, je kompjuterska paradigma programiranja na osnovu idioma za C++ poznat kao politika.[1] Ona je opisana kao sastavni deo strategije obrasca, a ima veze i sa C++ šablonom metaprogramiranja. To je prvi popularisao Andrej Alekandresku sa svojom 2001 knjigom Moderan C++ dizajn i svojom kolumnom generičko <Programiranje> u C/C++ korisničkom Journal-u.

Iako tehnika može teoretski da se primeni na druge jezike, trenutno je usko povezana sa C++, i zavisi od pojedinih set funkcija tog jezika. Osim toga, čak i u C++ se zahteva prevodilac sa veoma robusnom podrškom za šablone, što nije bilo uobičajeno pre oko 2003 godina.

Pregled[uredi | uredi izvor]

Centralni idiom u kreiranju polisa zasnovanih na dizajnu je klasa šablon (naziva se domaćin klasa), uzimajući nekoliko tipova parametra kao ulaz, koji su instacirani sa tipovima odabranih od strane korisnika (tzv klase polisa), svako sprovođenje određenog implicitnog interfejsa (zove se polisa), i inkapsulirajući neki ortogonalan (ili uglavnom ortogonalnu) aspekt ponašanja instanciranog domaćina klase. Po snabdevanju klase domaćina u kombinaciji sa nizom različitih, konzerviranih implementacija za svaku politiku, biblioteku ili modul može da podrži eksponencijalan broj različitih kombinacija ponašanja, rešenih u pravo vreme, i izabranih mešanjem i odgovaranjem na različite klase, izdate političkom primernom za domaćina klase šablona. Osim toga, pišući prilagođenu implementaciju date politike, biblioteka zasnovane na politici može da se koristi u situacijama koje zahtevaju ponašanja nepredviđenih od biblioteke realizatora. Čak i u slučajevima kada se ne koristi više od jednog sprovođenja svake politike, raspad klase u politiku može da pomogne procesu dizajniranja, povećanjem modularnosti i naglašavanjem upravo tamo gde su napravljene ortogonalne odluke dizajna.

Dok se sklapaju softverske komponente od izmenjivih modula i dalje je dalek od novog koncepta, politika zasnovana na dizajnu predstavlja novinu u načinu na koji se odnosi taj koncept u (relativno niskom nivou) definisanju ponašanje pojedinačne klase. Klase politike imaju neku sličnost sa callbacks-om, ali se razlikuju u tome, što se sastoje od jedne funkcije, klase politike obično sadrže nekoliko povezanih funkcija (metode), često u kombinaciji sa stanjem varijabli ili drugim objektima, kao što su ugnježdene vrste. Politika zasnovana na klasi domaćina se može posmatrati kao tip metafunkcije, uzimajući skup ponašanja koji predstavljaju tipove kao ulaz i vraćaju izlaz kao tip predstavljanja rezultata kombinovanja tih ponašanja u funkcionalnu celinu. (Razlika MPL metafunkcije, međutim, je izlaz koji obično predstavlja instanciranje samo klase domaćina, a ne umetnute izlaz tipove.)

Ključna karakteristika polise idioma je da, obično (mada nije strogo neophodno), domaćin klasa proističe iz (pravi svoju klasu dete) svake od njegovih klasa politike korišćenja (javno) višestrukog nasledstva. (Alternative za domaćin klasu samo sadrže članovi promenljive svake vrste politike klase, drugo da nasledi klase politike privatnosti, ali nasleđivanja klase politike javno ima veliku prednost jer klasa politike može dodati nove metode, koje je naslijedila instancirana domaćin klasa i dostupne su korisnicima, za koje klasa domaćin sama ne mora da zna). Značajna karakteristika ovog aspekta politike idioma je da, u odnosu na objektno-orijentisano programiranje, politika će obrnuti odnos između osnovne klase i izvedene klase - dok se u OOP interfejsu tradicionalno zastupa (apstraktno) osnovna klasa i implementacija interfejsa za izvedene klase, i kreiranje politika zasnovanih (domaćin) klasa predstavlja interfejs i baze (politika) nastave koja ih sprovodi. Takođe treba napomenuti da u slučaju politike, javno nasledstvo ne predstavlja is-a odnos između domaćina i klasa politika. Iako bi se tradicionalno smatralo dokazom dizajn defekta u OOP kontekstima, ovo ne važi u kontekstu politike idioma.

Nedostatak politike u njihovoj sadašnjoj inkarnaciji je da interfejs politika nema direktnu, eksplicitnu zastupljenost u kodu, već je implicitno definisana, preko patka kucanja, i mora biti dokumentovano odvojena i ručna, u komentarima. Osnovna ideja je da se koristi istovremenost-varijabilnost analize podele tipa u fiksnoj realizaciji interfejsa, politika na bazi dizajna, kao i različite politike. Trik je da zna šta je u glavnoj klasi, a šta politika treba da stvori. U tekstu gore naveden je sledeći odgovor: gde god da bi trebalo da napravimo moguća ograničavanja dizajn odluka, trebalo bi da odložimo tu odluku, trebalo bi da ga prenesemo u odgovarajućem imenu politike.

Klase politike mogu da sadrže primenu, definicije tipa i tako dalje. U osnovi, dizajner glavne klase šablona će definisati šta klase politika treba da obezbedi, što prilagođenje tačke mora da sprovede.

To može biti delikatan zadatak da stvori dobar set politike, samo pravi broj (npr minimum potreban). Različito prilagođavanje poena, koji pripadaju zajedno, treba da idu u jedan argument politike, kao što su politika skladištenja, politika provere i tako dalje. Dobro pravilo prilikom projektovanja je da ćete biti u mogućnosti da navedete ime vaše politke, koja predstavlja koncept, a ne one koja predstavlja operacije ili neke zaista male implementacije detalja. Upornost politika čini se da je dobar izbor, dok se čuva politika.

Politika na bazi dizajna može sadržati i druge tehnike koje će biti korisne, čak i ako se promeni. Jedan od primera je da se metod šablon obrazac može tumačiti za sastavljanje vremena; tako vaša glavna klasa ima kostur algoritam, koji - prilagođava tačke - poziva odgovarajuće funkcije neke od politika. Takođe će se naći u korišćenju svoje klase politika jer se koriste osobine, traženja tipa informacija, delegiranje zadataka tipa vezanih za nju, politika skladištenja je jedan primer gde može to da se desi.

Jednostavan primer[uredi | uredi izvor]

U nastavku je jednostavan (neprirodan) primer C++ hello world program, gde se štampa tekst i način štampanja da bi se razgradio koristi politiku. U ovom primeru, HelloWorld je domaćin klasa, gde je potrebno dve politike, jedna za određivanje kako treba prikazati poruku, a druga za štampanje stvarne poruke. Imajte na umu da je generička implementacija u bekstvu () i zato kod nije u stanju da bude sastavljen, osim ako su obe politike (štampanih i poruka) obezbeđene.

#include <iostream>
#include <string>
 
template <typename OutputPolicy, typename LanguagePolicy>
class HelloWorld : private OutputPolicy, private LanguagePolicy
{
    using OutputPolicy::print;
    using LanguagePolicy::message;
 
public:
    // Понашање метода
    void run() const
    {
        // Две методе политике
        print(message());
    }
};
 
class OutputPolicyWriteToCout
{
protected:
    template<typename MessageType>
    void print(MessageType const &message) const
    {
        std::cout << message << std::endl;
    }
};
 
class LanguagePolicyEnglish
{
protected:
    std::string message() const
    {
        return "Здраво свете!";
    }
};
 
class LanguagePolicyGerman
{
protected:
    std::string message() const
    {
        return "Здраво свете!";
    }
};
 
int main()
{
    /* Пример 1 */
    typedef HelloWorld<OutputPolicyWriteToCout, LanguagePolicyEnglish> HelloWorldEnglish;
 
    HelloWorldEnglish hello_world;
    hello_world.run(); // штампање "Здраво свете!"
 
    /* Пример 2 
     * Да ли је исто, али користи другу политику језика */
    typedef HelloWorld<OutputPolicyWriteToCout, LanguagePolicyGerman> HelloWorldGerman;
 
    HelloWorldGerman hello_world2;
    hello_world2.run(); // штампање "Здраво свете!"
}

Možete lako da napiše još jednu Output politiku dodavanjem nove klase sa funkcijom člana print() i to uzeti kao novu Output politiku.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]