Moose: Porovnání verzí

Přidáno 144 bajtů ,  před 1 rokem
m
Robot: Náhrada zastaralého tagu
(Vrácení omylem vymazaného textu: http://cs.wikiversity.org/w/index.php?title=Moose&curid=7767&diff=30095&oldid=30094)
m (Robot: Náhrada zastaralého tagu)
 
 
Sytému Moose je věnována kapitola ''Objects'' v knize [[Modern Perl#07. Objekty]]. Touto kapitolou je inspirován tento tutoriál. Poznamenejme, že direktivami
<sourcesyntaxhighlight lang='perl'>
use utf8;
binmode STDOUT, ':utf8';
</syntaxhighlight>
</source>
můžeme (pro legraci) používat i české názvy proměnných i s diakritikou (pro vážné programování bych to ale asi nedoporučoval).
 
Z nějakých důvodů to ale s diakritikou nefunguje v případě, že tak nazveme třídu; příkaz
 
<sourcesyntaxhighlight lang='perl'>
package Kočka
</syntaxhighlight>
</source>
vyvolá chybu:
Kočka is not a module name at /usr/lib/perl5/Class/MOP/Package.pm line 207.
I když se nejedná o nějaký předpis jazyka Perl, jde o určitou konvenci, že jména tříd začínají velkými písmeny (třída je jakoby větší, protože může mít mnoho instatncí), zatímco jména instancí začínají malými písmeny, tedy je: ''Kocka líza''. (Je to přesně naopak než v češtině, angličtině i jiných jazycích, kde píšeme ''kočka Líza.) Pokud se nám to nelíbí, nemusíme samozřejmě tuto konvenci dodržovat.
 
<sourcesyntaxhighlight lang='perl' line>
#! /usr/bin/perl
 
$líza->mňau();
$mňouk->mňau();
</syntaxhighlight>
</source>
 
*1. Říkáme shellu, který program má interpretovat tento skript.
Tyto tzv. ''atributy'' (někdy se jim říká ''stav'' anebo prostě data dané instance) se v ''Mose'' přikládají pomocí funkce <tt>has()</tt>; zde je možné rovněž určit, jestli je možné tento atribut dále měnit a jaký typ proměnné bude použit, což představuje určitý typ kontroly nad tím, jak budeme moci s objektem nakládat.
 
<sourcesyntaxhighlight lang='perl' line>
#! /usr/bin/perl
 
$tlusťoch->dieta( 'neslaná');
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, nová dieta: ', $tlusťoch->dieta();
</syntaxhighlight>
</source>
 
* 11. atribut ''jméno'' je read-only a je to string
Příklad: Namísto toho, abychom zadávali věk kočky, zadáme datum jejího narození a její věk se pak automaticky spočítá. Pozměníme třídu Kocka:
 
<sourcesyntaxhighlight lang='perl'>
{
package Kocka;
}
}
</syntaxhighlight>
</source>
 
Pomineme, že věk zde počítáme jen přibližně (zanedbáváme datum narození), ale co je důležité:
# změnil se popis třídy: namísto atributu ''věk'' je zde uložen atribut ''rok narození'' a je definována metoda na výpočet věku
# způsob volání se přitom ale nezměnil – věk dané kočky zjistíme stejně jako předtím:
<sourcesyntaxhighlight lang='perl'>
say $tlusťoch->věk();
</syntaxhighlight>
</source>
Tak to je ta enkapsulace: Zatímco se nějaký vnitřní mechanismus třídy změnil, zvenku se to chová stále stejně; při volání metody nás jakoby nemusí zajímat, jak je to uvnitř té třídy zařízeno, že to tak funguje, hlavně, že to funguje.
 
Další výhoda takového přístupu je, že si můžeme definovat nějaké defaultní hodnoty, které konstruktor objektu použije v případě, že nějaké atributy nejsou zadány explicitně; například předpokládáme, že zakládáme rodný list kočky a tím pádem můžeme předpokládat, že pokud nezadáme její rok narození, bude se jednat o nynější rok; pak defaultní hodnotu tohoto atributu definujeme např. následovně:
<sourcesyntaxhighlight lang='perl'>
has 'rok_narození', is=>'ro', isa=>'Int',
default => sub{(localtime)[5] + 1900};
</syntaxhighlight>
</source>
 
<sourcesyntaxhighlight lang='perl'>
</syntaxhighlight>
</source>
 
[[Kategorie:Perl]]
1 127

editací