21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
« 1 2 3
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
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
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
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
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;
Třeba je to teď jasnější.

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
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 *
[#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
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);
, ale dle toho, co se snažím nastudovat u Tříd, by to už byla úplná hňupina, přece objekty/instance se tvoří mimo funkce, abych to mohla teoreticky nechat takhle a nebyl to takový blud, bych musela hned v úvodu třídy definovat datový člen $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).
« 1 2 3

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