čtvrtek 12. dubna 2007

PDT a OOP

Každý, kdo chce efektivně pracovat s objekty, musí použít nástroj, který mu umožní automaticky doplňovat potřebné informace. Jinými slovy, použije nějaké IDE, které usnadní práci při psaní kódu.

Když si představím, že vytvořím objekt, který obsahuje několik metod, rád bych tyto metody rovnou volal. U jazyků, které dodržují striktně typovou kontrolu, je to jednoduché. Každý parametr metody musí mít typové označení, stejně tak návratová hodnota. U PHP je situace o dost horší. Jediné, co mi samotné PHP umožňuje je, že u parametru metody mohu definovat o jaký typ objektu se jedná. Navíc jsem omezen pouze na objekty a pole.
Jenže metody mi často vrací další objekty a tyto objekty někde dál používám. Samotný plugin od ZENDu (PHP Development Tool = PDT) na to jde od lesa. Dovolí mi používat komentáře, ve kterých si jasně definuji, o jaký typ se vlastně jedná. Lepší než další povídání bude ukázka.

class TridaA {
public function foo() {}
}
class TridaB {
private $tridaA;
public function __construct() {
$this->tridaA = new TridaA();
}
public function zavolejFoo() {
$this->tridaA->foo();
}
}


Z ukázky je jasné, že atribut třídy B je vlastně objekt z třídy A. Eclipse mi sice umožní automaticky zavolat metodu foo();, ale pouze v konstruktoru, protože dál už nevidí. V metodě zavolejFoo(); mám prostě smůlu. Mám ale možnost samotný atribut třídy okomentovat, čímž vyjádřím, že se jedná o objekt třídy A a pak již vše funguje, jak má.


/**
* @var TridaA
*/
private $tridaA;


Další věcí budiž parametry metody. Na začátku jsem psal, že PHP sice dovoluje definovat typ pro parametr metody, ale ne vždy tak činíme. Pokud typovou kontrolu na parametr metody definovat nechci, ale chci, aby Eclipse poznalo, že se jedná o tu či onu instanci objektu, jednoduše metodu okomentuji.


/**
* @param TridaA $tridaA
*/
public function setTridaA($tridaA) {
$tridaA->foo();
}


U definování samotného parametru metody je třeba mít na paměti, že musím také definovat, o jaký parametr se vlastně jedná.

Poslední věcí je návratová hodnota metod. K tomuto mohu opět použít komentář a říci tak Eclipse, o jaký návratový typ se vlastně jedná.


/**
* @return TridaA
*/
public function getTridaA() {
return new TridaA();
}


Pokud tedy pracujete s objekty a používáte k tomu jazyk, který má dynamické typování, jistě Vás často naštve, že nevíte, co vlastně v danou chvíli proměnná obsahuje. Toto Vám sice nezaručí, že nebudete chybovat při zjišťování typů, ale zaručí, že samotné programovací prostředí Vám řekne, co teď vlastně používáte.

Jestli jste neměli v oblibě komentáře, tak nyní si je určitě zamilujete :)

O psaní komentářů by se dala napsat celá kniha, ale o tom zase jindy.

11 komentářů:

  1. Proc zapisek vychvaluje, ze za vse muze PDT, ktery ale pouze jen extrahuje komentare vytvarene pomoci syntaxe z phpdocumentoru?
    PhpDocumentor ma mnohem vice atributu, nez jen @param, @return a dalsi uvedene.
    Vyhodou je, ze pote dokaze vytvaret dokumentaci ke kodu, at uz v html, pdf, ci dokonce man pages.

    Doporucuji nahlednout do dokumentace a examplu ;-)

    OdpovědětVymazat
  2. Moc jsem tvůj komentář nepochopil. Tady nejde o to, jaké atributy má PHPDocumentor, ale o to, že samotné PDT mi dokáže automaticky nabízet metody z volané instance, protože je vidí. A k tomu, aby je viděl jsou zapotřebí, právě zmiňované komentáře.
    Záměrem článku nebylo popisovat komentáře, jejich expoportování, či metodika psaní, ale ukázka, jak dokáže IDE spolupracovat s komentáři, které mi dokáží napřímo usnadnit vývoj.
    K samotným komentářům by se toho dalo napsat spousty. Spousty pouček, které pak stejně nikdo nedodržuje :)
    Navíc, vždycky bych se měl držet pravidla, že OO kód je samodokumentovatelný. To znamená, že dodržuji stadardy pro psaní OO kodu a dokáži ho pak zpětně také číst. U složitějších algoritmů samozřejmě použiji komentáře. U složitějších návrhů zase UML.

    OdpovědětVymazat
  3. Myslel jsem to tak, ze PDT *pouze* procita komentare, ktere maji syntax phpDocumentoru a z toho doplnuje kod jako u jinych fci. Coz je naprosto normalni vec a nepochybne velmi uzitecna. Dal jsem chtel poukazat na to, ze phpDocumentor ma podstatne vice @komentarovych bloku a ze se z toho da i pak generovat hezky vystup.

    OdpovědětVymazat
  4. he dobry plugin na pro me spatny editor.

    OdpovědětVymazat
  5. to Error414: Eclipse je platforma a tak k ni clovek musi pristupovat. Libi se mi, ze mohu miti veci hezky pohromade (PHP Development, SQL Development, SVN, atd.) Prosel jsem si "editory" jako SciTE, jEdit, atd., ale nic z toho nenabizi takovy komfort. Pro vyvojare, kteri v PHP spise skriptuji (pisi male projekty proceduralnim zpusobem), je Eclipse jako kanon na vrabce. V ostatnich oblastech je samotne IDE nevyhnutelnou soucasti vyvoje. Budme radi, ze stale mame moznosti vyberu. Existuje nekolik kvalitnich produktu. Problem je, ze jsou dost casto za penize. Az bude ZEND Studio obsahovat neco, co mi bude chybet a PDT to nebude umet, zainvestuji do noveho IDE. V opacnem pripade, je to zbytecne.

    to LesTR: Pravda. Samotny PHPDocumentor obsahuje hodne dostupnych atributu. Na druhou stranu, moc jsem vygenerovanou dokumentaci nikdy nevyuzil. Duvodem je mozna to, ze samotne IDE mi dokumentovane bloky sam "ukazuje". Pokud ale nekdo vytvori vlastni "API", ktere chce dal publikovat, je takovato dokumentace naprostou nezbytnosti.

    OdpovědětVymazat
  6. na ja teda v PHP necriptuju, a stejne me Eclipse nesedl. Nejhorsi jsou na nem ty chyby, porad jsem zapasil se stablitou.

    Na tohle vetsina lidi rika, ze jim to jede a ze lama sem ja. Mozna je to pravda ale to nemeni nic na veci ze ME to nejde.

    OdpovědětVymazat
  7. to Error414: otazkou je, co ti nejde :)
    Ja mel napr. na SuSE 10.1 problem s PDT Eclipse, ktere bylo pripravene primo od ZENDu. Tahle jejich kombinace mi padala. Nahral jsem si samotnou platformu a k ni pak doinstaloval samotne pluginy. Od te doby vse fungovalo, jak melo :)
    Druhou veci muze byt pouzita verze PDT. Nyni je aktualni 0.7RC3, z cehoz jasne vyplyva, ze je to stale jen beta. Obcas se jim totiz povede, ze novejsi RC je na mnohem horsi urovni, nez ta predchozi.
    Ja PDT pouzivam na dost velky projekt a muzu smele rici, ze se stabilitou problemy nemam. I kdyz hodne zalezi na konfiguraci prostredi. Napr. prikrmit Eclipse pameti, atd.

    OdpovědětVymazat
  8. to a.dostal:
    Eclipse je rozhodne zajimavy editor, ale abych rekl pravdu, tak pro me je absolutne nepouzitelny. Jeho nenazranost pameti je az do nebe volajici. Na stejnem stroji je mozne pouzivat Zend Studio 4x rychleji.
    Nicmene rozhodl jsem se vyzkouset posledni verzi. Celou dobu predtim jsem pouzival phpEclipse, tak si rikam, ze zkusim PDT, treba na to bude lepe.
    Vysledek? Asi takovyto: Nainstaloval jsem si Eclipse z repository pro muj Debian, pote zkusim PDT prez aktualizacni system eclipsu, coz ale rve, ze s touto verzi neni kompatibilni : ) Mno zkusim holt jeste nejakou dobu pockat.
    BTW jedina vec, co me tesila oproti Zend Studiu, byla moznost skryvani jednotilivych bloku (Debug okno, soubory, ... ) pomoci klavesovych skratek.
    Porad me spousta veci ale drzi u ZS jako napr. integrovany phpDocumentor ;-) Funkcni debugovani, cehoz se mi s phpEclipsem nepodarilo dosahnout : ( Treba byla ale chyba mezi moji klavesnici a zidly

    OdpovědětVymazat
  9. to LesTR: Tohle je staly argument, ze samotne IDE je tolik nenazrane. Ja osobne pouzivam IDE jako hlavni aplikaci, kterou mam na PC spustenou. Nebudu resit, ze mi zere tolik ci tolik pameti, jelikoz vim, ze mi zpetne za svou nenazranost nabidne dobry nastroj. Samozrejmosti je, ze budu vyvijet na PC, ktere ma min. 1GB RAM. Pokud bych mel stroj z roku raz dva, tak budu kricet, ze na vyvoj je treba mnohem vice.
    Co se tyce te verze, zalezi jakou verzi ti repozitar nabizi. Pokud je to starsi verze, nez 3.2, tak je jasne, ze bude kricet, ze je verze nekompatibilni. Prijde mi to jako samozrejmost. Pokud jsi linuxak, sam moc dobre vis, jak je to se zavislostmi a a verzovanim samotnych baliku.
    Nikdo prece nebude vytvaret plugin na stare verze.

    OdpovědětVymazat
  10. To a.dostal:
    Add nenazranost:
    muj stroj ma 1GB pameti a jak jsem napsal drive, tak ZS zde beha asi tak 5x rychleji. Samotny eclipse sezere ihned po startu (bez otevernych souboru) cca 120MB a zabava je koukat jak to roste pri debugovani : )
    Add verze:
    v repository mam verzi 3.2.1 tudiz trochu nechapu co se zendu nelibi, ale budiz.
    BTW pokud bych nemel up verzi, tak toto ani nevypustim ;-)

    OdpovědětVymazat
  11. Je me uplne jedno kolik IDE zerepameti. Pokud nemam tak dokoupim pamet. Pro me je smerodatna sila IDE.

    Eclipse me padal tak ze vyhodil nejakou vyjimku a spadl. Navic pri debugovani pomoci xdebugu padal.

    Jedit spluginama je dost silny na psani PHP a ve velkem projektu. Pise se me vnem lepe nez eclipsu.

    Kazdemu jeho podebrady. Ja na blogu psal jak si z linuxu udelat to nejvetsi IDE na sapni PHP. To asi nikdo netrumfne.

    OdpovědětVymazat

Když programátor založí a řídí firmu

Jako malý jsem chtěl být popelářem. Ani ne tak proto, že bych měl nějaký zvláštní vztah k odpadkům, ale hrozně se mi líbilo, jak...