Moose: Porovnání verzí

Z Wikiverzity
Smazaný obsah Přidaný obsah
Kychot (diskuse | příspěvky)
→‎01: terminologie
Kychot (diskuse | příspěvky)
02. atributy
Řádek 38: Řádek 38:
BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9.
BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9.


=== 01 ===
=== 01 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á:
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á:
Řádek 47: Řádek 47:
** když voláme metodu u konkrétní instance, je tím invokantem ''tato instance''.
** když voláme metodu u konkrétní instance, je tím invokantem ''tato instance''.
* ''Invokant'' se v Perlu předává funkci jakožto ''první argument''.
* ''Invokant'' se v Perlu předává funkci jakožto ''první argument''.

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.


<source lang='perl' line>
<source lang='perl' line>
Řádek 66: Řádek 68:
}
}


my $Líza = Kocka->new();
my $líza = Kocka->new();
my $Mňouk = Kocka->new();
my $mňouk = Kocka->new();


$Líza->mňau();
$líza->mňau();
$Mňouk->mňau();
$mňouk->mňau();
</source>
</source>


Řádek 81: Řádek 83:
*11. Podprogram, přesněji řečeno ''metoda'' mňau, kde říkám, jak má libovolná kočka mňoukat.
*11. Podprogram, přesněji řečeno ''metoda'' mňau, kde říkám, jak má libovolná kočka mňoukat.
*13. Uložíme invokant (tedy první parametr funkce) do proměnné $self.
*13. Uložíme invokant (tedy první parametr funkce) do proměnné $self.
*14. Tady konečně říkám, jak má kočka mňoukat.
*18.–19. Postupně vytvářím dvě instance koček, tedy dva konkrétní případy, kočky Lízu a Mňouka.
*18.–19. Postupně vytvářím dvě instance koček, tedy dva konkrétní případy, kočky Lízu a Mňouka.
*21.-22. Vyzkouším si, jak mňoukají.
*21.-22. Vyzkouším si, jak mňoukají.

Výstup skriptu bude jednoduchý:
<pre>
Mňau!
Mňau!
</pre>


Někdo namítne, že je to nedokonalé, že Mňouk je kocour a ten že mňouká jinak. Námitka je na místě, časem zjistíme, že je možno vytvářet i různá pohlaví, která budou mňoukat jinak.
Někdo namítne, že je to nedokonalé, že Mňouk je kocour a ten že mňouká jinak. Námitka je na místě, časem zjistíme, že je možno vytvářet i různá pohlaví, která budou mňoukat jinak.


=== 02. Atributy ===


Když už vytváříme takovéto kočky, bylo by dobré, aby samy kočky věděly, jak se jmenují a mohly se nám na požádání třeba představit. Tedy všechny kočky (tj. třída koček) by měla mít nějaký šuplíček, kam by se ukládalo jméno té které kočky. A pak třeba její věk (kolik je jí let) a jestli třeba nemá nějakou dietu (třeba vytváříme databázi pacientů v kočičí nemocnici).
<source lang='perl'>
</source>


Tyto tzv. ''atributy'' se v ''Mose'' přikládají funkcí <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.
<source lang='perl'>
</source>


<source lang='perl'>
<source lang='perl' line>
#! /usr/bin/perl
</source>


Modern::Perl;
<source lang='perl'>
use utf8;
</source>
binmode STDOUT, ':utf8';


package Kocka
<source lang='perl'>
{
</source>
use Moose;


has 'jméno', is=>'ro', isa=>'Str';
<source lang='perl'>
has 'věk', is=>'rw', isa=>'';
has 'dieta', is=>'rw';
}

my $tlusťoch = Kocka->new(jméno=>'Tlusťoch', věk=8, dieta=>'produkty moře');

say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let, dieta: ', tlusťoch->dieta();

tlusťoch->dieta( 'neslaná');
say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let, nová dieta: ', tlusťoch->dieta();
</source>
</source>


Řádek 110: Řádek 130:
<source lang='perl'>
<source lang='perl'>
</source>
</source>



[[Kategorie:Perl]]
[[Kategorie:Perl]]

Verze z 24. 10. 2012, 10:16

Moose je objektový systém, vytvořený jako knihovna v Perlu. V podstatě vytváří určitý způsob myšlení (školu), jak zacházet s objekty v Perlu (s objekty se zde jinak dá zacházet celkem volně).

Instalace

Ubuntu

Při výběru balíku libmoose-perl budou nainstalovány i následující balíky:

  • libb-hooks-endofscope-perl (verze 0.08-1) bude nainstalován
  • libclass-load-xs-perl (verze 0.03-1) bude nainstalován
  • libdevel-globaldestruction-perl (verze 0.04-2) bude nainstalován
  • libdevel-partialdump-perl (verze 0.15-1) bude nainstalován
  • libeval-closure-perl (verze 0.06-1) bude nainstalován
  • libmoose-perl (verze 2.0401-1) bude nainstalován
  • libnamespace-clean-perl (verze 0.22-1) bude nainstalován
  • libsub-exporter-perl (verze 0.982-1) bude nainstalován
  • libsub-identify-perl (verze 0.04-1build2) bude nainstalován
  • libtask-weaken-perl (verze 1.03-1) bude nainstalován
  • libvariable-magic-perl (verze 0.47-1build1) bude nainstalován


Tutoriál

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

use utf8;
binmode STDOUT, ':utf8';

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

package Kočka

vyvolá chybu:

Kočka is not a module name at /usr/lib/perl5/Class/MOP/Package.pm line 207.
BEGIN failed--compilation aborted at ./07.01Kocka.pl line 9.

01 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á:

  • Třída je v Perlu v podstatě to samé, co balík. Má to logiku, zpravidla definice tříd jsou i v jiném (např. knihovním) souboru *.pm, ale klidně mohou být i v tom samém souboru. Hlavně to ale znamená, že všechny proměnné tam jsou plně kvalifikované, tj. mají vlastní jmenný prostor, daný názvem třídy.
  • Konkrétní instance se vytvářejí pomocí konstruktoru new
  • metoda je funkce, asociovaná s třídou. Když se volá, má vždy nějaký invokant, se kterým metoda pracuje:
    • když vytváříme nový objekt, je tím invokantem jméno třídy
    • když voláme metodu u konkrétní instance, je tím invokantem tato instance.
  • Invokant se v Perlu předává funkci jakožto první argument.

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.

#! /usr/bin/perl

Modern::Perl;
use utf8;
binmode STDOUT, ':utf8';

package Kocka
{
    use Moose;

    sub mňau
    {
        my $self = shift;
        say 'Mňau!';
    }
}

my $líza = Kocka->new();
my $mňouk = Kocka->new();

$líza->mňau();
$mňouk->mňau();
  • 1. Říkáme shellu, který program má interpretovat tento skript.
  • 2. Programujeme ve stylu Modern::Perl.
  • 4. Co je ve skriptu, bude bráno jako znaky UTF-8
  • 5. Co půjde na standardní výstup, bude chápáno také jako text v UTF-8
  • 7. Vytvářím třídu Kocka.
  • 9. Používám k tomu knihovnu Moose. (Tím je dané např. i implicitní vytvoření konstruktoru new.)
  • 11. Podprogram, přesněji řečeno metoda mňau, kde říkám, jak má libovolná kočka mňoukat.
  • 13. Uložíme invokant (tedy první parametr funkce) do proměnné $self.
  • 14. Tady konečně říkám, jak má kočka mňoukat.
  • 18.–19. Postupně vytvářím dvě instance koček, tedy dva konkrétní případy, kočky Lízu a Mňouka.
  • 21.-22. Vyzkouším si, jak mňoukají.

Výstup skriptu bude jednoduchý:

Mňau!
Mňau!

Někdo namítne, že je to nedokonalé, že Mňouk je kocour a ten že mňouká jinak. Námitka je na místě, časem zjistíme, že je možno vytvářet i různá pohlaví, která budou mňoukat jinak.

02. Atributy

Když už vytváříme takovéto kočky, bylo by dobré, aby samy kočky věděly, jak se jmenují a mohly se nám na požádání třeba představit. Tedy všechny kočky (tj. třída koček) by měla mít nějaký šuplíček, kam by se ukládalo jméno té které kočky. A pak třeba její věk (kolik je jí let) a jestli třeba nemá nějakou dietu (třeba vytváříme databázi pacientů v kočičí nemocnici).

Tyto tzv. atributy se v Mose přikládají funkcí has(); 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.

#! /usr/bin/perl

Modern::Perl;
use utf8;
binmode STDOUT, ':utf8';

package Kocka
{
    use Moose;

    has 'jméno', is=>'ro', isa=>'Str';
    has 'věk',   is=>'rw', isa=>'';
    has 'dieta', is=>'rw';
}

my $tlusťoch = Kocka->new(jméno=>'Tlusťoch', věk=8, dieta=>'produkty moře');

say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let, dieta: ', tlusťoch->dieta();

tlusťoch->dieta( 'neslaná');
say tlusťoch->jméno(), ', ', tlusťoch->věk(), 'let,  nová dieta: ', tlusťoch->dieta();