Autor Zpráva
matata8611
Profil
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ř.:

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

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.
Mlocik97
Profil
Výhoda OOP:

blaaablaaa
Profil
matata8611:
Je těžké ukázat přínos OOP na jednoduchých příkladech.
Ale alespoň rozšířím tvůj příklad, aby šlo lépe vidět smysl použití objektu v tomto případě.

<?php
class Clovek
{
   private $jmeno;
   private $narozeni;
 
   public function __construct($jmeno, $narozeni) {
       $this->jmeno = $jmeno;
       $this->narozeni= $narozeni;
   }
   
   public function getName() {
       return $this->jmeno;
   }
       
    public function getAge() {
      return date("Y")-$this->narozeni;
    }
 
}

class Pes {
    private $jmeno;
    private $majitel;
    private $rok_narozeni;
    private $rok_umrti ;
    
    public function __construct($jmeno, $majitel, $rok_narozeni, $rok_umrti = null) {
      $this->jmeno = $jmeno;
      $this->majitel= $majitel;
      $this->rok_narozeni= $rok_narozeni;
      $this->rok_umrti = $rok_umrti ;
    }
    
    public function getOwner() {
      return $this->majitel;
    }
    
    public function isAlive() {
       return $this->rok_umrti===null;
    }
    public function getDeathAge() {
       if ( $this->isAlive() ) {
           throw new Exception("Pes porad zije!");
       }
       return $this->rok_umrti-$this->rok_narozeni;
    }
    
    public function getAge() {
      return date("Y")-$this->narozeni;
    }
   
   public function getName() {
      return $this->jmeno;
   }
}

$karel = new Clovek("Karel", 1980);
$alik = new Pes("Alik", $karel, 1990, 2000);


echo 'Majitel psa jmenem '.$alik->getName() ' se jmenuje '.$alik->getOwner()->getName().'. ';
if ( $alik->isAlive() ) {
    echo "Bohuzel uz umrel ve veku ".$alik->getDeathAge()." let.";
} else {
    echo "Psovi je ".$alik->getAge()." let.";
}
breeta
Profil
matata8611:

To bude tím že o tom nic nevíš, si něco přečti: www.php.net/manual/en/language.oop5.php
Nebo výukové video: symfonycasts.com/tracks/oo

U takového příkladu opravdu nemá smysl OOP.
tttt
Profil *
Nechť chceš vypsat seznam zvířat, které načítáš z nějakého repositáře. Díky OOP kód, který zvířata vypisuje, nemusí vědět, jak se zvířata z repozitáře načítají. Je jedno, jestli to je ze souboru nebo z databáze. Pokud budeš chtít přidat další způsob, jak načítat zvířata (třeba z nějaké webové služby), stačí jen dopsat novou třídu WebServiceRepository a naimplementovat patřičné metody. Není potřeba měnit (zkoumat) kód, který ta zvířata vypisuje. Bez objektů to jde taky, ale dělá se to hůř.

var $repository = new FileRepository()
// var $repository = new MysqlRepository()
…
for(var $animal in $repository->getAnimals()) {
  echo $animal;
}
Kcko
Profil
matata8611:
Většinu věcí dělám na wordpressu
To bude kámen úrazu :-)

Zkus se podívat na Nette / Symfony / Laravel (nebo na jednoduchý CodeIgniter).
Anonymouz
Profil
Viděl jsem několik přednášek, videí a článků a docela ho lidi v poslední době pomlouvají a dávají přednost spíše funkcionálnímu programování. Názory jsou na to různé, ale na mě to působí tak, že za OOP bojuje hlavně taková ta stará škola nebo lidé co se učí ze starších učebnic.
OOP má tedy svůj význam asi jen někde. U OOP i FP, je možné psát kód přehledně a nebo totálně prasácky, že se v tom nikdo nevyzná.
mckay
Profil
Anonymouz:
Viděl jsem několik přednášek, videí a článků
Názory jsou na to různé, ale na mě to působí tak, že za OOP bojuje hlavně taková ta stará škola nebo lidé co se učí ze starších učebnic.

K takovým tvrzením by se určitě hodilo uvést i zmiňované zdroje, aby si každý mohl na jejich základě utvořit vlastní názor. Neznám prostředí ani úhel, ze kterého odpovídáš, ale z mé vlastní, sic limitované pracovní praxe (6 let SW development), na mě úhel, že za OOP bojují staré školy a starší učebnice působí teda velmi úsměvně.
Kajman
Profil
matata8611:
Velkou výhodou OOP je možnost dědění. Třeba na novou třídu kocka si zdědíte funkčnost psa a přepíšete si jen ty věci, které jsou u kočky jiné.
Mlocik97
Profil
novou třídu kocka si zdědíte funkčnost psa

a ja kocka myslel jak v Slovenčine kryhle... to by inak sedelo... dedení je píp píp, blbosť.... není to výhoda ale nevýhoda. Jeden článok na nete to vysvetlil dokonale.

medium.com/better-programming/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7
medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53
Gray blogger
Profil *
Výhoda je například, že si data můžeš strukturalizovat či zorganizovat do přehledných celků. Struktury mohou být složité i jednoduché. Jednoduché přirovnání složité struktury je DOM: webová stránka se spoustou objektů, každý objekt má řadu vlastností či atributů. Jednoduché přirovnání jednoduché struktury: představ si například tabulku v excelu, kterou chceš programově vyjádřit. Tabulku je tzv. wrapper, objekt který ti vše zabalí. Ten objekt je rozdělený na řádky a řádky jsou rozdělené na sloupce. Představ si to neobjektově: každou buňku bys vyjádřil jednou proměnnou, např: A1, A2, A3, A55, B1, B2, B3, B55 ... atd. to by bylo dost komplikované k takovým věcem přistupovat a spravovat je, že?

OOP mají i své nevýhody, zabírají hodně paměti a trvá déle než to počítač zpracuje. Než načte všechny instrukce jakou ten objekt má mít strukturu, než ho iniciuje, než zavede metody apod. Když chceš zkopírovat objekt buď na to musí být napsaná funkce v tom jazyku ve kterém píšeš, nebo si ji musíš napsat sám (to je ta horší možnost). Pokud celý program zabalíš do nějakého objektu, například máš soft na překlad a do wrapperu načteš databáze se slovíčkama, celou dobu to držíš v paměti dokud buďto neuzavřeš databáze nebo neukončíš program. Podobně kdybys dělal s obrázky, velké obrazy budou zabírat mraky informací, takže je třeba počítat s tím kolik máš k dispozici paměti.

V PHP - nevýhoda mi příjde právě u těch RS. Např. Wordpress mi přišel hrozně pomalý, generoval spoustu mysql požadavků a celkově složitý ne moc efektivní program. Kdežto, když by sis napsal vlastní a na OOP se vykašlal, můžeš to napsat mnohem efektivněji, svyžněji a nemít tam spoustu nepotřebného balastu.
Keeehi
Profil
Gray blogger:
Když tomu nerozumíš, tak se raději nevyjadřuj. Ano, RS obecně bývají pomalé. Jeden z důvodů je, že je obecně amatéři neumějí nastavit. Nainstalují je podle nějakého návodu, ono to nějak funguje, tak to dál neřeší. S OOP to ale nemá nic společného. Důvodem je hlavně to, že RS je udělaný aby zvládnul "všechno", aby byl rozšířitelný atp. A tahle obecnost se bez nějakých optimalizací prostě musí podepsat na výkonu. Tím že do toho taháš Wordpress jen ukazuješ, jak tomu nerozumíš. Vždyť Wordpress je asi nejvíc funkcionálně napsaný RS co jsem viděl.
Když správně napíšeš aplikaci, je jedno jestli využiješ OOP, nebo FP, rychlé budou stejně.

matata8611:
Výhody OOP se bohužel nedají ukázat na nějakém malém jednoduchém příkladu. Já když jsem to poprvé viděl, tak jsem nemohl pochopit, proč bych to měl používat, když ten jednoduchý příklad by šel taky vyřešit jednou dvěma funkcema.
Osobně si myslím, že to pomáhá se strukturováním kódu do logických a funkčních celků.
No a pak tu je to, když pracuješ s kódem někoho jiného. A tím nemyslím to když na nějakém projektu pracuješ s kámošem ve dvou. Tím mám na mysli, když používáš knihovny někoho jiného. Například máš nějakou super knihovnu na práci s formuláři, kterou napsal nějaký jiný autor. Všechno je skvělé, jen zrovna tvůj css framework který používáš vyžaduje, aby všechny inputy byly obalené divem s nějakou třídou. No tak si vytvoříš vlastní třídu, která bude dědit od \Foo\Form\Input (třída z toho projektu která reprezentuje formulářový prvek a přepíšeš tomu metodu render.
public functio render() {
    echo '<div class="form-input">';
    parent::render();
    echo '</div>';
}

Místo $form->add(new Input('email')); pak používáš svuji třídu $form->add(new MyInput('email')); a vykresluje se ti to jak chceš.
Ono je toho samozřejmě více, ale na lehkou ukázku by to mohlo stačit.
Kombik
Profil *
Na Zdrojáku mě zaujalo několik komentů, tak se podělím.

V praxi to vypadá tak, že:

Ve FP vytvoříme tucet různých funkcí dělající to samé. Pak přijde senior a profackuje vývojáře, kteří projdou všechny ty funkce, a zrefaktorují je. A protože funkce je jednoduchá a kompaktní jednotka, ideálně bez stavů, tak to jde snadno.

V OOP se vytvoří tucet různých metod a tříd, ideálně velice sofistikovaně poděděných (to, že by v praxi dědičnost jakkoliv pomáhala, natož aby byla pozitivní zpětnou vazbou – je mýtus). Následně přijde senior, a začne se chytat za hlavu, a že potřebuje alespoň týden, aby to rozmotal, a dva aby se to otestovalo.

Daniel Steigerwald přidal
Ve funkcionálním programování jakoby prasíte, ale výsledkem je čistej kód. Klidně si šáhnu na global state, a nic se neděje. Proč? Je immutable, můžu z něj jen číst :-) V OOP velmi rychle něco poserete, ve funkcionálním programování kód zdaleka tak rychle nehnije.

OOP bych přirovnal ke komunismu. Má to dobrou myšlenku, ale je to utopie a v praxi to tak jak se říká uplně nefunguje. Dědičnost tříd může být výhoda ale zrovna tak i nevýhoda. OOP je fajn když na projektu pracuješ sám. V týmu lidí, kteří to úplně neovládají v tom dovede být i horší guláš než u FP. Jak OOP tak FP, je o způsobu myšlení a přístupu k programování. Každý tak preferuje něco jiného.

Dobré je taky toto video. Kde o tom napříč celým videem útržkovitě mluví.
www.jobsdev.cz/video/detail/javascript-2016-funkcionalni-stabilni


Koukám, že moc nepíšu čárky ve větách a nenašel jsem, jak se tu dá editovat. Hold to budete muset vydržet. :D
Gray blogger
Profil *
Keeehi:
"Tím že do toho taháš Wordpress jen ukazuješ, jak tomu nerozumíš."
Takhle přes internet to vypadá, že ze sebe děláš namyšleného egoistu co se snaží shodit druhé lidi. Vůbec tak to, není můj komentář se držel kontextu:

"Většinu věcí dělám na wordpressu což je mi samo o sobě jakýmsi php frameworkem."

Chceš se mnou slovíčkařit a hádat se o to jak jsem vlastně mysel nebo kdo z nás dvou je víc namachrovanější? Inu, je to prosté, autor dotazu si vybral pomalý RS. A já psal obecně o tom, že OOP jsou pomalejší.
RastyAmateur
Profil
Gray blogger:
Aha, tak jeden z lidí, o kterém bych nikdy neřekl, že si chodí na DJPW honit ego je zrovna Keeehi, jsi mě opět pobavil :D

Víš co by mě zajímalo? Když je WP tak příšerně pomalý a strašný, proč je tolik používaný? Jak napsal ten tvůj oblíbený egoista:
Ano, RS obecně bývají pomalé. Jeden z důvodů je, že je obecně amatéři neumějí nastavit

Já vážně absolutně nechápu styl tvého uvažování. Stále tu plácáš nějaké mr*ky o tom, jak je všechno pomalé a neefektivní, že si to raději napíšeš sám a zároveň děláš v PHP a místo databáze si vše zapisuješ do souborů. Java je celá založená na OOP, znamená to, že je pomalá a k ničemu? Myslíš si, že hlavní cíl a efekt objektů má být rychlost?

Mimochodem, tebou zvolený příklad Excelovské tabulky je snad ten nejhorší, co jsi mohl vybrat.
Keeehi
Profil
Gray blogger:
Já nemám potřebu si tady něco dokazovat. Problém tvých příspěvků ale je, že z poloviny jsou založené na pocitech a z poloviny na doměnkách. Ty jsi k tomu navíc přesvědčen že to je i pravda a pokud se ti někdo snaží vysvětlit, že to tak opravdu není, tak se jen naštveš. Dokud si to děláš u svých dotazů, tak v pohodě, škodíš tím víceméně jen sobě a to mi nevadí. Když ale ty své pravdy taháš i k jiným tazatelům, tak ano, to už mi vadí. Nováček může sám těžko poznat, že většina toho co píšeš jsou ničím nepodložené výmysli.

Dám ti ale možnost dokázat tvojí pravdu. Vytvoř redakční systém a jednou ho napiš funkcionálně a jednou objektově. Já tvrdím, že pokud se to napíše tak jak má, tak že jejich rychlost bude prakticky stejná. Pokud to tak nebude, tak se ti tu veřejně omluvím a klidně budu oslavovat tvoji nezměrnou moudrost o které se nám, obyčejným smrtelníkům, může jenom zdát.
barkel
Profil
Na pochopenie OOP potrebuješ poriadny objektový jazyk, takže si vyber jazyk ktorý ťa bude menej rozptylovať ako PHP to znamená:


- C#
- java
- Typescript
- smalltalk
- Ruby
- eiffel
- Delphi

A tiež sa neuč OOP na server side. Lebo tam si tie objekty ťažko stotožníš s objektami z reálneho sveta. Ja by som ti odporučil vybrať si jednu z týchto oblasti

Desktopové aplikácie (UWP / WPF/ Webforms, Cocoa ) príklady:
- okno je objekt
- button je objekt
- checkbox je objekt
- text je objekt.
- listbox je objekt jeho itemy sú tiež objekty

Alebo grafické appky (2D alebo 3D).
- štvorec je objekt
- obdĺžnik je objekt
- priamka je objekt
- bod je objekt

Hry
- panáčik ktorým hýbeš je objekt
- NPC postavy sú objekty
- strelná zbraň je objekt

SPA (dobrý na pochopenie OOP je react alebo react native) príklady rovnaké ako pri desktopových apps
Joker
Profil
Ad barkel:
Souhlasím s tím, že není zrovna šťastný nápad se učit OOP tak, že vezmu PHP a začnu experimentovat.
PHP je jazyk původně pro strukturované programování s dlouhou historií, během které v návrhu padlo dost problematických rozhodnutí.
A pak tam bylo naroubováno to OOP.
Takže v PHP ještě víc než u jiných jazyků platí, že to, že něco jde udělat ještě neznamená, že je dobrý nápad to dělat.
Je asi lepší nejdřív mít alespoň teoretické základy OOP a pak to dělat v PHP.

Kombik:
OOP bych přirovnal ke komunismu. Má to dobrou myšlenku, ale je to utopie a v praxi to tak jak se říká uplně nefunguje.

Možná trefnější je říct, že i v OOP to můžete naprogramovat úplně blbě.
Což ovšem platí i pro jakoukoliv jinou techniku :-)

Jinak pokud je řeč o PHP, funkcionální programování je asi trochu mimo.

matata8611:
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

Tam je potíž (jak naznačuje blaaablaaa [#3]), že hlavní přínos OOP je v podstatě „aby se dalo vyznat i v rozsáhlejším problému“.
Což se na jednoduchém problému těžko demonstruje :-)

Vidím to přesně naopak než co cituje [#13] Kombik, výhody OOP jsou hodně vidět právě když na projektu dělá víc lidí.
A nejen víc lidí, ale i jednotlivec po delší dobu.
Protože třeba já když udělám nějaký kód, pak půl roku dělám něco úplně jiného a pak se vrátím k tomu předchozímu, je to skoro jako kdyby to psal někdo jiný :-)

Ono zezačátku, dokud je to jednoduché, to OOP vypadá jako zbytečné zdržování (někdy si musím složitě předávat nějaký objekt a pak se ho ptát na informace, když bych si tam mohl ty údaje nějak bokem dát přímo).
Pak zjistím, že ty objekty nejsou úplně ideálně, a nastupuje předělávání a vylepšování.
(Ale i to je vlastně výhoda OOP, že to vůbec jde; Ve strukturovaných programech obvykle časem nastane situace, kdy to je kód vzájemně tak provázaný, že je velké riziko do čehokoliv hrábnout.)

Nicméně jsem pak opravdu zažil situaci, kdy to do sebe zapadne a další rozšiřování je pohodička, kdy se požaduje zdánlivě velké množství funkčnosti, ale reálně se přidá pár objektů a ono to „samo“ začne fungovat.

To, co se cituje v [#13]: „Následně přijde senior, a začne se chytat za hlavu, a že potřebuje alespoň týden, aby to rozmotal, a dva aby se to otestovalo“
by v OOP nikdy nemělo nastat.
Pokud se to stane, je to jasné znamení, že to děláte špatně.
(Nicméně i znamení, že to děláte špatně, je docela fajn; Protože v téhle fázi to pořád ještě jde s relativně malými problémy spravit.
Respektive s mnohem menšími problémy než když to doděláte, nasadíte a pak udržujete.)
Gray blogger
Profil
Keeehi:
Tím že do toho taháš Wordpress jen ukazuješ, jak tomu nerozumíš. Vždyť Wordpress je asi nejvíc funkcionálně napsaný RS co jsem viděl.
Sám tomu nerozumíš. Wordpress je dělaný v PHP a jak říká sám Joker. Pokud jde o PHP je funkcionální programování trochu mimo... Koukni na jeho strukturu, samá class instance atd. Je to jasné OOP.
RastyAmateur
Profil
Jo, Keeehi, strč si svého inženýra z informačních technologií za klobouk a raději leť do Skotska sbírat jahody, vůbec tomu nerozumíš! :D :D :D

Gray blogger:
Mám pro tebe návrh. Ale seriózní. Udělej wordpress bez jakéhokoliv objektu a počítej si při tom hodiny. Když to budeš mít hotové a bude to srovnatelně kvalitní s tím Wordpressem, hodím ti ještě 2 podněty na vylepšení. Celou dobu si počítej strávenou dobu nad tímto projektem a až to budeš mít, odkoupím to od tebe kompletně celé se sazbou 800Kč/hod a možná si tě najmu na následnou podporu.

a jak říká sám Joker. Pokud jde o PHP je funkcionální programování trochu mimo...
Myslím si, že Joker tím myslel opravdu funkcionální programování, ne kód rozdělený do milionu funkcí místo tříd.
Joker
Profil
Vynechte ty osobní útoky, prosím!

Pro upřesnění:
Ano, termín funkcionální programování myslím v jeho oficiálním významu a ne pro strukturované programování (viz i to, že tam používám odděleně oba termíny).

Na jedné straně funkcionální programování s PHP moc dohromady nejde (byť je možné -a není to ani špatný nápad- se v PHP řídit některými principy funkcionálního programování).

Nicméně text v příspěvku [#13] to zřejmě používá ve správném významu (viz např. zmínka o immutable global state).
Ale teď mě napadá, že ten text je citace a možná to Kombik nepochopil správně (tj. citoval text týkající se funkcionálního programování v domnění, že to je o strukturovaném programování).

Jinak ohledně funkcionálního programování mám asi takovýhle pocit: xkcd.com/1312
Někteří experti sice píší články o tom, jak je to super, ale v praxi se to moc nepoužívá.

Když se kouknu na poslední průzkum StackOverflow, nejpopulárnější technologie:
1. JavaScript: Je prototypový jazyk, ale principiálně nejblíž má k OOP. Byť v poslední době je in v JS používat některé principy funkcionálního programování (viz Redux).
(2. HTML/CSS, 3. SQL: Nejsou programovací jazyky.)
4. Python: Hybridní, umožňuje různé způsoby programování
5. Java: OOP
6. Bash/Shell/PowerShell: Obvykle imperativní (nestrukturované) skripty, ale obvykle ne moc složité
7. C#: OOP
8. PHP: OOP a strukturované (resp. imperativní) programování
9. C++: OOP, eventuálně strukturované (resp. imperativní) programování
10. TypeScript: Nadstavba nad JS, podle mě víc směrem k OOP než JS

Čili podle mě má OOP vcelku jednoznačnou převahu.
Gray blogger 2
Profil *
Někdo si tu zaregistroval moji přezdívku a začal pod ní psát. Poslední post nebyl ode mě "Včera, 16:33:17". Tohle byla nějaká provokace od vtipálka. Takže pod tímto jménem už nebudu psát.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0