|
|||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
bootable [55]
commercial [7] no-commercial [42] unclassified [20] [7]
Software (10844)
|
Perl (61) - OOP - přínos a užití dědičnostiDnes si ukážeme hlavní výhody dědičnosti a srovnáme její použití s jinými postupy.
Vlastnosti dědičnosti si ukážeme na následující třídě. Implementujeme si třídu, která bude popisovat majitele mobilního čísla. Nejdříve si zkusíme ukázat, jak by to vypadalo bez dědičnosti, poté ji zapojíme a porovnáme výsledky. Kód nebudeme rozepisovat do detailů, půjde nám pouze o myšlenku. Co tedy bude hlavním ukolem? Musíme nějak oddělit zákazníky s předplacenou službou od tarifních zákazníků, kteří platí pravidelně za každé zúčtovací období paušální poplatek. Dva konstruktoryPrvní možností, jak daný úkol řešit, je použití jednoho druhu objektu pro oba typy zákazníků. Tedy budeme mít třídu Zakaznik a vytvoříme konstruktor. Vytvoříme dva konstruktory - jeden pro každý typ zákazníka.
Poznámka - Teoreticky by v takto zjednodušeném příkladě mohl být zákazník s předplacenou službou speciálním případem tarifního zákazníka s nulovým paušálem a bez volných minut. V tomto a následujících příkladech půjde hlavně o názornost. Užití dvou konstruktorů samo o sobě není chybou. V našem případě je ale problém v tom, že nezůstane jen u toho. Co když budeme chtít vytvořit funkci, která počítá cenu za daný počet provolaných minut? Buď bychom museli uchovávat další atribut a složitě ošetřovat podmínky nebo bychom mohli napsat dvě zvláštní metody.
Chybou je už to, že uživatel tohoto modulu musí po vytvoření objektu vědět, s jakým typem zákazníka pracuje. Pokud by zavolal funkci spocitej_cenu_u_predplacene_sluzby nad tarifním zákazníkem, došlo by k chybě. Uživatel by to musel pravděpodobně řešit podmínkou a to je znak špatně napsaného modulu. Dalším problémem je, že funkcí typu spocitej_cenu, které fungují pro každý typ zákazníka na jiném mechanizmu by mohlo být mnohem více. Stejně tak pokud by přibyl další typ zákazníka - například program pro pracovníky mobilního operátora. Pak by nám počet metod vzrůstal lineárně. Takové řešení zdaleka není to pravé. Dvě nezávislé třídyMožnost vytvořit místo dosavadního řešení dva nezávislé moduly se zdá být poměrně moudrou myšlenkou. Rozeberme si podrobněji klady a zápory této volby.
Rozdíl mezi oběma postupy je okamžitě patrný. Velká výhoda druhého řešení spočívá v tom, že neklade na uživatele modulu nutnost pamatovat si ke každému zákazníkovi i jeho typ a ani nebudeme muset řešit žádné podmínky. Tím odpadá největší problém prvního postupu. Ovšem přijatelné toto řešení rozhodně není. Odstranění zmíněného problému s sebou přineslo problém jiný. Oba moduly mají společné některé některé atributy ($cislo, $id_majitele, $stav_konta) a metody (například dej_cislo, zmen_majitele, navys_stav_konta apod.). Co když přibude atribut $datum_zalozeni_uctu? Budeme muset upravit oba balíky. A co když nepůjde jen o 2 balíky, ale o 20 nebo více balíků? Jak vidíme, ani rozdělení do nezávislých modulů není elegantním řešením. Abstraktní třída a dědičnostZopakujme si, čeho vlastně chceme docílit. Potřebujeme vytvořit objektově orientovaný modul mobilních zákazníků s těmito vlastnostmi.
Protože tytéž atributy nesmějí být ve více třídách, budeme problém řešit pomocí abstraktní třídy. Půjde o to vytvořit třídu obecného mobilního zákazníka, který bude obsahovat jen vlastnosti společné všem zákazníkům. Soubor Zakaznik.pm vypadá takto.
Vše, co charakterizuje obecného zákazníka, je definováno zde. Dále můžeme tvořit už konkrétní typy zákazníků. Nejdříve zákazníka s předplacenou službou (Zakaznik/PredplacenaSluzba.pm). Zde předefinujeme konstruktor tím způsobem, že nejprve vytvoříme objekt obecného zákazníka a poté ho upravíme.
Ukažme si ještě, jak by mohl vypadat zákazník s tarifním programem (Zakaznik/TarifniProgram.pm).
Uživatel bude mít nyní k dispozici moduly Zakaznik::PredplacenaSluzba a Zakaznik::TarifniProgram, které lze do programu importovat pomocí use. Takto vypadá použití vytvořeného modulu.
Splnili jsme tedy oba požadavky. Náš model je přijatelný z hlediska uživatele - ten s ním může intuitivně pracovat; i z hlediska programátora - neměl být velký problém s rozšiřováním modulu.
Related article
Perl (1) - Dávka teorie na úvod Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (9) - Cykly Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (23) - Regulární výrazy - rozšířené vzory Perl (24) - Regulární výrazy - příklady Perl (25) - Regulární výrazy - závěr Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (29) - Úvod k práci se soubory Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (65) - Projekt - získání dat Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Previous Show category (serial) Next
|
Szukanie oprogramowania
|
|||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |