Portál AbcLinuxu, 10. května 2025 01:14

Dotaz: Zapouzdření php kódu

31.10.2014 23:35 Pavelec
Zapouzdření php kódu
Přečteno: 829×
Odpovědět | Admin
Ahoj. Pokud programuji procedurálně a nechci používat objekty, jak můžu zapoudřit jednotlivé části kodu bez použití funkcí? Dík
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 1.11.2014 00:14 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejlépe tím, že použiješ objekty a jejich metody.

Pokud však máš masochistické záliby, můžeš začít zde.
Hello world ! Segmentation fault (core dumped)
FrostyX avatar 1.11.2014 13:09 FrostyX | skóre: 27 | blog: Frostyho_blog | Olomouc
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je to jen teoretická otázka jejímž cílem je rozšířit si obzory o tom, jakými způsoby lze programovat, nebo se to chystáš někde použít?
FrostyX.cz | 1984 was not supposed to be an instruction manual.
FrostyX avatar 1.11.2014 13:16 FrostyX | skóre: 27 | blog: Frostyho_blog | Olomouc
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
V prvním případě by se možná o nějakém "zapouzdření" dalo mluvit, třeba rozdělením jednotlivých kusů kódu mezi samostatné soubory? Možná? V druhém bych řekl, nedělej to, použij funkce, třídy, cokoliv můžeš.
FrostyX.cz | 1984 was not supposed to be an instruction manual.
1.11.2014 15:40 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Co to vlastně je zapouzdření?

Například v zápiscích z kurzu Advanced Programming Languages z lekce o existenciálních typech definují zapouzdření takto:
data abstraction, which in the object-oriented programming world sometimes is called information hiding or encapsulation. This is a feature in which the type system hides internals of objects, enforcing an abstraction barrier between the implementer and the clients of the class. This abstraction barrier helps keep different parts of the system loosely coupled so they can be updated and maintained without close coordination.

Data abstraction is offered in its purest form by existential types. The idea is that we can hide part of a type τ and replace it with a type variable α. We write ∃α.τ to represent this type, where α may be mentioned inside τ. But because this type does not say what α is, no code receiving a value of this type can make use of knowledge of the hidden part of this type.

1.11.2014 13:17 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
IMHO si někde přečetl, že OOP jsou delší, pomalejší, složitější, méně přehledné, ... a chce se tomu vyhnout.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
FrostyX avatar 1.11.2014 21:45 FrostyX | skóre: 27 | blog: Frostyho_blog | Olomouc
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Imho si přečetl, že je OOP náročné na systémové zdroje a chce přehnaně optimalizovat :-D
FrostyX.cz | 1984 was not supposed to be an instruction manual.
1.11.2014 23:05 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Tuhle pomluvu na OOP jsem už také někde slyšel. Pořád tvrdím, že za to mohou chybně navržené gettery a settery :-)
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
11.11.2014 17:34 H|H
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
A oni jdou snad navrhnout chybně gettery a settery ? Co si pod tím mám představit, narážíš na něco konkrétního ?
11.11.2014 18:01 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud getter jen předává hodnotu atributu a setter ho pouze nastavuje, je to špatně. Prostě se jimi plýtvá, ve většině případů je jejich použití zbytečné.

Názvy metod nemají být podstatná jména s nějakou předponou get/set (maďarská notace), ale slovesa. Atributy objektu mají být privátní a neměly by se nim dělat přístupové metody.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 11.11.2014 19:48 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud jazyk nemá podporu pro properties, jako např. C#, tak není moc jak to jinak udělat, než pomocí getterů a setterů, leda mít public proměnné, ale to se nehodí vždy.

Pointa triviálních get/set je v konzistentnosti API. Pokud potřebuju u pár setterů něco počítat, je lepší mít settery na všechno, neboť pak při použití není potřeba přemýšlet, zda tahle věc se nastavuje tak či onak. Stejně tak s gettery. Pokud bych se pokusil číst ještě nespočítanou hodnotu, mělo by to hodit výjimku, ale číst něco přes public proměnné a něco přes getter znamená kopec bordelu.

Takže pokud překladač daného jazyka zvládne triviální gettery a settery vyoptimalizovat (inline), není důvod si v tom dělat bordel (např. Qt v C++, kde setter je navíc i slotem pro signály). PHP nabízí __get a __set a volání nevyoptimalizuje, takže tam je lepší public proměnná a trocha magie, pokud je třeba. C# zas má nativní podporu pro properties, takže tam gettery a settery vůbec nemají co dělat. No a v Javě je kopec bordelu i tak, takže tam se to ztratí, ať se použije cokoliv ;-)
Hello world ! Segmentation fault (core dumped)
11.11.2014 20:08 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Public proměnné raději nebrat.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 12.11.2014 02:40 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud getter jen předává hodnotu atributu a setter ho pouze nastavuje, je to špatně. Prostě se jimi plýtvá, ve většině případů je jejich použití zbytečné.
Sám říkáš totéž. Nic jiného než getter/setter a public proměnná není.
Hello world ! Segmentation fault (core dumped)
12.11.2014 06:24 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Je. Použití doménové logiky.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 12.11.2014 11:16 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Ale i té potřebuješ data nějak předat.
Hello world ! Segmentation fault (core dumped)
12.11.2014 11:40 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Buď konstruktorem, anebo metodou. Jak prosté. Nepředávám však data atributu, ale celému objektu. Voláním metody dávám objektu příkaz (vyjádřený nějakým slovesem) a v parametru mu dám nějaká data. Metoda v objektu rozhodne, jak se s daty naloží - název metody nijak nemusí nesouviset s vnitřní strukturou objektu, která by měla zůstat skrytá.

Když metodu nazvu $obj->setDatum($datum), tak odkrývám, že se uvnitř nachází atribut Datum. Porušuji zapouzdření a dělám tedy totéž, jako kdybych napsal $obj->datum = $datum. Druhý zápis je přehlednější.

Podobně místo $datum = $obj->getDatum() je vhodnější použít $datum = $obj->datum. Výraz $obj->datum na rozdíl od toho předchozího můžeš expandovat i ve stringu nebo v Heredoc.

Vnitřek může být skryt za metodami __get() a __set().

Abych předešel dalším dohadům: Používám postup popsaný v prvním odstavci. Názvy mých metod nijak nesouvisí s názvy atributů uvnitř mých objektů.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 12:24 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
asi nerozumim tomu, co je to to zapouzdreni, ale to ze z nazvu metody nema byt jasne co ta metoda dela slysim poprve a spis nez zapouzdreni bych to nazval skryvani - coz je k nicemu, naopak si myslim, ze z nazvu metody ma byt jasne co dela
12.11.2014 12:29 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Název metody nemá souviset s názvy atributů objektu, ale má být jasné, co s objektem dělá. Přečti si ještě jednou a pořádně, co jsem napsal.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 12:39 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Nevim, at ctu jak ctu, tak jde o skryvani ne o zapouzdreni. Ale mozna je to tim ze nazvy jako $obj->setDatum($datum) nepouzivam, nekombinuju jazyky ani v nazvech fu, metod, promenych, parametru, konstant atp.

Ale obecne je zapuzdreni o tom, ze se z venku k vlastnostem objektu dostanete jen "predepsanou" cestou a to pres zpristupnene rozhrani. Jak pojmenovavat pak uz nema se zapouzdrenim nic spolecneho. Pokud tedy vas prispevek rika zhruba to tak s nim nemam problem a jen jsem neporozumel textu. :-)
12.11.2014 13:41 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud narážíš na to, že by správně mělo být
$obj->setDate($date)
tak jsi na omylu. Je to úplně stejně špatně.

Co znamená "predepsanou" cestou? To bych mohl klidně napsat $obj->date = $date a označit ten zápis jako předepsanou cestu.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 13:43 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
predepsanou sestou myslim to co jsem napsal - pres poskytnute rozhrani
12.11.2014 13:50 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
No právě. Které rozhraní máš na mysli?
$obj->setDate($date);
nebo
$obj->date = $date;
Obojí je špatně. Ke druhému zápisu sice máme poskytnuté rozhraní, ale používá se obvykle jen u objektů třídy stdClass.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 13:57 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
$obj->date = $date; neni uziti rozhrani ale primy pristup k vlastnosti objektu - a tomu prave brani zapouzdreni

zapouzdreni se nestara o to jak je rozhrani pojmenovane, zapizdreni je zpusob/princip pristupu k vlastnostem objektu

kdyz se parta progrmatoru dohodne ze v projetku budou pouzivat pro pristup k vlastnostem A, B, atd. metody pojmenovane

setA(A)

setB(B)

atd.

tak jde porad o zapouzdreni, jen si tim treba komplikuji citelnost kodu ap. , ale zapouzdreni tim neporusuji
12.11.2014 14:10 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Zkus to vysvětlit programátorům v C#. PHP disponuje podobnými prostředky. Že by totéž v C# a v PHP nebylo totéž?

Kde máš definováno rozhraní setA a
setB
?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 14:24 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
prece v te tride - to jsou metody objektu pro pristup k vlastnostem objektu
Josef Kufner avatar 12.11.2014 14:14 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
$obj->date = $date; neni uziti rozhrani ale primy pristup k vlastnosti objektu
Public property je součást rozhranní a nijak to nekoliduje se zapouzdřením.
Hello world ! Segmentation fault (core dumped)
12.11.2014 14:35 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
tak pokud chcete nejakou vlastnost mit zverejnenou pak nejde o zapouzdreni, o kterem je tu rec
12.11.2014 14:53 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
$obj->setDate($date);
také není zapouzdření, o kterém je tu řeč.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 15:31 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Jak to?

je to public metoda ktera vam odstini co se v objektu stane - neresi co se v objektu stane, co je to datum - jestli retezec, objekt ..., proste na venek o tom nevite nic
12.11.2014 19:22 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Zápisy
$obj->setDate($date);
$obj->date = $date;
se liší pouze syntaxí, sémanticky jsou shodné. Proč bych měl v PHP dávat přednost prvnímu zápisu, když např. v C# je preferován ten druhý?

A proč bych měl používat některý z nich, když ani jeden nepotřebuji?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 11:28 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Nerozumim v cem jsou shodne? jedno je prirazeni hodnoty primo atributu a druhe je volani nejake metody, ktera muze delat cokoli - muze napr predavanou hodnotu validovat, prevest na pozadovany format - proste volanim metody nevite nic o tom co se uvnitr deje, co to udela s objektem, nevite ani to jestli objekt vubec ma nejaky parametr date - to je princip zapouzdreni - z vnejsku netusite nic o tom jak je to v objektu realizovano, protoze to ani nepotrebujete ani nemate znat - znate jen rozrani.
13.11.2014 13:04 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Všechny požadované vlastnosti má i zápis
$obj->date = $date;
  • nevím nic, co se uvnitř děje
  • nevím, co to udělá s objektem
  • nevím, jestli objekt má vůbec nějaký atribut date
  • znám jen rozhraní
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 14:06 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
? do nejake clenske promene priradim hodnotu 1 - tak jak to ze nevim co se deje? vim ze promena ma tuto hodnotu, tedy vlastnost objektu reprezentovana tou promenou ma tuto hodnotu 2 - vim tedy, co to udela s objektem - nastavi to vlastnost toho objektu na tu hodnotu 3 - ano to nevim a tak dojde k chybe - vyjimce pokud se takovy atribut pokusim nastavit 4 - rozhrani neznate pokud v predeslem rikate, ze nevite jestli ten tribut date existuje - neexistujci atribut neni soucasti rozhrani

Prave i tyto problemy uziti rozhrani resi - s rozhraim neresite jestli existuje konkretni vlastnost objektu, protoze k ni nepristupujete primo, neresite jestli te vlastnosti prirazujete platnou hodnotu, metoda setDate, kterou tu pro priklad uzivame, nic nerika o tom jestli objekt ma nejakou vlastnost date - klidne muze jen predavanou hodnotu nekam ukladat, vubec s ni nemusi v objektu nic nastavovat ...
13.11.2014 14:17 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
  • k proměnné přece v tom kódu také nepřistupuji přímo, ale přes setter
  • o jakém rozhraní tady pořád píšeš? Žádné jsi nedefinoval, takže ani ve tvém případě ho neznám
  • pokud se pokusím nastavit neexistující atribut, také dojde k chybě, resp. výjimce
  • Jestli atribut date existuje nebo ne, záleží právě na tom rozhraní
  • v mém zápisu se předávaná hodnota také může někam ukládat, například do databáze
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 14:45 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Vy pisete o "magickych metodach" (__set) ? nebo jaky setter?, ve vasem prikladu ukladate hodnotu primo do promenne - __set neni totez co verejne rozhrani objektu- rozhrani slouzi pro pristup k existujicim vlastnostem objektu, magicka metoda neexistujici vlastnost vytvari

rozhrani - jak jsem uvedl - v teto debate treba ta metoda setDate, kterou tu v prispevcich uzivame - proste public metoda toho objektu, ktera slouzi pro pristup k existujicim vlastnostem toho objektu

13.11.2014 15:24 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Ano, píši o magické metodě __set(), která se používá přesně tím způsobem, jaký jsem popsal. Volání takové metody je totožné s přístupem k veřejnému atributu.

Programátoři v C# tento postup používají stále, i když definice přístupových metod je poněkud odlišná - pro každou property píší samostatný getter a setter. PHP si vystačí s jedním getterem a jedním setterem pro všechny atributy.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 15:48 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Ale zapozdreni neni o verejnem atributu, to je naopak o privatnim - z vnejsku nepristupnem a pokud ma byt pristupny tak jen pres verejne rozhrani.

__set() - neslouzi k zapouzdreni - protoze pres nej muzete pristupovat k cemukoli, i k tomu co nema byt pristupne z vnejsku + jeste neexistujici property pres nej muzete vytvaret, takze meni strukturu obj.

takze abyste mohl __set() pouzivat pro zapouzdreni tak z nej nakonec budete mit tak komplikovanou metodu (treba pres if, switch, atp.), ze to nakonec zadnou vyhodu nema

navic se muzete dostavat do problemu, ze pokud nekde v kody pres __set() vytvorite property a jinde ji pak pres __get() ctete, pak nekde zmenite tu cast kodu kde jste pouzival __set() (nevytvorite property), tak vsude jinde kde tu property ctete pres __get() mate chybu - objekt se nezmenil - jen jste mu nekde zapomnel pricarovat property - pri normalim rozhrani se pro vas nic nemeni - property obektu vzdy existuje a vy k ni pristupujete pres to rozhrani ...

takze abych to shrnul pres __set() udelat zapouzdreni nic nevylepsuje, neusnadnuje, naopak to jen zneprehledni kod
13.11.2014 16:12 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Přes __set() nemůžeš přistupovat k čemukoli. Zkus si tohle:
class Setter {
    private $date;

    private function setDate($date) {
        $this->date = $date;
    }

    function __set($key, $value) {
        $method = "set" . ucfirst($key);
        $this->$method($value);
    }
}

$obj = new Setter();
$obj->date = new DateTime();
Má to všechny vlastnosti, které jsi požadoval. Není tam žádný if ani switch, atribut $date je privátní. Od tvého řešení se liší pouze syntaxí volání.

Přiznám se však, že v této podobě bych to asi nepoužil, protože gettery, settery ani veřejné atributy obvykle nemám důvod používat.

Takze abych to shrnul: Udělat zapouzdření přes setDate() nic nevylepšuje ani neusnadňuje, naopak to jen znepřehlední kód.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 17:27 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
ja v tom zadny prinos nevidim - stejne tam ten setter setDate musite mit - kdyz se chcete vyhnout tem if, switch apod. jen to schovate jeste za jednu metodu - proste pridate dalsi vrstvu - v cem je ta vyhoda? proste jen ten ze se vam vic libi zapis $obj->date = new DateTime(); $obj->setDate(new DateTime());

normalne muzete pouzit u slozitejsich trid interface a implements pro ohlidani toho, ze ta trida zpristupnuje to co ma, jak to udelate se __set ?

Myslim, ze na tema zda pouzivat __set nebo settery je plno dalsich diskuzi. Ja az do predminuleho prispevku netusil, ze vam jde o to zda pouzivat __set, kdyby jo, do te debaty bych se ani nepoustel - to jestli pri zapisu usetrim par znaku me nebere.
13.11.2014 17:38 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Složitější třída? To bude asi taková, která porušuje SRP :-)

Settery i __set() používat umím. Jen je považuji ve většině případů za zbytečné. Prostě se jimi v aplikacích neskutečně plýtvá. Často se kvůli pitomým getterům a setterům porušuje Déméteřin zákon.

Téma se jmenuje "Zapouzdření php kódu". Gettery a settery zapouzření porušují úplně stejně jako veřejné atributy.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 18:20 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
settry nic neporusuji - ty jsou k tomu urcene - proste zpristupnite pres metody ty vlastnosti objektu ktere maji byt pristupne z vnejsku a jsou pristupne jen timto jednim zpusobem - ten vas __set nedela nic jineho, je to jen jeste jedna vrstva nad settery - tak jak to pouzivate tak je to principialne vlastne neco jako factory

slozitejsi v tom ze implemetuje vice interface ...
13.11.2014 18:34 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Už jsem psal, že nepoužívám ani jedno z toho. Přečti si to ještě jednou a pořádně.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13.11.2014 19:04 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
tak jak pracujete s nejakym objektem? nepouzivate public metody,property ani __set, tak jak takovemu objektu posilate zpravy ... ?
13.11.2014 19:26 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Používám public metody, ale nejsou to gettery ani settery, protože jejich název (sloveso) říká objektu, co má udělat. Není odvozen od názvu atributů (podstatná jména) a proto se nedá označit jako setter.

Kdyby každý objekt měl jinou sadu atributů, nemohl bych používat polymorfismus.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
14.11.2014 12:13 Lucius
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
:-) takze vam jde vlastne jen o konveci pojmenovani, proto radeji rikam rozhrani a nemusi se pak vest zadna debata - a kazdy at si pojmenovava, jak mu je libo, jak se dohodnou v projektu
14.11.2014 13:37 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Správné pojmenování objektů, atributů, rozhraní a metod je v projektu klíčové. Jak někdo začne používat maďarskou notaci (předpony get-, set-, I-, apod), je to cesta do pekel.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
12.11.2014 13:41 Ivan Nový
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
No není to přesně totéž. Například porovnejte postupy objekt->udělejNěco(kdy) oproti objekt->datum = kdy a objekt->udělejNěco(). Druhý způsob pak vede na uvažování stylem, získat datum uděláníNěčeho a ne místo toho metody, objekt->získejVýsledkyPosledníhoUděláníNěčeho(). A tím se vnitřní implementace objektu dostává do vztahů mezi objekty a znesnadňuje údržbu, protože nakonec musíte programovat vazby mezi objekty. A ty musíte pracně hledat. Naproti tomu vám metoda získejVýsledkyPosdledníhoUděláníNěčeho, vrátí jednoznačný výsledek, který si stačí vypsat a nemusíte jeho strukturu nikde složitě mezi různými zdrojovými soubory hledat. Například.
Josef Kufner avatar 12.11.2014 13:54 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Jo, to máš pravdu. Naneštěstí dosti často však je nejlepší vystavit nějaké atributy/properties a pak pár metod, které s nimi něco dělají. Například třída pro odesílání mailů potřebuje nastavit předmět, odesílatele, příjemce a podobně, ale jak to uloží uvnitř už je na ní.
Hello world ! Segmentation fault (core dumped)
12.11.2014 14:06 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
mail($to, $subject, $message);
není třída, ale funkce pro odesílání mailů se třemi (i více) parametry.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 12.11.2014 14:15 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Tohle je značně nepraktické. Jak si poradíš s multipart zprávami, vloženými obrázky, BCC a CC adresáty, datem odeslání, Reply-To, …
Hello world ! Segmentation fault (core dumped)
12.11.2014 14:30 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Mohu přidat ještě čtvrtý parametr s objektem, který může obsahovat mj. i CC, BCC, datum, ... Kromě toho proměnná $message může být objektem, ve kterém bude multipart zpráva s vloženými obrázky.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 12.11.2014 17:19 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud ten jazyk neumí pojmenované parametry, tak z toho bude velmi brzy guláš. Tohle je právě ten případ, kdy obyčejný setter je mnohem lepší, neboť umožňuje objekt postupně nakrmit daty a pak mu teprve říct, aby něco dělal.
Hello world ! Segmentation fault (core dumped)
12.11.2014 19:33 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Tohle je zrovna případ "na hraně". Jak bys pomocí setterů nastavil dva CC: , tři BCC: a čtyři přílohy? Všimni si, že mám skutečné parametry sémanticky pojmenovány, guláš z toho nebude. Pojmenované parametry nejsou potřebné, protože už své jméno mají.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 12.11.2014 19:40 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Parametry pojmenované nemáš, guláš v tom bude tam, kde metodu voláš. ;-)

Více adres můžeš předat jako seznam, nebo ten setter bude adder – můžeš mít obojí, záleží na kontextu.
Hello world ! Segmentation fault (core dumped)
12.11.2014 19:49 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Je tak nezbytně nutné, abych měl v kódu pleonasmy typu
mail(to:$to, subject:$subject, message:$message);
?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 13.11.2014 00:43 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud máš parametrů spoustu a mají nastaveny defaultní hodnoty, tak je to jediná šance, jak to učinit čitelné. A protože to je příliš zvrhlé, používají se properties a settery, kterými se data předají postupně a pak se teprve zavolá ta metoda.
Hello world ! Segmentation fault (core dumped)
13.11.2014 13:45 Sten
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pro posílání mejlů bych použil factory
13.11.2014 22:24 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Pokud mám v PHP spoustu parametrů, tak si jejich pojmenování mohu nasimulovat slovníkem. Nejeví se mi to zvrhlejší než properties a settery. Sice to nevypadá příliš objektově, ale je to přehledné a funkční. Malá ukázka:
$config = array(
    'dsn' => "mysql:host=localhost;dbname=test",
    'user' => "username",
    'pass' => "1234",
);
$db = new MyPDO($config);
BTW: V reálu to mám trochu odlišně, tohle je zjednodušené kvůli snazšímu pochopení.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
14.11.2014 12:53 Sten
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
V reálu to mám trochu odlišně, tohle je zjednodušené kvůli snazšímu pochopení.
Heslo je jiné? :-D
14.11.2014 13:43 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zapouzdření php kódu
Myslel jsem si, že do toho někdo bude rejpat. Jiné je jméno databáze, uživatele a samozřejmě i jeho heslo. Vlastně tam v reálu nemám ani to klíčové slovo array - místo něho tam je parse_ini_file(), aby se přístupové údaje k databázi nedostaly do repozitáře.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.