Zdravím. měl bych zas nějakou tu otázečku . zajímalo by mě, co je tak
úžasného na těch objektech. osobně nevidím velkej rozdíl mezi objektem a
funkcí, co se možností týče. Je to třeba mega rychlý? koukal jsem tu na
pár tutoriálů a nenarazil jsem tu snad na žádnej problém co by nešel
řešit přes function. pokuste se mi vysvětlit v čem je to teda tak lepší
jelikož nad tím všichni úplně básní (až na našeho učitele webu, ten je
z nějakého důvodu proti tomu...)
Dík moc
ok to cos mi řekl mi dalo stejně jako to motto pod komentářem . Pokud jsem to tedy dobře
pochopil, tak se to pak lépe edituje, když to chci na novou věc?
Je to jen taková ukázka. První řádek vezme uživatele s ID 2. Druhý
zapíše všechny informace o něm do proměnné $data. Další tři řádky jen
vypíší jméno, heslo a email. Další přihlásí uživatele s username
"admin" a heslem "heslo". Poslední řádek uživatele odhlásí.
Výhoda objektů je přehlednost.
Třídy ti pomáhají členit celý problém do menších logických celků.
Projekt s 100 třídami, kde každá má 10 metod se udržuje lépe než
projekt, kde máš jen 1000 metod za sebou.
Nevýhoda OOP je ta, že to má nějakou režii, takže je to mírně
pomalejší.
Ale to je i funkcionální programování oproti pouhému seznamu instrukcí,
protože musíš ukládat před voláním funkce stavy registrů, pushovat na
zásobník parametry funkcí (místo toho, abys na ně šahal přímo) apod.
OK takže tu máme 2 programy co dělaj naprosto tu samou věc ale jeden je
přes fce a druhý přes OOP. teď mi tedy dejte příklad, kdy budu funkce
proklínat a OOP uctívat. věřím že přeci nějaký rozdíl tam MUSÍ být
tak podle mě se dá všechno napsat jak přehledně i nepřehledně. v tom
teda výhodu necítím. možná ta univerzálnost jak tady se zmiňovala. ale
upřímě nevím, co si mám pod tím přímo představit
Ano, psal jsem, že vše se dá napsat procedurálně i objektově.
Nezaručuju, že budeš OOP uctívat, ale zkusím to.
Vezmu si třeba tento řádek:
$sql = Database::oneResult("SELECT ... WHERE `NICK`=? and `PASS`=?", array($nick, $password);
Zapomněl jsi na ošetření proměnných. PDO ti to udělá automaticky. Asi
jsi si všiml i větší přehlednosti jakožto "knihovny". Všechny třídy se
také dají použít později v jiných projektech. Můžeš použít třídy
jiných a snadno je zakompentovat do své aplikace, to by asi v procedurálce
nešlo. Máš tu také už
zmíněnou snadnou údržbu a rozšiřování do budoucna. Můžeš si napsat
třídu na tvorbu miniatur obrázku s obrovským množstvím možností a zbytek
aplikace ani nemusí vědět, co se vlastně děje. Nemusíš znovuvytvářet
kolo, prostě použiješ to, co už existuje.
Chce si to pořádně ohmatat, pak by jsi si našel svoje vlastní výmluvy
proč používat OOP a nutil je ostatním.
. Já to stejně
vyzkouším ale vždy je boj když se zkouší něco nového že?... tak až
budu vymýšlet nějakou věc, zkusím to udělat pře OOP. starý zdroje
rozhodně přepisovat nebudu
ok tak jsem si to v rychlosti proletěl a zjistil jsem jaký jsou výhody,
ovšem mám pocit že stále se to dá nahradit funkcí (doufám že nevyhraju
nějakýho machra, jelikož jakmile by jste se dozvěděli adresu tak by jste
mě asi ukamenovali ). snad
někdy OOP přijdu na chuť. chce to jen čas a zkušenosti. až to nastane tak
vám napíšu
Nelíbí se mi, když začátečníkovi ukazuješ věci z OOP, které jsou
udělané hnusně a nepřehledně. Ukázky by měly být názorné, aby z nich
byla patrná výhoda OOP proti procedurálnímu kódu. Jednoduchost,
zapouzdření, elegance, robustnost.
To jsou základní kameny pro budoucí programátory a webdesignery. Lítají
tady proto, aby ti, kteří tyto diskuze sledují, se mohli svobodně
rozhodnout, která cesta jim vyhovuje víc.
Nelíbí se mi na tom to, že k objektu Database mají přístup
všechny komponenty aplikace a dokonce mohou s tou databází dělat vše, co je
jim zlíbí. Nakonec zjistíme, že s tou databází smí manipulovat i
webdesigner.
Spíš jde o to, že statický a přístupný by měl být objekt, který
bude mít přístup k databázi a bude tahat a přepisovat data která chceme a
jak chceme pomocí pár metod.
Do databáze má mít přístup pouze Model a nikdo jiný. Když uděláš
databázi jako statický objekt, tak k ní bude mít přístup i ten grafik.
Stačí, aby ti útočník nabořil kteroukoli část aplikace a data budou
jeho.
Bral jsem to spíše jako ukázku, ale budiž. Však od toho jsou modely, který
jsem sem teď nechtěl přidávat, akorát by to zesložitilo to, co jsem chtěl
vysvětlit.
Nechápu ale, proč by kodér měl ve svým zelí volat třídy. V aplikaci
by neměli být díry. Každá se musí ošetřit, všechno musí být zalepené
aby nedošlo k ničemu, počítaje i ty nejmenší změny. A to u každé
aplikace, takže nevidím rozdíl.
Určitě by byl nějaký způsob, kterým by se to dalo využít, tomu
věřím. Také neříkám, že je to nejlepší způsob. Ale pro ukázku, kde
není ukázaný zbytek aplikace je to správný způsob.
Ono to funguje tak, že všechno, co jde procedurálně, jde udělat i
objektově. Proto ti připadá, že je to stejné. Jenže co jde objektově už
procedurálně neuděláš, musíš to napsat jinak a přijdeš o určité
výhody. Objekty na procedurální programování navazují a rozšiřují ho,
není to tedy něco úplně jiného, je to užitečná funkcionalita k těm
tvým funkcím navíc.
Souhlasím. Mě už procedurální programování nepřipadá nikterat
hygienické. S přibývajícími verzemi PHP se taky většina modulů pomalu
přesouvá na OOP, i když myslím, že PHP funkce ještě chvíli
zůstanou...
Jsme se zrovna s Drahomír Hanákem bavili, že je to PHP už fakt pěkný
jazyk, jen si s sebou táhne ten neobjektový balast. Zdá se to ale verzi od
verze lepší.
Nejsem žádný hacker, ale trošku jsem se nad tím zamýšlel a přidal k
tomu trochu znalostí z C++ a jediný problém ochrany by byla statická doba
trvání. Jelikož je objekt alokován už při načtení aplikace do paměti,
jeho adresa se nemění. Další věc je to, že (alespoň mi to tak zatím
vždy vyšlo) adresy proměnných statického objektu jsou více méně u sebe,
takže by mělo poté snáze projít a získat jejich hodnoty. Ale nevím jestli
mám pravdu. Zvlášť když je to PHP -> interpret.
To bezpečnostní riziko je podobné, jako kdybys měl všechny atributy
objektu public. Kdyby tam žádné riziko nebylo, nikdo by se nenamáhal
používat private a skrývat implementaci všude, kde to jen jde.
Pokud na projektu pracuje víc vývojářů, riziko je hlavně uvnitř.
Stačí aby jeden z nich udělal v aplikaci jednu bezpečnostní díru.
Útočník pak má k dispozici celý systém bez omezení. Proto se ta omezení
dělají.
Do konfigurace operačního systému je přece také blokován zápis, aby
sis v něm náhodou něco neponičil. Spuštěné programy si také nemohou
vzájemně přepisovat data v operační paměti, dokonce je ani nemohou
číst.
Neříkám, že to není riziko. Je to ale riziko zevnitř, které se při
použití statických tříd musí podstoupit. Není to ale vhodné použití u
citlivých dat, zvlášť, když na tom pracuje více programátorů.
(Ještě jen tak mimochodem: Kit: že zrovna ty se zajímáš o práci více
vývojářů. , sdraco: fajn
avatar.
Problém je hlavně v tom, že používání statiky strašně svádí k
substituci za globální proměnné. A ty vedou do pekel. Zpočátku to vypadá
jako velmi výhodné, ale jak projekt roste, tak se z výhody časem stane
nevýhoda. Omezuje se tím znovupoužitelnost tříd, protože pokud je třída
statická, nemůžeš ji použít ke dvěma různým účelům.
Tak ona není jen k tomu, statický můžeš mít jen jeden atribut, jedná
se o data, co jsou společná všem instancím. Nejjednodušší ukázka je
konstanta, ta je přeci také třídní.
Math v Javě si žádná data neukládá. Je to jen kontejner na funkce,
jejichž výstup je závislý pouze na vstupních datech, ale vůbec není
závislý na nějakém vnitřním stavu třídy. Pokud by v takové třídě
existoval jen jeden statický přepínač, třeba mezi stupni a radiány, byl by
to vážný problém.
Ano. U Math vidím smysl. Pokud bych však měl mít možnost přepínat mezi
stupni a radiány, dělal bych instance a konstruktoru bych předával, zda chci
stupně nebo radiány. Takovou instanci bych pak musel předávat.
Naštěstí tvůrci Math takto šílení nebyli a udělali ji z tohoto
pohledu správně, tedy staticky a bez vnitřních stavů.
Takže pokud si chceš udělat třeba vlastní statickou třídu Str, která
bude pracovat se stringy přes funkce mb_* a nebude mít žádné vnitřní
stavy, nebudu mít nic proti tomu. I když ... jeden vnitřní stav asi mít
bude a bez něho by to bylo stěží použitelné. Můžeš ho však udělat
jako konstantu.
Občas mi použití singleton/statiky přijde mnohem jednodušší a
přehlednější než si všechno předávat celou hierarchií objektů...
Když mám třeba hru, kde mám nějaký TextureManager, který má u sebe
všechny načtené textury (takže vím, že nemá smysl vytvářet jeho další
instanci) a mám kompozici tříd třeba podobnou této:
Program-Game-Map-GameObjectList-GameObject-Animation-Texture
nebo
Program-Game-Map-MapFields-MapField-Animation-Texture
Tak dám přednost vytvoření této statické třídy TextureManager s
vnitřními stavy, než abych musel všude předávat (a třeba i ukládat)
referenci na TextureManager.
A pokud se k tomu přidají ještě třeba FontManager, SoundManager, Pozice
kurzoru myši, informace o rozlišení obrazovky (kvůli vykreslení mapy, GUI)
apod., tak mi to nabobtná tak, že budu v kontruktoru všech objektů
předávat milion parametrů...
Tohle bych řešil přes strukturu kam bych dal všechna potřebná data v
podobě objektů těchto tříd a pak předával jenom instanci té struktury.
Parametr by byl tudíž jenom jeden. Ale souhlasím, že u záležitostí jako
jsou tyto je asi statika přehlednější a snadněji se to pak používá.
No, asi by to šlo, ale taky si to musíš posílat celou hierarchií, což
je otravné, ale jeden parametr už by se snad dal překousnout .
Nebo by se to dalo udělat tak, že by sis udělal statickou třídu, která
by měla odkazy na instance všech těch objektů (takže ty objekty jako
TextureManager apod. by statické nebyly), nějak takto:
Ještě by bylo možná ideální udělat Manager jako šablonu (generickou
třídu) a dodávat typ (Manager<Animation>, Manager<Font>...)
rozdíly v rozhraní a datových položkách bych vyřešil ve specifikacích,
což v C# asi neuděláš, tam bys mohl oddědit pak jednotlivé Managery.
Uplně ideální by bylo kdyby tam žádné rozdíly nebyly
Nevšiml jsem si toho. Umí ten tvůj TextureManager ty textury i
vykreslovat? Umí ten SoundManager přehrávat zvuky? Pak se totiž ty managery
nemusí prohrabávat žádným stromem, protože data mají lokálně u
sebe.
Vytvoříš třeba objekt tank, konstruktoru předáš objekt-texturu, která
se umí vykreslit a objekt-zvuk, který se umí přehrát. Tank pak v sobě má
atributy-objekty, které umí vykreslit svou texturu a přehrát svůj zvuk. V
továrně si tak můžeš vyrobit třeba transportér se zvukem stíhačky, při
upgrade tanku mu třeba jen vyměníš texturu a samozřejmě schopnosti.
Já to dělám stejně jako Luboš Běhounek Satik a přijde mi to přehledné . Do managerů si načtu všechny
potřebné texturu a poté různé GameObjecty si načítájí texturu jakou
chtějí.
Stejně musíš mít ty obrázky v něčem statickém, aby fungoval lazy
loading. Texturu nepředáváš v konstruktoru, ale tvoří si jí ten objekt,
je to jeho textura. Co se mi osvědčuje je vytvořit si závislosti v jednom
kontejneru a ten předávat, okoukal jsme to z XNA a funguje to skvěle.
Co se týká možností, neumí OOP nic navíc než assembler nebo normální
programování pomocí podprogramů, ale má spoustu výhod hlavně pro větší
projekty:
Přehlednost - u velkých projektů nebudeš mít tisíc funkcí, ale
množinu objektů, kterých bude zpravidla méně a půjde se v nich lépe
zorientovat, z toho plyne i méně chyb, což je občas kritický atribut
aplikace.
Objekty velmi dobře odpovídají reálnému světu a tedy i problémům
reálného světa, které řešíme. Svět kolem sebe vidíme jako
komunikující objekty spíš než funkce, proto se s OOP z tohoto hlediska
lépe pracuje.
Dobrá možnost spolupráce víc lidí, každý pracuje na jiném objektu a
jediné, co potřebují znát všichni, je jejich rozhraní.
Znovupoužitelnost, tzn. třídy, které jednou napíšu, můžu použít
jindy a jinde. Tohle platí i o funkcích, ale u OOP to vynikne tím víc.
Vysoká abstrakce (vyšší než u funkcí). Funkce abstrahují problém
tak, že o něm přemýšlíme jako o příkazech, kdežto objekty nám
umožňují představovat si samostatné funkční jednotky, které můžou
představovat např. celý složitý server. Objekty můžou být různě
zanořené, poskládané dohromady, nebo úplně nezávislé, což nabízí
velké možnosti.
Samozřejmě jsou i nevýhody - OOP programy jsou mírně pomalejší kvůli
vyšší režii, navíc pro malé projekty je zbytečně složité a je často
vhodnější použít jednodušší přístup, zkus např. porovnat hello world
v Pascalu a v Javě. Je to prostě určitý přístup, který je vhodný pro
spoustu věcí, ale pro specifické problémy můžou existovat i lepší
řešení.
Tak pokud se nebavíme o matematice, nic neplatí na 100 %. Ano, program
napsaný objektově může být teoreticky rychlejší, ale většinou není,
např. kvůli virtuálním metodám. Myslím, že když se někdo ptá, jaké
jsou výhody OOP, ocení spíš obecnou odpověď, klidně přetlumočenou z
učebnice, radši než nějaké speciality, kterými se může zabývat
profesionál, který OOP ovládá a používá na trochu jiné úrovni.
Vadí mi jedna věc: Když někdo napíše, že malou nevýhodou OOP je, že
je o něco pomalejší, tak začátečník si z toho obvykle vezme jen "OOP je
pomalejší" a stane se to pro něj argumentem, že je to šmejd. Přitom
výkonové rozdíly jsou naprosto nepodstatné a jsou oběma směry.
Uznávám, že když se OOP použije nešikovně, což je velmi častý
případ, jsou programy pomalejší. Určitě to není kvůli virtuálním
metodám, ty to naopak zrychlují.
Moje virtuální metoda většinou vypadá tak, že volá stejnou metodu
některého z předků a k tomu dělá něco navíc. Mám pocit, že tím je
spíš naopak o něco pomalejší.
programování přes funkce i OOP má svá plus i své proti.
Já jsem s OOP začal víceméně letos a tak se jej stále snažím
pochopit.
A můj pohled na OOP je asi tento:
OOP je takové nástavba "funkcionálního" programování. Pamatuji si na
své začátky s programováním v Basicu. O funkcích jsem nevěděl a tak
něco jako funkce jsem používal příkaz GOTO, kde jsem měl určité řádky
věnované konkrétní činnosti.
Funkce, pak tento proces nahrazovaly s tím, že se navíc předávali
parametry. Ale asi každý kdo napsal "větší" program, dostane se do stavu,
že má 387funkcí, kde mnoho z nich dělá podobné věci, ale jsou určeny ke
konkrétní práci. A zde přichází kouzlo OOP, kde části programu
zastupují objekty, kterým se dají upravit parametry, rozšířit, vzájemně
propojit.
Zkrátka klady a pozitiva.
OOP je potřeba před používáním pochopit. Chápu, zde píšící
"machry", kteří už OOP vidí za vším. Ale my ostatní musíme prostě pro
OOP ještě dozrát. A těm zkušenějším velké díky za trpělivost a pomoc
Já nemám nic proti OOP, v C# jinak než objektově neprogramuju, ale když
říkáš kladné vlastnosti OOP, neměl bys lhát o těch záporných. OOP
zkrátka má nějakou režii navíc a je pomalejší, i když je obvykle
(téměř) zanedbatelná.
Vždyť i jen přiřazení int hodnoty do vlastnosti třídy (v poli tříd)
je 2x pomalejší než přiřazení přímo do pole.
Třeba takové vytváření třídy je taky mnohonásobně
nákladnější než jen zapisování hodnot do pole - samotné vytvoření
třídy a naplnění daty je v OOP dokonce operace více než o řád
pomalejší než bez OOP.
Co je to "Pole tříd"? V OOP, pokud vím, nic takového není.
Do vlastností tříd nikdy nic nepřiřazuji.
Vytváření třídy dělá JIT kompilátor. To je pouze při spouštění.
Třídu nikdy daty neplním, protože by to bylo pomalé.
Tak já se taky zapojím. V OOP je objekt složitým datovým typem, tím
nejsložitějším. Proto bude vždycky pomalejší. Taky bere ohromné
množství paměti. Ale OOP se kvůli rychlosti nevyužívá. Určitě není
nutné bát se OOP kvůli rychlosti, protože v lidském vnímání je rozdíl
opravdu minimální. Také záleží na návrhu aplikace. Já se vždycky
snažím držet podle citátu:
Vždy pište kód tak, jako by ten chlapík, co ho po vás bude udržovat,
měl být násilnický psychopat, který bude vědět, kde bydlíte.
Když máš v aplikaci 500 objektů, z čehož v dobrém návrhu užíváš
najednou jen 10 a ve špatném všech 500, je to rozdíl.
Jak už jsem psal, OOP se kvůli rychlosti neužívá, užívá se kvůli
rozdělení aplikační části a kvůli přehlednosti, znovupoužitelnosti a
obecnosti.
Snorlax: Věř, že kdyby to v OOP bylo pomalejší a zároveň horší jako
návrh, nikdo by to nepoužíval. Ovšem OOP používá každý druhý programátor (nepočítám ty,
kteří pracují v plně objektových jazycích nebo neobjektových jazycích),
takže si můžeš být jistý tím, že sám narazíš na výhody, které OOP
přináší.
OOP je programovacia technika. Mozete ju pouzit aj ked ju jazyk priamo
nepodporuje (kludne mozete pouzit OOP v cistom C...). Samozrejme v jazyky ktory
podporuje OOP sa pise OO kod lepsie. Objekty mozu byt v jazyku implementovane
roznymi sposobmi, napr v c++ si mozete vybrat ci ma obsahovat virtualne metody
alebo nie (objekt nemusi vobec obsahovat pointer do vtable a moze byt velmi maly
a po inlinovani metod a celych objektov je velmi rychly). V javascripte je zas
Prototype-based OOP (cize samotne objekty uchovavaju svoj interface, nemaju
presny typ/triedu). V objective-C, Smalltalk a podobnych jazykoch zas objekty
kumunikuju pomocou sprav...
Tymto som chcel povedat ze v roznych jazykoch mozi byt OOP podporovane inym
sposobom a moze podporovat ine vlastnosti. Niekedy moze byt oop pomale, inokedy
rychle...
Nezabudajte ze OOP sa da kombinovat aj s inymi programovacimi technikami.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.