Chcete si koupit Webtrh?
Zobrazují se odpovědi 1 až 10 z 10

Výhoda OOP - prosím o příklad

  1. Ahoj,
    umím myslím celkem slušně prosté php... Většinu věcí dělám na wordpressu což je mi samo o sobě jakýmsi php frameworkem. Často si ale píšu vlastní plugin, fukce či řešení, podle požadaků klienta nebo mých.

    Snažím se proniknout do OOP, ale přiznám se, že jsem asi zatím nepochopil tu výhodu takto psaného kódu...

    Když se podívám na nějaké základní tutoriály... např.:

    Kód:
    class Clovek
    {
       public $jmeno;
    
        public function pozdrav()
        {
            echo('Ahoj, já jsem ' . $this->jmeno);
        }
    
    }
    
    $karel = new Clovek();
    $karel->jmeno = 'Karel';
    $karel->pozdrav();
    Já tam nevidím žádnou výhodu oproti funkci

    Kód:
    function pozdrav($jmeno) {
       echo('Ahoj, já jsem ' . $jmeno);
    }
    
    pozdrav('Karel');
    Mohl by mi někdo prosím uvést nejjednodušší příklad, kde uvidím, že oop je výhodnější než prosté php? Děkuji moc.

  2. Co se právě děje na Webtrhu?
  3. To proste pochopis na velkych systemech... tvuj izolovanej kratkej priklad samozrejme vychazi lip pro obycejnej kod, protoze objekty pridavaji vrstvy, ktere v tom priklade nejsou potreba, ale jakmile mas system kde ty vrstvy plne vyuzijes, tak zacne byt ta vyhoda zrejma... Zacal bych tim, ze se to naucis, vyhody pochopis casem...

  4. Zkus toho napsat víc, udělej člověka co umí zdravit, chodit, nakupovat, pak to rozděl na ženu a muže co budou umět jiné věci, pak udělej zvíře co umí štěkat, atp.

    Čím víc toho bude tím víc se v tom začneš ztrácet a začneš mít potřebu to ucelovat do objektů :)

  5. OOP není jen o jiném zápisu, ale o jiném přemýšlení a rozložení problémů reálného světa do progamového zápisu.

    Nelze na jednoduchém příkladu říct, co je lepší či horší. OOP tě obecně více drží za ruce, máš lepší možnosti automatických testů, lépe se ti refactoruje a lépe se rozděluje práce v týmu. PHP na OOP není zrovna přívětivé a ani verze 7 neumožňuje věcí, které známe z Javy, .NET, F#.

    OOP je hlavně o předávání závislostí a nepoužívání globálních objektů/funkcí. Tvůj příklad by šlo rozšířit o možnost určit kam se má výstup pozdravu poslat

    PHP kód:


    abstract class Printer
    {
        abstract public echo(
    $text);
    }

    class 
    echoPrinter extends Printer
    {
        public echo(
    $text)
        {
            echo(
    $text);
        }
    }

    class 
    debugPrinter extends Printer
    {
        public echo(
    $text)
        {
            
    var_dump($text);
        }
    }

    class 
    Clovek
    {
       public 
    $jmeno;
       protected 
    $printer;

        public 
    __construct(Printer $printer)
        {
            
    $this-printer $printer;

       }

        public function 
    pozdrav()
        {
            
    $this->printer->echo('Ahoj, já jsem ' $this->jmeno);
        }

    }

    $printer = new echoPrinter();
    $karel = new Clovek($printer);
    $karel->jmeno 'Karel';
    $karel->pozdrav(); 

  6. Dobře a co tohle...
    Nevím jestli se Vám v tom bude chtít hnípat, ale bylo by na tom něco jednoduššího napsat to v OOP?

    Generuji tabulku pro program festivalu na uvedený den....

    Mám několik stage
    Kód:
    $stagesPrednasky = array('gong stage' => 'program_gong','global stage' => 'program_global', 'hlubina stage' => 'program_hlubina', 'fourth stage' => 'program_fourth', 'last stage' => 'program_last',  );
    A generuji program: pomocí funkce
    Kód:
    programTable($stagesPrednasky, 'patek, 'prednasky');
    funkce

    Kód:
    function programTable($stages, $day, $type){
      echo '<div class="table-responsive">';
      echo '<table class="table">';
      echo '<thead>';
      echo '<tr>';
      echo '<th scope="col" class="noborder time"></th>';
      echo '<th scope="col" class="noborder"></th>';
      foreach ($stages as $key => $value) { //DO PRVNÍHO ŘÁDKU V HLAVIČCE VYPÍŠU NÁZVY JEDNOTLIVÝCH STAGE
        echo '<th scope="col" class="noborder">'.$key.'</th>';
      }
      echo '</tr>';
      echo '</thead>';
      echo '<tbody>';
    
      for ($x = 10; $x <= 22; $x++) {
        tr($x, $stages, $day); //GENERUJI JEDNOTLIVÉ ŘÁDKY TABULKY POMOCÍ FUNKCE TR
      }
    
      echo '</tbody>';
      echo '</table>';
      echo '</div>';
    }
    
    function program($stage, $day, $time) { //KONKRETNI UDALOST
      
        $events = get_field($stage, 172); //NACTU Z DB VSECHNY UDALOSTI KONKRETNI STAGE DO ARRAY
    
        foreach ($events as $event) { // HLEDAM SHODU KDY SE DEN, CAS SHODUJÍ
    
          if($event['cas_zacatku'] == $time AND $event['den_akce'] == $day ){
            $result = '<div class="event">';
            $result .= $event['nazev_akce'];
            $result .= '<br />';
            $result .= '</div>';
            return $result;
            break;
          }
        }
    
    
    }
    
    function tr($h, $stages, $day) {
    
      echo '<tr>';
      echo '<th scope="row" class="noborder time"><span class="position-absolute d-block">'.$h.'&nbsp;00</span></th>';
      echo '<td>&nbsp;</td>';
    
      foreach ($stages as $key => $stage) {
        echo '<td class="position-relative">'.program($stage, $day, $h).'</td>'; //VYPISUJI KONTKRETNI UDALOST POMOCÍ FUNKCE PROGRAM
      }
      echo '</tr>';
    
      trBlank($stages); //POD KONKRETNÍ UDÁLOSTÍ JE VŽDY PRÁZDNÝ ŘÁDEK VYPISUJI POMOCI FUNKCE TRBLANK
    }
    
    function trBlank($stages){
      echo '<tr>';
      echo '<th scope="row" class="noborder">&nbsp;</th>';
      echo '<td>&nbsp;</td>';
      foreach ($stages as $stage) {
        echo '<td></td>';
      }
    }

  7. Zkus nejdriv troksu teorie nez se pustis do realizace. Velmi dobra, opravdu hutna i husta knizka, i kdyz mirne starsi, ale porad platne principy i s priklady: https://aanimesh.files.wordpress.com...tterns-3rd.pdf

  8. Za prvé

    Programování - Programovací paradigmata

    - pokud umíš anglicky, tak si samozřejmě přepni wikipedii na anglické verze článků...


    Za druhé: je veliký rozdíl OOP jako takové a implementace OOP v PHP (neboli ani JAVA není čistě objektový jazyk, natož PHP)


    Za třetí: většinou nedává smysl přepisovat procedurální kód do objektů. Pokud nějaký kód vznikl jako procedurální, tak asi bylo výhodné, že bude procedurální.

    Za čtvrté:
    Pokud bych se chtěl učit OOP, tak si seženu některá slušná skripta, která se tomu věnují (a samozřejmě se to budu učit v jazyce, jaký v těch skriptech používají - ale to normálnímu člověku v ničem nevadí, že se principy naučí v jednom jazyce a pak je aplikuje v jiném -> naopak, ta teorie Tě bude pak nutit dělat v PHP "objektově" i to, co PHP dělat objektově neumí - viz. např. jak funguje uvnitř takový drupal)

  9. Citace Původně odeslal matata86 Zobrazit příspěvek
    Dobře a co tohle...
    Nevím jestli se Vám v tom bude chtít hnípat, ale bylo by na tom něco jednoduššího napsat to v OOP?

    Generuji tabulku pro program festivalu na uvedený den....

    Mám několik stage
    Kód:
    $stagesPrednasky = array('gong&nbsp;stage' => 'program_gong','global&nbsp;stage' => 'program_global', 'hlubina&nbsp;stage' => 'program_hlubina', 'fourth&nbsp;stage' => 'program_fourth', 'last&nbsp;stage' => 'program_last',  );
    A generuji program: pomocí funkce
    Kód:
    programTable($stagesPrednasky, 'patek, 'prednasky');
    funkce

    Kód:
    function programTable($stages, $day, $type){
      echo '<div class="table-responsive">';
      echo '<table class="table">';
      echo '<thead>';
      echo '<tr>';
      echo '<th scope="col" class="noborder time"></th>';
      echo '<th scope="col" class="noborder"></th>';
      foreach ($stages as $key => $value) { //DO PRVNÍHO ŘÁDKU V HLAVIČCE VYPÍŠU NÁZVY JEDNOTLIVÝCH STAGE
        echo '<th scope="col" class="noborder">'.$key.'</th>';
      }
      echo '</tr>';
      echo '</thead>';
      echo '<tbody>';
    
      for ($x = 10; $x <= 22; $x++) {
        tr($x, $stages, $day); //GENERUJI JEDNOTLIVÉ ŘÁDKY TABULKY POMOCÍ FUNKCE TR
      }
    
      echo '</tbody>';
      echo '</table>';
      echo '</div>';
    }
    
    function program($stage, $day, $time) { //KONKRETNI UDALOST
      
        $events = get_field($stage, 172); //NACTU Z DB VSECHNY UDALOSTI KONKRETNI STAGE DO ARRAY
    
        foreach ($events as $event) { // HLEDAM SHODU KDY SE DEN, CAS SHODUJÍ
    
          if($event['cas_zacatku'] == $time AND $event['den_akce'] == $day ){
            $result = '<div class="event">';
            $result .= $event['nazev_akce'];
            $result .= '<br />';
            $result .= '</div>';
            return $result;
            break;
          }
        }
    
    
    }
    
    function tr($h, $stages, $day) {
    
      echo '<tr>';
      echo '<th scope="row" class="noborder time"><span class="position-absolute d-block">'.$h.'&nbsp;00</span></th>';
      echo '<td>&nbsp;</td>';
    
      foreach ($stages as $key => $stage) {
        echo '<td class="position-relative">'.program($stage, $day, $h).'</td>'; //VYPISUJI KONTKRETNI UDALOST POMOCÍ FUNKCE PROGRAM
      }
      echo '</tr>';
    
      trBlank($stages); //POD KONKRETNÍ UDÁLOSTÍ JE VŽDY PRÁZDNÝ ŘÁDEK VYPISUJI POMOCI FUNKCE TRBLANK
    }
    
    function trBlank($stages){
      echo '<tr>';
      echo '<th scope="row" class="noborder">&nbsp;</th>';
      echo '<td>&nbsp;</td>';
      foreach ($stages as $stage) {
        echo '<td></td>';
      }
    }
    Tu nemáš nič, len jeden select a echo tabuliek. Vlastne echo by si nemal písať do tried.

    V OOP bude kód univerzálnejší, kompaktnejší, ľahšie rozšíriteľnejší a zároveň uzavretejší pre chyby, a znateľne prehľadnejší.

  10. Nevím, jestli to bude nejjednodušší příklad, ale zkus si představit toto:

    V republice je "X" veřejných knihoven v "Y" městech. Každá veřejná knihovna (budova) má "M" knihoven (skříní), které mají "N" polic a v každé polici je "P" knih. Každá z knih má "A" stránek, je v nich "B" odstavců, dále "C" různých slov....

    Z reálného světa určitě odvodíš, jaké vlastnosti objekty mají (barva, velikost, váha,...) i co vše se dá s každým z těchto objektů dělat (metody tříd). Lze například přenést knihu ze skříně do skříně, do jiné budovy, do jiného města. Kniha se dá ztratit, dá se prodat, znehodnotit. Také se mohou měnit počty skříní v budovách, nebo knih v knihovnách. Knihy se také půjčují a je třeba například evidence výpůjček, atd..

    V procedurálním PHP si asi dokážeš představit, kolik funkcí a proměnných budeš muset obstarat, na co vše budeš muset myslet a pamatovat pro další vývoj, nebo co vše tě čeká, když se změní některý z objektů či jejich funkcí (a to jde o docela jednoduchý příklad struktury).

    Třeba bude nutné přidat evidenci, které konkrétní a kolik stránek vytrhnul čtenář při vypůjčení - jak vysoké je poškození knihy. Nebo přijde požadavek na přidání čárového kódu ke každé knize, či skříni. Také by bylo potřeba udělat několik pohledů na tu strukturu (různé výpisy knihoven, knih, výpůjček, prodlení při vrácení, samozřejmě seznamy autorů a jejich knih atd.). Pomocí pouhých funkcí je to dost morbidní představa.

    Reálný svět je mnohem komplikovanější a už na takto jednoduchém příkladu je vidět, o co složitější je naprogramovat to v procedurálním PHP pomocí funkcí oproti OOP PHP.

    V OOP PHP lze definovat tyto třídy (zjednodušeně) a pracovat s nimi bez další znalosti jejich vnitřní funkcionality či struktury:

    class mesto {}
    class budova {}
    class knihovna {}
    class kniha {}
    class strana {}
    class odstavec {}
    class slovo {}
    class vypujcka {}
    ...

    Načrtnu hodně zjenodušené použití u kterého snad bude vidět rozdíl mezi klasickým PHP a OOP PHP:

    knihovna = new knihovna();
    kniha = new kniha();
    if (knihovna->pocetVolnychPolic() > 0) {
    police = knihovna->prvniVolnaPolice();
    knihovna->pridejKnihuDoPolice(kniha, police);
    }

    Hlavní praktickou výhodou OPP při programování (reálném psaní kódu) oproti procedurálnímu PHP je v tom, že nemusíš v hlavě uchovávat mraky všech proměnných, ale pracuješ s instancemi tří (objekty) které zapouzdří ostatní věci. Pokud přijdou další požadavky na rozšíření objektů, nebo jejich funkcí, pak stačí změnit/rozšířit definici třídy bez znalosti ostatních objektů (pokud se jich změna přirozeně netýká). Nebo v případě požadavku na jiné vykreslení části struktury není potřeba psát hromady nových funkcí určených výhradně pro daný případ.

    Je to delší čtení (pardon), ale snad je na tom i vidět, jak zásadní rozdíl by byl při psaní a rozvoji daného kódu v procedurálním PHP, oproti OOP PHP.

    Pro komplexnější struktury určitě OOP doporučuju.

  11. Citace Původně odeslal skorozacatecnik Zobrazit příspěvek
    knihovna = new knihovna();
    kniha = new kniha();
    if (knihovna->pocetVolnychPolic() > 0) {
    police = knihovna->prvniVolnaPolice();
    knihovna->pridejKnihuDoPolice(kniha, police);
    }
    Veľmi pekný príklad. Pekne pracuješ s objektami.

Hostujeme u Server powered by TELE3