Dar vieno analitiko svetainė

Petras Kudaras

Perlo objektų pradžiamokslis: pirmoji dalis

Objekto vaizdavimas

Dažniausiai Perle Paskalio įrašas arba C struktūra, arba C+ klasė yra
saugoma anoniminio asociatyvaus masyvo (hešo) pavidalu. Taip
saugoti yra patogu, nes heše galima saugoti neribotą kiekį
elementų, kuriuos galima pasiekti per unikalų hešo raktą.

Jeigu tik norite kažko panašaus į C struktūrą, tai galima daryti
taip:

$irasas = {
    vardas   => "Petras",
    amzius   => 21,
    kolegos  => [ "Juozas", "Nikolajus", "Vaidas"],
};

Jeigu norite lengviau perskaitomo kodo, galite hešo raktus
rašyti didžiosiomis raidėmis:

$irasas = {
    VARDAS   => "Petras",
    AMZIUS   => 21,
    KOLEGOS  => [ "Juozas", "Nikolajus", "Vaidas"],
};

Norėdami prieiti prie vardo „Petras“ galite rašyti
$irasas->{VARDAS}, o norėdami gauti kolegų masyvą galite
rašyti @{ $irasas->{KOLEGOS} }.

Labai panaši idėja yra naudojama ir objektams, tik nereikėtų prieiti
prie objekto sudėtinių dalių prieiti tiesiogiai – tam dažniausiai
yra naudojamos specialiai tam parašytos funkcijos. Galima sakyti kad
objektas turėtų būti tiesiog daiktas, prie kurio duomenų reiktų prieiti
tik per specialias jo funkcijas.

Klasės sąsaja

Tarkim, kad turim klasę Asmuo. Štai kaip būtų galima ja
naudotis:

use Asmuo;

    $jo = Asmuo->naujas();
    $jo->vardas("Petras");
    $jo->amzius(21);
    $jo->kolegos( "Juozas", "Nikolajus", "Vaidas" );

    push @Visi_asmenys, $jo;  # išsaugom objektą vėlesniam naudojimui

    printf "%s turi %d metus.\n", $jo->vardas, $jo->amzius;
    print "Jo kolegos yra: ", join(", ", $jo->kolegos), "\n";

    printf "Paskutinis asmuo yra %s\n", $Visi_asmenys[-1]->vardas; 

Kaip matote, klasės Asmuo vartotojas nežino (ir neturi
žinoti) kaip yra saugomi duomenys klasėje Asmuo. Visus
duomenis vartotojas pasiekia tik per metodus (t.y. funkcijas, kurios
priklauso klasei)

Konstruktoriai ir objekto metodai

Tačiau kažkas turi žinoti, kaip duomenys saugomi klasėje, ir
tas kažkas yra pati klasė. Klasė aprašo metodus, kuriais
naudojanti galima prieiti prie prie objekto duomenų. Štai kaip galima
aprašyti klasę Asmuo naudojantis standartiniu duomenų
saugojimo hešo nuorodoje būdu. Aprašysime klasės metoda
naujas(), kuris bus objekto konstruktorius, bei tris
objekto metodus vardas(), amzius() ir
kolegos() per kuriuos bus galima prieiti prie objekte
saugomų duomenų.

package Asmuo;
    use strict;

    ####################################################
    ## objekto konstruktorius (supaprastinta versija) ##
    ####################################################
    sub naujas {
        my $mano  = {};
        $mano->{VARDAS}   = undef;
        $mano->{AMZIUS}    = undef;
        $mano->{KOLEGOS}  = [];
        bless($mano);           # bet zr. zemiau
        return $mano;
    }

    ##############################################
    ## metodai objektu duomenis pasiekti        ##
    ##                                          ##
    ## Metodai nustato reikšmę, jei perduodamas ##
    ## argumentas, ir tik grąžina reikšmę jei   ##
    ## argumentai neperduodami                  ##
    ##############################################

    sub vardas {
        my $mano = shift;
        if (@_) { $mano->{VARDAS} = shift }
        return $mano->{VARDAS};
    }

    sub amzius {
        my $mano = shift;
        if (@_) { $mano->{AMZIUS} = shift }
        return $mano->{AMZIUS};
    }

    sub kolegos {
        my $mano = shift;
        if (@_) { @{ $mano->{KOLEGOS} } = @_ }
        return @{ $mano->{KOLEGOS} };
    }

    1;  # Tam kad 'use' arba 'require' nesikeiktų

Sukūrėme tris metodus, per kuriuos galima prieiti prie objekto duomenų:
vardas(), amzius() ir kolegos().
Jie labai panašūs. Jei nustato reikšmę jeigu iškviečiami su argumentu,
ir grąžina reikšmę jeigu iškviečiami be argumentų.