Jump to content

Search the Community

Showing results for tags 'oop'.

  • Search By Tags

    Oddělujte čárkami
  • Search By Author

Content Type


Fórum

  • Obecné
    • Všeobecné
    • Všechno možné
  • Programování
    • Poradna
    • Návody
    • Tvorba
    • Hledám programátora
  • Herní oblast
    • Poradna
    • Jak na to?
    • Herní kontext
    • Herní zážitky
    • Komunita
  • Grafika
    • Poradna
    • Návody
    • Tvorba
  • Ostatní
    • Hardware a software
    • Hledám/nabízím
    • Archiv
    • 3D Tisk

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Web


Facebook


Jabber


Skype


Steam


Twitter


Github


Pastebin

Found 2 results

  1. Úvod do OOP #1 Obsah: Úvod Pojmy Závěr 1. Úvod Jenom bych chtěl předem říci, že téma popisuji s nadsázkou, proto pokud objevíte nějakou blbost/nedostatek, tak mi to okomentujte a opravím/přidám. Co vlastně OOP je? Jedná se o Objektově-orientované programování a je jedním z nejvyužívanějších programovacích paradigmat1. Těch paradigmat je spoustu, určitě jste zaslechli o procedurální2, logické3 nebo funkcionální4 a další a další. Než si uvedeme nějaké základní pojmy, bylo by fajn si říct jaké jsou vlastně výhody OOP. Hlavní výhodou OOP je snažší údržba, rychlejší vývoj aplikace (z hlediska týmového), méně chybovost a rychlá orientace. Nevýhody – koncept třídy (vysvětlíme si později pojem) jedné osoby nemusí být sympatické té druhé. Většinou se proto dává důraz na to, že třídy se snaží být co nejvíce nezávislé nezasahujíc do něčeho co nemá zasahovat/co nemá v popisu práce. Dále chybou je zneužívání OOP, vytváření různých tříd na vše možné, co člověka napadne a špatně využití zapouzdření. Prakticky třídy vyžadují ohromnou dokumentaci a přípravu. 1 jednají se o styl, koncept a principy programování 2 nebo také imperativní – hlavní charakteristikou je výpočet pomocí posloupností příkazů a určuje přesný postup, např. C, PHP atd. Dělí se ještě do dalších podskupin, ale ty řešit nebudeme. 3 vyhodnocování matematickou logikou, např. prolog 4 matematické funkce a jejich výpočetní vyhodnocování – lambda kalkul, lisp, Zpravidla se jednají o rekurentní výpočty. 1. Pojmy Třída (class) je abstrakce entity, popisuje datový typ. Udává nám jaké vlastnosti (členy) bude mít objekt (také jako instance třídy případně proměnné). Mezi vlastnostmi se zařazují členské proměnné (atributy, položky, attributes) a interface také jako členské funkce (metody, methods). Třídy se mohou i libovolně skládat resp. objekt třídy x je členskou proměnnou třídy y. Na následujícím příkladu si všechny tyto pojmy ukážeme a vysvětlíme. Příklady se pokusím vždy co nejvíce předvádět objektivně (jelikož deklarace tříd apod se liší v závislosti v jakém jazyku programujete), pro upřesnění se budu spíše držet syntaxe C++ (nejsou avšak korektní). Uvedený příklad budu postupem času rozšiřovat dle nových pojmů co si zavedeme. Na OOP samozřejmě také existují spoustu prog. konvencí, ačkoliv v téhle kapitole se jich držet nebudeme kvůli znázornění základních pojmů Př. Zvolme třídu Web. Jeho atributy bude návštěvnost, url a majitel webu, který je objektem třídy Osoba. Obsahuje jen jednu členskou metodu IncreaseTraffic a to na inkrementaci návštěvnosti. Třída Osoba obsahuje jméno, věk a víceméně pohlaví. class Osoba { /* Member variables */ string name; int age; bool gender; } class Web { /* Member methods */ IncreaseTraffic(); /* Member variables */ int traffic; string url; Osoba owner; } /* V závislosti na jazyk, ve kterém programujeme může definice členských metod být jinačí. Pro přehlednost vždy definici funkce budu dávat vně tříd */ IncreaseTraffic() { ++traffic; } /* Deklarace objektu pak vypadá:*/ Web pawnocz = new Web(); /* alokace objektu Webu s názvem pawnocz */ pawnocz.url = "pawno.cz"; /* k jednotlivým atributům/metodám se přistupuje pomocí tečkové notace případně šipkové (např. v PHP). Zde nastavujeme atribut */ pawnocz.owner.name = "chytrak" /* nastavování členských proměnných objektu owner (patriot Print) */ pawnocz.IncreaseTraffic(); /* voláme funkci IT(); k pawnocz Konstruktory a destruktory. Co to je? Konstruktor se deklaruje jako metoda a volá se vždy při vytvoření objektu1. Tzn když jsme deklarovali objekt pawnocz, zavolal se konstruktor. Ten ale nemáme deklarovaný ani definovaný, proto si zpravidla kompilátor vygeneruje sám2. Obecně o konstruktorech je toho hrozně moc informací, ale v základní verzi si uvedeme jen inicializační bez parametrů a s parametrama. Destruktor se naopak volá při zaniknutí objektu. Dobré zmínit je, že konstruktor nelze explicitně volat na existující objekt. 1 poctivému čtenáři může v tuhle chvíli dojít, že při vytvoření objektu pawnocz se také a dokonce jako první zavolal konstruktor Osoba 2 pro zajímavost, C++ dokáže vytvořit inicializační konstruktor na vynulování proměnné. v Javě naopak vytvoří prázdný konstruktor. Více informací o C++ konstruktoru – http://en.cppreference.com/w/cpp/language/initialization Pojďme rozšířit náš příklad. Destruktor a konstruktor se deklaruje v závislosti na jazyku (např v PHP __construct, __destruct). Pro zpřehlednění si smažeme třídu Osobu a změníme majiteli datový typ. class Web { /* Constructor & destructor */ Web(); /* konstruktor MUSÍ mít stejný název jako třída a NEMÁ návratovou hodnotu */ ~Web(); /* pro destruktor platí to co u konstruktoru, akorát před názvem je '~' */ IncreaseTraffic(); int traffic; string url; string owner; } Web() { traffic = 50; } /* inicializační konstruktor bez parametru */ IncreaseTraffic() { ++traffic; } Web pawnocz = new Web(); /* při alokaci webu je nyní traffic rovna 50 */ pawnocz.url = "pawno.cz"; pawnocz.owner = "chytrak" pawnocz.IncreaseTraffic(); První větším pojmem, které se setkáme při OOP je zapouzdření (anglicky encapsulation). Jak jsem již trochu nastínil nějaké settery a gettery. Jedná se vlastně o viditelnost neboli přístup k členům třídy. Dělíme do tří skupin – public, private, protected. Public znamená, že je přístupná komukoli v programu. Private je přístupná POUZE a JEN POUZE v dané třídě (neplést si to s objekty). K protected dojdeme později, jelikož ještě neznáme pojem dědění. Pojďme si zase rozšířit náš příklad. V našem příkladu použiji C++ encapsulation, jelikož mi přijde takové hezčí na uvedení. Pro poznámku, třída v C++ je implicitně privátní, zpřístupníme informace tím, že viditelnost označíme jinak. Víc na příkladech class Web { public: /* veřejná viditelnost – implicitně (tedy defaultně) je private a nepíše se tam. */ Web(); /* konstruktor a destruktor musí být vždy PUBLIC */ ~Web(); IncreaseTraffic(); /* v Javě se nedělí na viditelnost jako v C++, ale označuje klíčovým slovem public/private/protected před metodou případně u proměnných. Viz public IncreaseTraffict(); */ string owner; private: /* privátní */ int traffic; /* v Javě private int traffic */ string url; } Web() { traffic = 50; } /* inicializační konstruktor bez parametru */ IncreaseTraffic() { ++traffic; } Web pawnocz = new Web(); pawnocz.url = "pawno.cz"; /* CHYBA, proměnná url se nachází v private sekci */ pawnocz.IncreaseTraffic(); /* VALIDNÍ KROK, metoda se nachází v public sekci */ pawnocz.owner = "chytrak"; /* VALIDNÍ KROK, proměnná owner je v public sekci */ Jak zpřístupnit privátním informacím ostatním? Tím že pro členskou proměnnou si vytvoříme getter a setter. Setter a getter zní možná sofistikovaně, ale není to nic jiného než obyčejná metoda na čtení případně zapisování. Teď ale přichází kámen úrazu – a to zbytečně vytváření setterů a getterů. Vytvoříme-li setter a getter pro privátní proměnnou, rovnou ji můžeme nechat zviditelnit celou. Proto je tady potřeba pořádně promyslet zda-li vůbec potřebujeme settery a gettery. Samozřejmě pokud máme proměnnou, kterou nechceme aby nám někdo cizí měnil obsah, postačí nám pouze getter pro čtení informací. Občas nechceme vůbec aby nám někdo četl informace, v tu chvíli nepotřebujeme ani jednu z metod. int getTraffic() { return traffic; } string getUrl(string u) { return url; } void setOwner(string o) { owner = o; } Pojďme si ještě zmínit klíčové kouzelné slovo this. Jedná se o proměnnou (většinou reference) na danou instanci nad kterou pracujeme. Používá se pro upřesnění s jakým objektem pracujeme, např pro rozlišování proměnné instance od parametru. Občas se hodí i předávat danou instanci dál v metod. Zároveň si rozšíříme příklad o konstruktoru s parametrem. class Web { public: Web(int traffic, string url, string owner); /* rozšířili jsme konstruktor o tři parametry */ ~Web(); IncreaseTraffic(); int getTraffic(); string getUrl(); setOwner(string owner); private: string url; int traffic; string owner; /* jenom drobná změna, owner jsme přesunuli mezi private */ } Web(int traffic, string url, string owner) { /*Vtip je v tom, že náš parametr se jmenuje stejně jako naše členská proměnná, tak jak to vyřešit? Můžeme přistoupit k proměnné slůvkem this->traffic = traffic; Pro zamezení tohoto konfliktu osobně třeba používám prefix "m_" --> tedy přejmenovat to na m_Traffic = traffic; */ this->traffic = traffic; /* v c++ se jedná o pointer, v javě reference. v PHP $this->traffic; */ this->owner = owner; this->url = url; } IncreaseTraffic() { ++traffic; } int getTraffic() { return traffic; } string getUrl() { return url; } void setOwner(string owner) { this->owner = owner; } Web pawnocz = new Web(50,"pawno.cz","chytrak"); /* voila, závorka není nic jiného než konstruktor. Lze vytvořit i lokální objekty Web pawnocz(50,"pawno.cz");, const Web pawno(50,"pawno.cz");...*/ print pawnocz.getUrl() + " má " + pawnocz.getTraffic() + " návštěvnost."; /* pawno.cz má 50 návštěvnost */ pawnocz.IncreaseTraffic(); pawnocz.setOwner("Lukáš Valenta"); /* už se nám nelíbilo, že je chytrak majitelem webu. */ Metody i proměnné můžou být static. Co to pro nás znamená? Co se týče metod, tak jsou podobné běžným funkcím, nemají implicitní instanci ani implicitní členské proměnné, ani this nejsou k dispozici. Jediné plus je mají přístup k třídním proměnným a volat třídní metody. Statické třídní proměnné jsou sdíleny instancemi třídy, a jsou dodržována standartními pravidly zapouzdření. Statické metody ani proměnné nás ale teď nezajímá. Zbývá nám ještě projasnit si tři základní pojmy – protected, polymorfismus a dědičnost Dědičnost slouží k vytvoření nových datových typ na základě něčeho čeho už máme. Proč jsem si nechal encapsulation protected až teď? Protected je víceméně private plus navíc to, že se věci pod touto viditelností dědí do ostatních podtříd. Pro znázornění využijeme třídu Osoba, kterou jsem si hezky nadeklaroval na začátku a rozšíříme ji o metodu pozdrav. Na tento příklad později navážeme polymorfismus. Vysvětlíme si příklad, chceme třídu Cech a Nemec a ty budou dědit Osoba, která se bude chovat jako abstraktní třída1. Každý vždy bude mít navíc členskou proměnnou a každý umí jen svůj jazyk. 1 abstraktní třída je třída, která nemá svoji implementaci a chová se jen čistě jako rozhraní pro třídy, které ho budou dědit. Na abstraktní třídy nelze vytvořit instance. Abstraktní třídy jsou užitečné, pokud víme, že všechny zděděné třídy jsou schopny provést implementaci abstraktních metod class Osoba { public: Osoba(); ~Osoba(); void pozdrav() = 0; /* = 0; znamená, že označujeme pozdrav() za abstraktní metodu v c++. V Javě a PHP je označení klíčovým slůvkem "abstract" před "class" */ protected: string name; int age; bool gender; } /* v Javě class Cech extends Osoba, v PHP tuším taky */ /* v C++ lze využít klíčové slovo public/private nebo vůbec nic. V případě public znamená, že ponechává vidtelnost zděděných věcí. Private je, že zděděné věci nemají viditelnost mimo této třídy a zakazuje polymorfismus */ class Cech : public Osoba { public: Cech(); ~Cech(); string getFavouriteBeer(); private: string favouriteBeer; } class Nemec: public Osoba { public: Nemec(); ~Nemec(); bool hasMustache(); private: bool mustache; } Polymorfismus umožňuje pracovat a používat jednotné rozhraní pro více (podobných) typů objektů. Podstatou polymorfismu je, zajistit přehlednost, jednoduchost jednotně pracovat se třídy velmi podobné, avšak trochu se lišící. Dokonce jsme si připravili rozhraní (viz výše Osoba) a poděděné třídy. Naším cílem je zajistit volání z databáze Osob1 takovým způsobem, aby každá osoba své národnosti volal svůj pozdrav2. 1 přeskočíme-li řeči o dynamických a statických vazeb, tabulce virtuálních metod neboli VMT (c++), zjišťování instance (java) 2 abychom nemuseli složitě zjišťovat jakou instancí jaké třídy, ale stačí volat a nechat na běhu programu ať si zvolí metodu sám. // Kód v C++ Osoba ** arr = new Osoba*[20]; for ( int i = 0; i < 20; i ++){ if(rand % 2 == 0) arr[i] = new Cech; else arr[i] = new Nemec; } for( int i = 0; i < 20; i ++) arr[i]->pozdrav(); // Guten tag / Ahoj v závislosti na random for( int i = 0; i < 20; i ++) delete arr[i]; // nesmíme zapomenout na uvolňování :-) 2. Závěr Tak došli jsme úspěšně ke konci. V dnešní kapitolě jste si doufám odnesli nějaké základy o OOP a jeho základní pojmy (zapouzdření, polymorfismus, dědění,...). Pokud máte v něčem nejasno, neváhejte a zeptejte se. Polymorfismus jsem trochu odbil, takže se za to omlouvám, ale snad jsem Vám nastínil trochu tý černé magie okolo ní. Pokud byste si přáli o ní něco více vědět, tak editnu trochu příklad a rozšířím ji. Pokud jsem něco uvedl špatně, prosím napište mi to. Pokud jsem na něco zapomněl, také mi to napište. Každopádně se s Vámi loučím a snad jsem někoho zaujal vyzkoušet si OOP.
  2. Zdravíčko... Dnes bych chtěl přispět do seznamu tutoriálů ohledně PHP a přesněji bych se chtěl věnovat SAMPQuery aneb Jak si vypsat data ze serveru. Dnes si zpracujeme status serveru. Úvod -> Máme tu pár bodů co musíme splnit považuji je za hotové či již připravené a to:. - Webový server (funkční) - Editor - Základní dovednosti v PHP Pokud nemáte základní dovednosti je tu mnoho tutoriálů, které Vám to můžou vysvětlit z toho důvodu já jsem již tyto tutoriály nepsal. Požadované soubory -> Jelikož SAMPQuery není přímo v PHP includováno tak nám jeden hodný programátor udělal zjednodušenou formu zápisu díky obalení všech funkcí do přijatelnějšího tvaru. Tomu se říká API. Stáhneme si tedy tento balík. PHP-SA-MP-API-1.1.zip Pokud zde download nefunguje odkazuji na téma na fóru forum.sa-mp.com : http://forum.sa-mp.com/member.php?u=115444 Po extrahování tohoto balíku se nám zobrazí složka: Vidíme, že tu máme dva soubory s příponou .class a také přidané s příponou Example. Soubory s části názvu Example jsou v podstatě ukázky použití v praxi, proto si jeden takový otevřeme. A to SampQueryExample.php. Soubor vypadá asi nějak takto. Vidíme tam includování souboru SampQuery.class.php, můžeme vidět později initializaci třídy SampQuery s parametry IP a portu. Vlastní třída pro vytváření statusu -> Vytvoříme si vlastní třídy. Pokud někdo zase neví odkazuji na další návody tu na fóru nebo někde jinde popřípadě dopíši později. Proč vlastní třídu? Kvůli přehlednosti a funkčnosti a nejspíše i bezpečnosti. To už záleží, jak se nám povede Jak to vypadá ještě neupraveně: A co to dělá? Zapnutý server: Vypíše základní data. Vypnutý server: Takže základ by nám již fungoval. Popis funkcí: -> Vytvoření třídy a vytvoření pomocných proměnných aby byli dostupné po celé třídě. -> private $query z toho důvodu, protože nechceme aby se k naší instanci dostal i někdo jiný krom nás. (Jednoduše řečeno) -> Funkce __construct je jedna z magických metod PHP, volá se vždy při initializaci třídy. -> V této funkci nastavujeme naše proměnné ze začátku. -> require_once načte obsah soubory SampQuery.class.php PS: Já ho mám ve složce libs -> Funkce ini nám inicializuje třídu popřípadě vyhodí error pokud ji již máme "načtenou". -> Dále se zkouší připojit na server abychom zjistili či funguje. -> Funkce vrací hodnotu true / false -> Funkce render bude využita pro vykreslení našich dat v šabloně. Zjištuje také podmínkou funkce ini jestli je server funkční pokud ne vypisuje zprávu. var_dump je zde pouze pro testování výstupu. Použití ve vašem webu: -> require_once načteme náš soubor se třídou. -> vytvoříme instanci třídy s pomocí new a tu uložíme do proměnné $banner a přidáme do parametrů i IP a port -> Podotýkám u PORTU jsme nemuseli použít "" aneb je to celé číslo. Jednoduché, že? Závěrem: Doufám, že Vám tento tutoriál byl k něčemu v dalším dílu tohoto se podíváme na lepší vykreslování přidáme více obrázků a možnost přepínat mezi nimi. Zdroják: www.zip
×
×
  • Create New...