Autor | Zpráva | ||
---|---|---|---|
han5vk Profil |
lionel messi:
Tvoj nový kód takisto skončí v prvej iterácii for cyklu, pretože máš return v tele cyklu, a nie až za ním. Taktiež by nebolo veľmi jasné aké čísla sa vlastne vygenerovali, pretože ich spájaš do premennej $vysledok bez akéhokoľvek oddelenia, takže napríklad pre kocku s 20 stenami zavolaním hodSi(2) by si dostal výsledok 112 , no nevedel by si, či vlastne padlo 11 a 2 alebo 1 a 12 . Takže buď to treba nejako oddeľovať, alebo ako vravíš, vraciať pole. Neviem si ale predstaviť, v akej situácii je potrebné naraz hodiť kockou n-krát.
|
||
Alphard Profil |
#2 · Zasláno: 19. 8. 2015, 21:38:58
lionel messi:
„Alternatívou (zrejme lepšou) tiež môže byť naskladať jednotlivé výsledky hodov do poľa.“ Určitě, záleží na použití. Tady bych si uměl docela dobře představit i yield .
Pokud jde o návrh, zvážil bych vyčlenění samostatné metody pro jeden hod kostkou (byť to v tomto jednoduchém případě vypadá téměř absurdně). A podmínka if ($pokus >= 1) tam podle mě působí spíš rušivě.
Tomáš123: „Kúpil som si teda knihu Mistrovství v C++ a teraz ju po večeroch čítavam. Možno by si sa tiež mala vydať touto cestou.“ No nevím. Znát C++ bych sice doporučil každému vývojáři, ale snadné začátky by to určitě nebyly. Nebo myslíš, že jo? Rád si na tohle téma popovídám, C++ mám rád, ale PHP se mi zdá i v tomto ohledu lehčí. I když souhlasím s tím, že v jiných aplikacích typických (nejen) pro C++ by se vhodné příklady na OOP hledaly líp. juriad: „Objekty mají obvykle význam k tomu, abys něco namodelovala (jako třeba ten formulář) a pak ho najednou vytvořila. Vytvořit psa sice vypadá pěkně jako příklad, ale není zřejmé, k čemu je to vše dobré.“ Tady bych zdůraznil hlavně to množné číslo. Je těžké učit objektový návrh na jedné třídě, jenže i s ní má smiesek problémy. smiesek: Nevím, jestli s tímhle nepřestřelím složitost, ale vzpomínám si na jeden typ příkladů z knihy (už nevím které) Rudolfa Pecinovského. Vysvětlovat objekty pomocí grafického kreslení různých tvarů. Uměl bych si to představit i v PHP, i když bez dynamického pohybu :-(. Jestli je zájem, snad bych si našel čas připravit nějaké pískoviště a pár úkolů k tomu. |
||
Jan Tvrdík Profil |
#3 · Zasláno: 19. 8. 2015, 21:48:40
Alphard:
„vzpomínám si na jeden typ příkladů z knihy (…) Rudolfa Pecinovského“ Já mám zase rád clanky.havrlant.cz/oop |
||
smiesek Profil |
#4 · Zasláno: 20. 8. 2015, 04:22:01
Alphard:
„připravit nějaké pískoviště“ samozřejmě já uvítám jakoukoli pomoc, protože zase mám pocit, že včerejší snaha všech zúčastněných v tomto vláknu mi pomoci a vysvětlování, byla zbytečná :( Tak musím zase najít jinou cestu a nebo motivaci, jak to prolomit. Jan Tvrdík: „Já mám zase rád clanky.havrlant.cz/oop“ zkusím dneska pročíst a něco málo vykoušet, i když by to měly být tedy asi pouze modelové ukázky, ale třeba se chytím a nebo opět ne :( Třeba pak nějak budu schopná dokončit původní zadání s kostkou a pochopit co jsem udělala za prvotní chyby a jak to dále rozšířit, protože moje původní řešení mi příjde extra strohé. Ještě jsem pak přemýšlela, jestli je lepší tedy způsob pochopení zvolit od prázdného papíru a nabalovat a nebo si vzít hotové řešení a na tom se pokusit pochopit princip a rozpitvat jej. Když s tím mám takové problémy :( |
||
smiesek Profil |
dokážu pořád nic pochopit a pochytit a to mě pak nutí si to prostě převést do fotografické paměti a nesnažit se pochopit logiku, než podívám se a vidím.
Zase se hrabu v tom, jaký je rozdíl a zápis při použití zapouzdření public a private :( Snažila jsem se napsat i nějaký vlastní "tahák", ale prostě jej z celého vlákna vlastně ani neumím vypsat ty nejdůležitější informace a nedokážu je vypsat vlastně ze žádných seriálů na internetu :( Mám jen následující: 1. Zapouzdření A) public - přístup zvenku a zevnitř třídy B) protected - přístup zevnitř a odvozených tříd C) private - přístup pouze zevnitř 2a. Přístup I. Zvenku II. Zevnitř - použití proměnné $this 2b. Přístup i. Přímo ii. Nepřímo - vytvoření dvojice funkcí getter a setter Jak ale poznám jaké je konečné použití? Nepřímý přístup budu používat pokud budu chtít pomocí funkce něco kontrolovat a provádět? Jak se pak jednotlivé přístupy zvenku a zevnitř liší při výpisu dat ze třídy = o co následuje za $pes = new Zvire(); Jen tak jsem si vytvářela následující s použitím public a private, ale nerozumím tomu kodu co jsem vytvořila :( - to je to moje jen tvoření podle nějakého mustru/předlohy, ale nepřemýšlení nad postupem :( PUBLIC class Hokejista { public $jmeno; public function KdoJsem() { $this->jmeno; } } $petr = new Hokejista(); echo $petr->jmeno = 'Petr'; PRIVATE class Hokejista { private $jmeno; public function SetKdoJsem($jmeno) { $this->jmeno = $jmeno; } public function GetKdoJsem() { return $this->jmeno; } } $petr = new Hokejista(); $petr->SetKdoJsem('Petr'); echo $petr->GetKdoJsem(); Tu PUBLIC bych napsala i takhle, sice to zatím mi nic nevypisuje, ale chcu ukázat, na co se ptám class Hokejista { public $jmeno; public function KdoJsem($jmeno) { return $this->jmeno = $jmeno; } } $petr = new Hokejista(); echo $petr->KdoJsem('Petr'); Prostě když se řekne přístup zevnitř, tak vím a dokážu odůvodnit, musí se použít $this, ale když někdo řekne, bude se přístupovat zvenku, tak čím se to bude lišit od přístupu zevnitř? Třeba právě u té proměnné public, ke které se může přistupovat jak zvenku, tak zevnitř, tak jak vypadají oba přístupy pro porovnání (to je to o co jsem se snažila v té třídě, jak mi to nechce nic vypisovat)? Zase to asi jedině mi pomůže fotografická paměť, protože to jinak nepochopím :( tak už vypisuje, musela jsem přidat return $this->jmeno = $jmeno; |
||
juriad Profil |
#6 · Zasláno: 20. 8. 2015, 11:08:37
smiesek:
Ten první public: Metoda KdoJsem (konvence říká, že by měla začínat malým písmenem, tedy kdoJsem ) nedělá vůbec nic. Nic nemění a nic nevrací; když 6. řádek vynecháš, bude to přesně to samé. Jaký je její zamýšlený účel?
Na 11. řádku nastavíš veřejný atribut na hodnotu 'Petr' a okamžitě jej vypíšeš. Každý příkaz by měl dělat jednu věc, takže si to rozepiš na: $petr->jmeno = 'Petr'; echo $petr->jmeno; Private: Ten je naprosto v pořádku. Druhý public: Co zamýšlíš od metody KdoJsem? Nechápu jí. Ta metoda funguje jako setter - nastaví soukromý atribut jmeno a nové jméno zároveň vrátí (proč ho vrací dělá?). Opět rozepsáno: $petrovoJmeno = $petr->KdoJsem('Petr'); # není poznat, proč metodě KdoJsem předáváš jméno (není to divné? Hokejsta přece ví, kdo je). Ta konvence pojmenování setterů má smysl. echo $petrovoJmeno; # a tady si vypíšeme jeho jméno, jak jsme mu ho nastavili. Zapomínáš, že getter a setter můžeš použít (ve smyslu naprogramovat) ať je modifikátor přístupu jakýkoli. Zřejmě se slov get a set bojíš pří public deklaraci, což způsobuje to, že vytváříš nějaké zmetky v podobě metody KdoJsem .
|
||
smiesek Profil |
juriad:
ano, jsem si vědoma, že getter a setter lze použít bez ohledu na modifikátor přístupu, ale pořád se nyní snažím najít rozdíl v zápisu, když budu vypisovat modifikátor public pomocí přístupu zvenku a jak se to zapíše, když k tomu budu přistupovat zevnitř. Pořád mým účelem zamýšlení je pochopit Třídy, což je nereálné a vymýšlím nějaké hňupiny, na kterých si "něco" vyzkoušet, když si někde něco přečtu, ale stejně to je nic platné, pak tedy ani nedokážu vytvořit něco reálnějšího když neumím použít základy :( Když sem vložíte nějaký kod, co následuje po new (tedy definování objektu) tak chcu umět poznat, že se přistupuje zvenku a nikoliv zevnitř, třeba ... prostě umět číst a rozebírat kody/třídy a vlastně celé php, ale to mi zase napíšete, že když nemám základy, tak to nelze (asi něco umět cizí jazyk a neznat slovíčka), ale jak mám něco vytvořit, když nedokážu pochopit ani základní rozdíly? |
||
Kcko Profil |
smiesek:
Stav se někdy na Nettí posobě, sice tam nejsou začátečníci, ale myslím, že by se tam našel někdo kdo by si s tebou na hodinu, dvě sedl stranou a přímo by Ti spoustu věcí ukázal. Pak už jen někoho zaplatit na doučování, abys probourala základní problémy. Ale opakuji, co jsem už jednou napsal a neber to nijak zle, tenhle obor pro Tebe moc není. Měla jsi i problémy s poli, což je naprostý základ a relativně jednoduchá věc a i v tom si se motala jak nudle v bandě. Zkoušej, procvičuj a OOP bych asi tedy zatím vynechal ... nikde není psáno, že i bez OOP nemůžeš napsat pěkný PHP kód. Předpokládám, že intranety a velké aplikace stejně psát nebudeš ... PS. Projdi si několik odkazů z https://www.google.cz/search?q=how+learn+OOP+PHP+tutorial&ie=utf-8&oe=utf-8&gws_rd=cr&ei=u6LVVareLIvSU-aqiqAK a zkus si vygooglit (třeba na Youtube) nějaký seriál o OOP. A hlavně pořád negativně nesmajlíkuj a nepropadej depresi, já jsem PHP ani objektům na začátku taky nerozuměl a když jsem si otevřel svoje prvotní kódy tak jsem dostal záchvat smíchu. PS2. Co kódování, baví tě? Skriptování? JS / jQuery, 2D Grafika? (Photoshop, weby, tiskoviny, plakáty, loga) nic? Znám spoustu zástupkyň ženského pohlaví co dělají grafiku ba i takové které kódují. Programátorku znám za svojí X letou praci jenom jednu. Mě osobně baví víc frontend část (kodování a skriptování), programuji už mnohem méně ... , použití nějakého preprocessoru (SASS/LESS) je poměrně velká zábava a dá se tam i programovat ;-) Edit: Ještě mě tak napadá, pokud bys odpověděla, že Tě PHP maximálně baví, tak se můžeš zatím podívat jak oddělit výpis od logiky => MVC, Honza Tvrdík udělal pěkné demo: |
||
Tomáš123 Profil |
#9 · Zasláno: 20. 8. 2015, 20:15:16
Alphard:
> Možno by si sa tiež mala vydať touto cestou.“ > ... snadné začátky by to určitě nebyly. Nebo myslíš, že jo? Neuvedomil som si, že to môže vyznieť aj ako rada najprv sa učiť C++. Nemám skúseností, zatiaľ si nemyslím nič. :-) „Rád si na tohle téma popovídám“ Knihu som si kúpil presne pre to, že je tam viac príkladov a je to jeden z najzákladnejších jazykov čo sa OOP týka. C++ je hlbší ako PHP, takže pochopiteľne jednoduchší nebude. Začiatky s ním ale nemusia byť nutne ťažšie. Možno až ten prechod do pokročilejšej časti. Neviem. Taktiež OOP je rozvinutejšie. Keďže jediný programovací jazyk, s ktorým mám skúsenosti je PHP, príde mi výpis typu cout << "Nejaký reťazec" << endl; trochu divný. Symbol << vraj má predstavovať smer toku dát. Intuitívnejšie mi pripadá PHP (našťastie je tam aj syntax s printf "..."; ) :-).
Čo je trochu škoda, tu na diskusii nie je žiadna kategória kde by som sa mohol pýtať na nejasnosti v C++. Nechcem si hľadať iné fórum :-/. Zaujíma ma tvoj pohľad na C++. Prípadne môžme túto diskusiu rozviesť a vyčleniť do nového vlákna. S mojimi znalosťami asi nie som dobrý kandidát na rozoberanie pokročilejších tém, ale rád si také diskusie čítam. Podobne tak aj toto vlákno pre mňa bolo prínosné a ujasnilo mi mnoho vecí. |
||
Alphard_ Profil * |
#10 · Zasláno: 20. 8. 2015, 23:40:27
[#4] smiesek:
„samozřejmě já uvítám jakoukoli pomoc, protože zase mám pocit, že včerejší snaha všech zúčastněných v tomto vláknu mi pomoci a vysvětlování, byla zbytečná :(“ Zamýšlel jsem to jako další krok, měla to být demonstrace dedičnosti, kompozice objektů, polymorfismu. V dané situaci by to nepomohlo. (Tohle je diskuse mimo téma k C++) [#9] Tomáš123 Nevím, které hlubší části máš na mysli. Nemám pocit, že by v PHP (na jeho úrovni) oproti C++ chybělo něco zásadního pro objektové modelování. V C++ si mohu sám řídit správu prostředků, ale to pro pochopení přináší spíš problémy. Určitou výhodu bych možná viděl v nutnosti používat pro polymorfismus abstraktní třídy (myšleno interfacy). Určitě uznávám, že seznámení se s kopírovacími konstruktory, přetěžováním operátorů, ruční správnou paměti a milionem dalších věcí je užitečné a člověk pak lépe pochopí ostatní jazyky. Ale pro někoho, kdo má problémy i v PHP, se mi to zdá naprosto mimo. Navíc je kromě jazyka samotného nutné zvládnout od začátku i prostředí pro vývoj kompilovaných programů. I kvůli tomu si myslím, že začátky v C++ budou nutně těžší než v PHP. Kdybych měl rozebírat už praktické použití jazyka, tak já beru C++ jako vynikající jazyk pro specifické podmínky, ale člověk musí vědět, proč ho pro daný projekt používá. Stále má své místo na informatikách a předpokládám, že ještě dlouho mít bude. Mluvit o něm ale jako o snazší alternativě k PHP je úsměvné, kdyby to četli někteří z http://devel.cz/otazka/jaky-jazyk-ma-smysl-se-naucit#answer-10072, budu tě lynčovat :-) Tvůj přístup, zvládat PHP a k němu se učit C++ se mi zdá mnohem lepší. Ale předpokládám, že sis cíleně vybral C++ protože chceš psát třeba nějaké knihovny, herní enginy nebo multiplatformní aplikace. „Zaujíma ma tvoj pohľad na C++.“ Asi viz výše, nebudu to v tomhle vlákně radši už moc rozebírat. C++11 a C++14 ho aspoň trochu přibližují modernímu světu. |
||
Tomáš123 Profil |
#11 · Zasláno: 21. 8. 2015, 12:19:17
Alphard:
„Určitě uznávám, že seznámení se s kopírovacími konstruktory, přetěžováním operátorů, ruční správnou paměti a milionem dalších věcí“ To som myslel tým, že C++ je hlbšie. „Tvůj přístup, zvládat PHP a k němu se učit C++ se mi zdá mnohem lepší.“ V skutočnosti som začal s C++, aby som mohol vytvoriť OOP redakčný systém na svoj web. Na to, aby som pochopil ukážkové kódy budem musieť trochu C++ ovládať, ale zatiaľ sa ho nechystám vo veľkom využívať. Časom sa to možno zmení, ale zatiaľ uprednostňujem skôr webové technológie. Ak ma k tejto téme napadnú nejaké otázky, založím si vlastné vlákno. Ďakujem za krátky rozhovor. |
||
smiesek Profil |
(Ne)Rozumím a nemohu se současně dopátrat, prosím u následujícího kodu?
$vek = self::$rocnik->rocnik($cislo); Je to vytrženo z kontextu od jednoho dotazujícího se, originální je: $request = self::$connection->prepare($sql); já jsem si ten řádek upravila dle mně bližších názvů jednotlivých částí, tedy: a) self znamená, že před tím je statická proměnná pro datový člen $rocnik b) $rocnik je v tomto případě objekt/instance veřejná, tedy public, v opačném případě by se použilo $this pozn. no a tady jsem se u toho zarazila/zastavila, co si představit pod $cislo, co vlastně tomu předchází? Pokud by to bylo u metody/funkce, tak ano to budu chápat, že je to její parametr, ale takhle, pokud je to u datového členu, soudím dle slova self, jinak by tam přece bylo parent, tak netuším. Stejně tak jako bych u jeho použití $connection použila třeba název pro objekt $zena $vek = self::$zena->rocnik($cislo); $zena , pak bych se možná někam posunula dál v luštění kódu.
c) proměnná $vek bude obsahovat nějaký ten ročník, se kterým/se kterou se bude dále pracovat |
||
juriad Profil |
smiesek:
Když používáš self , odkazuješ se zevnitř na statický atribut (proměnnou, která je sdílená všemi objekty). V případě osob to nemá přílíš smysl.
Takže tvůj řádek udělá toto: Za podmínky, že ten řádek kódu je v nějaké metodě třídy, která má (respektive její předek má) statickou proměnnou libovolného přístupu (respektive public nebo protected) jménem rocnik . $this bys použila, kdyby to nebyla statická, ale instanční.
Pak v této proměnné musí být uložený objekt, který má public metodu rocnik , kterou lze zavolat s jedním argumentem a která něco vrací.
Když uvedu hodně umělý případ, tak by to mohlo vypadat takto: class Pocitadlo { private $pocet = 0; function getPocet() { return $this->pocet;} function incrementuj() {$this->pocet++;} } class Osoba { private static $pocitadlo = NULL; private $cislo; function __construct() { # pokud počítadlo ještě neexistuje, vytvoříme nové (toto nastane u první osoby) if (self::$pocitadlo == NULL) {self::$pocitadlo = new Pocitadlo();} self::$pocitadlo->incrementuj(); $this->cislo = self::$pocitadlo->getPocet(); } function getCislo() {return $this->cislo;} } for ($i = 0; $i < 10; $i++) { $o = new Osoba(); echo "Jsem osoba číslo " . $o->getCislo() . "\n"; } Ale je asi zřejmé, že to samé by šlo udělat i bez Počítadla tak, že by statická proměnná rovnou obsahovala číslo. Ale snad je zřejmé, že kdyby to bylo něco složitějšího (například to spojení k databázi), tak to může mít smysl. class Osoba { private static $pocitadlo = 0; private $cislo; function __construct() { self::$pocitadlo++; $this->cislo = self::$pocitadlo; } function getCislo() {return $this->cislo;} } for ($i = 0; $i < 10; $i++) { $o = new Osoba(); echo "Jsem osoba číslo " . $o->getCislo() . "\n"; } Statické proměnné jsou užitečné jen velmi zřídka. Jejich hlavní problém je v tom, že je všechny objekty (dané třídy) sdílí a to může být velký problém, i když se to tak napřed nezdá: Kdo by kdy přece chtěl ukládat různé osoby do různých databází? Třeba kvůli výkonu - nějaké mohou být v memcachi, jiné v databázi, jiné můžou být archivované v xml. Kdo by kdy přece chtěl, aby různé osoby byly počítány zvlášť? Třeba při testování potřebuješ nasimulovat osobu s určitým číslem / kolize dvou osob se stejnými čísly. Jako začátečník na ně zapomeň. Zapomeň na slovo static. A skoro také na slovo self. To je ale užitečné k přístupu ke konstantám (ty používej často místo magických hodnot), příkladem je třeba třida php.net/manual/en/class.datetime.php. Přístupy (kdyby pocitadlo bylo public): zvenku instanční: přes proměnnou objektu - $o->vek
zvenku statická: přes název třídy: Osoba::$pocitadlo
zevnitř instanční: přes $this: $this->vek
zevnitř statická: přes self: self::$pocitadlo
Ještě k [#5]: je dobrým zvykem pojmenovávat metody slovesem (to je důvod, proč se mi název KdoJsem nelíbil). |
||
Časová prodleva: 10 let
|
0