Zadania do wykładu o obiektach perla
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaPerl: programowanie - proste obiekty
- Aby przyjrzeć się nieco mechanizmom wywoływania funkcji perlowych, stwórz prostą funkcję:
sub bla::noname { print "Moje parametry: (@_)\n"; }
a następnie wywołaj tę funkcję w następujący sposób:bla::noname(); bla::noname; noname bla; noname bla(); noname bla 1,2,3; noname bla 1,(2,3); bla->noname; bla->noname(); bla->noname(1,2,3); package bla; noname();
Zaobserwuj, które z tych wywołań ma charakter obiektowy i w jaki sposób przekazywane są przez perla parametry. - Sprawdź, jak zachowałaby się funkcja noname z poprzedniego przykładu, gdyby została zdefiniowana w osobnym pliku o nazwie noname.pm, umieszczonym w katalogu bla i po załadowaniu przez np. require. Czy widać jakieś różnice?
- Napisz prosty moduł który będzie pozwalał tworzyć obiekty o dowolnej zawartości. Aby ułatwić to zadanie, nazwij go myClass a w środku zdefiniuj procedury new, set, get oraz is. Przykładowe wykorzystanie tego modułu powinno wyglądać tak:
use lib '.'; use strict; use warnings; use myClass; my $class = myClass::->new(); # tworzenie obiektu przez wywolanie metody klasy if( ! $class->is('imie') ){ $class->set('imie','Pioter'); } $class->set('nazwisko','Arlukowicz') if !$class->is('nazwisko'); print $class->get('imie'), ' ', $class->get('nazwisko'),"\n";
- Napisz prosty moduł obiektowy o nazwie myContainer, który będzie miał taki sam interfejs jak poprzedni (możesz nawet skopiować kod i zmodyfikować go trochę). Umożliw tworzenie obiektów z obiektów oraz wstepne inicjalizowanie pol obiektu, tak zeby dzialal ponizszy kod:
use lib '.'; use strict; use warnings; use myContainer; my $cont = myContainer::->new( imie => 'Piotr', nazwisko => 'Arlukowicz', iq => 134, ); my $stud = $cont->new( imie => 'Student', nazwisko => 'Noname', iq => 'n/a', );
Taka klasa i jej instancje mogą ci posłużyć do obsługi haszy na przykład - gdy opracujesz bebechy klasy w oparciu o hasz. Wtedy masz obiektowy interfejs do hasza, czyli możesz w kodzie oprogramować np. zliczanie odwołań do niego, blokować lub domyślnie ustawiać pewne wartości, jeżeli podano odpowiednie klucze, itp. Są to jednak dość rzadkie przypadki i dość wydumane. Natomiast praktyczną rzeczą, do której może się przydać taki obiekt jest przechowalnia unikalnych danych zrealizowana w elegancki obiektowy sposób. Możesz użyć takiego obiektu do memoizacji - techniki pozwalającej zapamiętać wartości raz wywołanych funkcji, aby nie wywoływać ich ponownie z tymi samymi argumentami. - Napisz prosty moduł implementujący obsługę liczb zespolonych (myComplex). Liczbę zespoloną trzymaj w obiekcie w dowolny sposób (możesz np. zbudować obiekt w oparciu o tablicę dwuelementową, chociaż sensowne jest oczywiście zastosowanie tradycyjnej referencji do anonimowego hasza). Interfejs modułu powinien dać używać się w sposób następujący:
use lib '.'; use strict; use warnings; use myComplex; my $liczba = myComplex->new(1,1); # liczba 1+1i my $real = myComplex->new(2,0); # liczba rzeczywista: 2+0i my $i = myComplex->new(0,1); # samo i = sqrt(-1) = 0+1i $liczba->add($real); $liczba->mul($i); $real->sub($liczba); print $liczba->as_string,"\n";
... słowem, zdefiniuj w module metody wykonujące konstrukcję liczby (konstruktor new, dodanie liczby do liczby (add), odjęcie liczby od liczby, mnożenie, itp. Wszystko co ci przyjdzie jeszcze do głowy także warto umieścić w module - jeżeli chcesz, żeby obsługiwał on w sensowny sposób liczby zespolone. W późniejszej części kursu dowiesz się, w jaki sposób przeciążyć operatory +, - i inne, aby możliwe było wprost napisanie $liczba + $liczba lub $real * $i. - Napisz moduł obiektowy implementujący żółwia znanego z języka programowania Logo (nazwij go np. Turtle). Zaprogramuj podstawowe operacje dla takiego żółwia - metody go, up, down, left, right, itp. Korzystając z takiego żółwia możesz symulować proste programy napisane w LOGO. Stwórz także moduł dodatkowy, np. o nazwie Logo, który za pomocą opracowanego przez Ciebie modułu grafiki żółwiowej będzie wykonywał proste polecenia języka LOGO, na przykład taki program:
down go 100 right 90 go 100 right 90 go 100 right 90 go 100 up
Oczywiście jeżeli chcesz, możesz w perlu zaprogramować także inne cechy języka LOGO, np. łatwe tworzenie procedur lub obsługę list. Ale to już zaczyna przypominać pisanie własnego interpretera :)
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.