Moose: Porovnání verzí

Přidáno 1 831 bajtů ,  před 9 lety
Enkapsulace
m (doplnění vysvětlivek)
(Enkapsulace)
Nejspíš se jedná o bug – viz [http://perldoc.perl.org/utf8.html Pragmas > utf8] až na konci: Bugs.
 
=== 01. StvořeníKonstruktory – stvoření koček ===
 
Tak tedy, vytvoříme si ''třídu'' koček, které umí mňoukat, a dvě její ''instance'', Lízu a Mňauka, které pak z mňoukání vyzkoušíme. Ale ještě k terminologii, která je v objektovém programování celkem obvyklá:
 
$tlusťoch->dieta( 'neslaná');
say $tlusťoch->jméno(), ', ', $tlusťoch->věk(), ' let, nová dieta: ', $tlusťoch->dieta();
</source>
 
<pre>
Tlusťoch, 8 let, dieta: produkty moře
Tlusťoch, 8 let, nová dieta: neslaná
</pre>
 
=== 03. Enkapsulace ===
 
Enkapsulace neboli ''zapouzdření'' znamená, že se skryjí vnitřní detaily objektu.
 
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:
 
<source lang='perl'>
{
package Kocka;
use Moose;
 
has 'jméno', is=>'ro', isa=>'Str';
has 'dieta', is=>'rw';
has 'rok_narození', is=>'ro', isa=>'Int';
 
sub věk {
my $self = shift;
my $rok = (localtime)[5] + 1900;
return $rok - $self->rok_narození;
}
}
</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:
<source lang='perl'>
say $tlusťoch->věk();
</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ě:
<source lang='perl'>
has 'rok_narození', is=>'ro', isa=>'Int',
default => sub{(localtime)[5] + 1900};
</source>
 
11 978

editací