Zadania do wykładu o dziedziczeniu i polimorfizmie
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaPerl: programowanie - obiekty i dziedziczenie
Uwaga. Ponieważ zbliża się czas naszych ostatecznych rozliczeń, proponuję wykonanie dodatkowego zadania, które może niektórym poprawić sytuację. Szczegóły w treści zadań.
- Stwórz hierarchię klas wykonującą działania na liczbach naturalnych (może to być np. klasa o nazwie Natural, implementująca metody add, sub, mul oraz div, wykonujące odpowiednio dodawanie, odejmowanie, mnożenie i dzielenie, przy czym wyniki tych działań pozostać muszą liczbami naturalnymi. Rozszerz tę klasę przez dziedziczenie do klasy Integer, i umożliw pracę z liczbami ujemnymi. W końcu zbuduj klasę Real która implementuje takie same operacje na liczbach rzeczywistych. Wykorzystaj twoją hierarchię klas do napisania programu wykonującego działania na liczbach naturalnych, całkowitych i rzeczywistych. Przykładowy kod korzystający z tych klas mógłby np. wyglądać tak (uwaga - może zajść potrzeba dodefiniowania dodatkowych funkcji dla wspomnianych modułów):
#!/usr/bin/perl -lw use strict; use Real; use Natural; my $dzieln = Natural->new(2); # tworzy obiekt z liczba 2 my $liczba = Real->new(3.14); # tworzy obiekt z liczba pi $liczba->add(3.14); $liczba->div($dzieln); print $liczba;
- Jeżeli pamiętasz zadania o parsowaniu plików INI, CSV lub VCARD, to teraz jest czas, aby napisać te same programy inaczej. Stwórz hierarchię klas przydatną do parsowania plików tekstowych, przy czym możesz tutaj wykorzystać różne drogi, np. zrobić klasę zarządzającą plikiem, a następnie w klasie potomnej dodać jej funkcjonalność związaną ze szczególnym formatem danego pliku, lub np. zbudować abstrakcyjną klasę parsującą dowolny plik i umożliwić wykorzystanie w niej jedynie handlerów dostarczanych przez użytkownika w klasie potomnej (przykładowo - klasa taka parsując plik wołałaby funkcje typu file_start(), line_start(), line_end(), itp. a dokładna implementacja odpowiednich funkcji należałaby do użytkownika korzystającego ze stworzonej w taki sposób klasy). W przypadku tworzenia klasy z metodami abstrakcyjnymi, zadbaj o to, aby ich bezpośrednie wywołanie kończyło się błędem krytycznym.
- Korzystając z modułu Pod::Parser przygotuj własny parser dokumentacji POD do perla. Wprowadź w nim kilka modyfikacji, np. usuń wymaganie, aby poszczególne nagłówki PODa musiały być separowane pustym akapitem, dodaj też nowe polecenia, np. =include file.pod, itp. Twój parser może także generować dokumentację w oparciu o dołączane arkusze stylów wpisane wprost w kodzie, np. za pomocą słowa kluczowego =style file.css, itp. Możliwości rozszerzenia standardowego formatu PODa perlowego jest tyle, ile zechcesz napisać po prostu :) Oprócz tego, zapoznaj się z samym modułem Pod::Parser, a do pisania własnego parsera wykorzystaj oczywiście dziedziczenie (jak to jest zasugerowane w dokumentacji).
- Zbadaj działanie funkcji can, isa oraz VERSION dla wybranych załadowanych modułów. Czy można w tych modułach dodefiniować własną metodę? Jak sprawdzić czy dana metoda jest dostępna w instancji dowolnego obiektu?
- Napisz kod klasy Auto::Student, która wszystkie swoje metody implementuje poprzez funkcję AUTOLOAD. Zadbaj o odpowiednie rozróżnienie funkcji wywoływanych - np. konstruktor powinien tworzyć obiekt, destruktor go niszczyć itp. Zaimplementuj w tej funkcji wszystkie metody, które chcesz, aby posiadała klasa Auto::Student. Jeżeli w klasie tej umieścisz jakieś interakcje z innymi studentami, nietrudno napisać program, który symuluje zachowanie się grupy studentów na np. kwadratowym placu, itp. Wszystko zależy od implementacji odpowiednich metod :)
- Gdy będziesz miał juz klasę Auto::Student, sprawdź, czy autogenerowanie metod działa dla pojedynczej instancji, czy dla całej klasy. To znaczy, sprawdź, czy gdy masz dwa obiekty tej klasy, i w jednym z nich wywołasz metodę, to w drugim także taka metoda się pojawia. Jakie są niebezpieczeństwa związane z generowaniem metod przez techniki AUTOLOAD?
- (3p+1) Zadanie dodatkowe: napisz program korzystający z własnej hierarchii klas, implementujących rozwiązanie jakiegoś problemu. Mogą to być parsery, symulatory lub programy numeryczne. Problem określ w możliwie ścisły sposób, następnie napisz odpowiednie klasy (z dziedziczeniem!) i program, który z nich korzysta. Za wykonanie tego zadania można otrzymać 1 punkt za próbę, 2 punkty za implementację wykorzystującą dziedziczenie a 3 punkty za sprawne sporządzenie całego małego projektu, z dokumentacją i wszystkimi zalecanymi standardami kodowania. Czas na wykonanie tego zadania upływa dnia 20070515 o godzinie 23:59, czyli jak zwykle w nocy. Przykładowymi pomysłami są np.:
- zaimplementowanie gry w życie Conway'a z dwoma kolorami współpracujących lub zwalczających się osobników
- napisanie systemu przetwarzającego maile (np. ich sortowanie, ekstrakcję załączników, pakowanie do postaci eml, (de)kodowanie, przekodowywanie, itp.)
- napisanie systemu współpracującego z bazą danych i reprezentującego każdą tabelę w postaci obiektu
- napisanie systemu do katalogowania słów (każde słowo jest obiektem i można wyciągać z niego różne informacje, np. długość, liczby poszczególnych liter, oraz sprawdzać dopasowanie do innego słowa lub fragmentaryczną zgodność)
- system łączący obiekty zajęć z obiektami studentów oraz z obiektami ich zainteresowań, pozwalający na wygenerowanie dla każdego studenta trafności doboru jego planu zajęć (dobór planu jest tym trafniejszy, im bardziej pokrywa się on z zainteresowaniami studenta)
- i inne... :) grunt to pomysł.
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.