Podstawy programowania obiektowego struktura kasy w Dephi definicja pó i metod konstruktory i destruktory Programowanie obiektowe s.-
Najważniejsze pojęcia z wykładu 0 Programowanie sterowane zdarzeniami technika programowania poegająca na wyróżnieniu tzw. zdarzeń zachodzących w środowisku programu i przyporządkowaniu tym zdarzeniom okreśonych sekwencji instrukcji. Programowanie obiektowe programowanie, zazwyczaj w obiektowym języku programowania, które poega na wyodrębnieniu obiektów, ich kas oraz metod. Każdy obiekt traktowany jest jako samodzieny, zamknięty fragment kodu, a funkcjonowanie programu opiera się na komunikacji pomiędzy obiektami. Obiekt abstrakcyjny byt reprezentujący ub opisujący pewną rzecz ub pojęcie obserwowane w modeowanym systemie. Składowe obiektu: atrybuty/własności (nazwane wartości przypisane do obiektu), metody (operacje przypisane do obiektu; operacje, które obiekt potrafi wykonać). Kasa wzorzec okreśający strukturę pewnej grupy obiektów o takiej samej budowie, czyi posiadających atrybuty o takich samych nazwach, metody o takim samym działaniu, itp.; formanie: byt semantyczny rozumiany jako miejsce przechowywania takich cech grupy podobnych obiektów, które są da nich wspóne. Komponent szczegóny przypadek obiektu zaprojektowany jako gotowy do użycia eement apikacji, który można dostosować do własnych potrzeb w czasie projektowania programu. Programowanie obiektowe s.-
type <nazwa_kasy> = cass(<nazwa_nadkasy>) private poa i metody prywatne pubic poa i metody pubiczne Składnia definicji kasy w Dephi <nazwa_kasy> jest unikanym identyfikatorem języka Pasca (może składać się z iter afabetu angieskiego, cyfr i znaku podkreśenia); <nazwa_nadkasy> to eement opcjonany, nazwa kasy bazowej, z której dziedziczy definiowana kasa (dziedziczenie zostanie omówione na wykładzie 4). Programowanie obiektowe s.-3
Kasy w Dephi Definicja kasy jest równoważna definicji nowego typu danych; Definicja kasy musi wystąpić przed utworzeniem obiektu danej kasy; Składniki zdefiniowane w sekcji private (składniki prywatne), są dostępne tyko wewnątrz kasy, w której zostały zdefiniowane i nie można odwołać się do nich z poziomu innych kas; Składniki zdefiniowane w sekcji pubic (składniki pubiczne) są dostępne zarówno wewnątrz kasy, w której zostały zdefiniowane jak i z każdego innego miejsca kodu, który ma dostęp do danej kasy; Składniki zdefiniowane bez okreśenia specyfikatora dostępu są domyśnie traktowane jako pubiczne; Każdy składnik zdefiniowany wewnątrz kasy musi mieć nazwę unikaną w obrębie danej kasy, różne kasy mogą zawierać składniki o takich samych nazwach. Programowanie obiektowe s.-4
Poa kasy Składnia definicji poa: <nazwa_poa>: typ; <nazwa_poa>, <nazwa_poa>: typ; <nazwa_poa> jest unikanym w obrębie kasy identyfikatorem języka Pasca; typ może być dowonym typem standardowym ub zdefiniowanym przez użytkownika (również inną kasą); każdy obiekt danej kasy posiada własną kopię pó i może im nadać indywiduane wartości, inaczej: poa są związane z konkretnym obiektem danej kasy; w każdym punkcie definicji kasy jest możiwy bezpośredni dostęp do wszystkich pó zdefiniowanych w tej kasie (pubicznych i prywatnych); spoza definicji kasy możiwy jest dostęp tyko do pó pubicznych; przyjmując pewne uproszczenie własności komponentów mogą być traktowane jako pubiczne poa kas tych komponentów. Programowanie obiektowe s.-5
Metody Metoda procedurana wyodrębniona część kodu kasy, stanowiąca pewną całość o jednoznacznej nazwie i ustaonym sposobie wymiany informacji z pozostałymi częściami programu. Metoda procedurana wykonuje pewną sekwencję operacji, której wynikiem może być wyznaczenie jednej ub wieu wartości (może nie wyznaczać żadnej). Metoda funkcyjna wyodrębniona część kodu kasy, stanowiąca pewną całość o jednoznacznej nazwie i ustaonym sposobie wymiany informacji z pozostałymi częściami programu. Metoda funkcyjna zawsze wyznacza dokładnie jedną wartość, która jest zwracana jako wynik jej działania. Zastosowanie metod metody pubiczne reaizują zadania wynikające z funkcjonaności obiektu, metody prywatne umożiwiają podział dużych agorytmów na mniejsze części, zwiększają czyteność kodu przez oddzieenie i nazwanie operacji koniecznych do zreaizowania dużego agorytmu, pozwaają na zdefiniowanie pomocniczych podprogramów, które mogą być używane wieokrotnie w różnych metodach danej kasy; w Dephi procedury zdarzeń komponentów są definiowane jako metody formuarza, do którego naeży dany komponent. Programowanie obiektowe s.-6
Dekaracja metody (prototyp) Stworzenie nowej metody wymaga dekaracji w kodzie kasy (odpowiednio w części private ub pubic) oraz właściwej definicji umieszczonej poza kasą. Składnia dekaracji metody proceduranej: procedure <nazwa_metody>(argumenty_formane); Składnia dekaracji metody funkcyjnej: function <nazwa_metody>(argumenty_formane): typ_wyniku; <nazwa_metody> jest unikanym w obrębie kasy identyfikatorem języka Pasca; typ_wyniku to typ wartości zwracanej przez metodę funkcyjną, może być typem standardowym ub zdefiniowanym przez użytkownika; argumenty_formane są eementem opcjonanym, parametryzują metodę i okreśają sposób jej komunikacji z innymi eementami programu (dane przesyłane do metody i/ub rezutaty wyprowadzane na zewnątrz). Więcej informacji o argumentach metod znajduje się w Dodatku. Programowanie obiektowe s.-7
Definicja metody proceduranej procedure <nazwa_kasy>.<nazwa_metody>(arg_formane); definicje i dekaracje okane kod metody definicja metody znajduje się poza kasą; <nazwa_kasy> jest nazwą kasy, do której naeży metoda; nagłówek metody (nazwa, argumenty formane) musi odpowiadać jej dekaracji; definicje i dekaracje okane to dekaracje zmiennych i definicje typów które są dostępne tyko wewnątrz danej metody; kod metody to ciąg instrukcji języka Pasca, który impementuje agorytm reaizowany przez daną metodę. Programowanie obiektowe s.-8
Definicja metody funkcyjnej function <nazwa_kasy>.<nazwa_metody>(arg_form): typ_wyniku; definicje i dekaracje okane kod metody Resut := wyrażenie; definicja metody znajduje się poza kasą; <nazwa_kasy> jest nazwą kasy, do której naeży metoda; nagłówek metody (nazwa, argumenty formane) musi odpowiadać jej dekaracji; definicje i dekaracje okane to dekaracje zmiennych i definicje typów które są dostępne tyko wewnątrz danej metody; kod metody to ciąg instrukcji języka Pasca, który impementuje agorytm reaizowany przez daną metodę; Wartość przypisana do Resut okreśa wynik metody funkcyjnej (wartość zwracaną przez metodę). Programowanie obiektowe s.-9
definicja kasy formuarza Przykład kasa formuarza (Przykład., wykład 0) type TForm = cass(tform) Labe : TLabe; Edit : TEdit; Button: TButton;... procedure ButtonCick(Sender: TObject); private pubic var Form: TForm; poa kasy (komponenty formuarza) prototyp metody (proc. obsł. zdarzenia) prywatna i pubiczna część kasy dekaracja zmiennej reprezentującej obiekt formuarza procedure TForm.ButtonCick(Sender: TObject); var a,b,x: rea; a := StrToFoat(Edit.Text);... definicja metody Programowanie obiektowe s.-0
Odwołania do pó i metod Wszystkie składniki (prywatne i pubiczne) są dostępne bezpośrednio z poziomu kasy w której zostały zdefiniowane. W takim przypadku odwołanie do poa ub metody odbywa się przez okreśenie ich nazwy. Poza kasą można odwołać się tyko do składników pubicznych poprzez obiekt kasy, do której metoda naeży. Odwołania do składników wewnątrz kasy Poe: nazwa_poa Metoda procedurana: nazwa_metody(argumenty_aktuane); Metoda funkcyjna: Odwołania do metod poza kasą Poe: zmienna := nazwa_metody(argumenty_aktuane); nazwa_obiektu.nazwa_poa Metoda procedurana: nazwa_obiektu.nazwa(argumenty_aktuane); Metoda funkcyjna: zmienna := nazwa_obiektu.nazwa(arg_aktuane); argumenty_aktuane argumenty o typach zgodnych z typem argumentów formanych, których wartości zostaną przekazane do funkcji; zmienna nazwa zmiennej, w której zostanie umieszczona wartość zwracana przez metodę funkcyjną (typ zmiennej musi być zgodny z typem wyniku metody). Programowanie obiektowe s.-
Konstruktor i destruktor Konstruktor metoda wywoływana w chwii tworzenia nowego obiektu. Każda definiowana kasa automatycznie otrzymuje domyśny konstruktor bezparametrowy, który inicjaizuje poa tworzonych obiektów wartościami zerowymi. Destruktor metoda wywoływana w chwii usuwania obiektu. Każda definiowana kasa automatycznie otrzymuje domyśny destruktor. Destruktor z zasady jest metodą bezparametrową. Przyjęte konwencje nazewnictwa: konstruktor - Create, destruktor - Destroy. Jeżei w chwii tworzenia ub usuwania obiektu niezbędne jest wykonanie dodatkowych czynności, możiwe jest zdefiniowanie własnego konstruktora i destruktora. Konstruktor definiowany jawnie może mieć dowoną iczbę argumentów. Składnia dekaracji konstruktora: constructor Create(argumenty); Składnia dekaracji destruktora: destructor Destroy; override; Tak jak inne metody kasy konstruktor i destruktor wymagają odpowiedniej definicji zgodnej ze składnią przedstawioną na s.8. Programowanie obiektowe s.-
Tworzenie i usuwanie obiektów w Dephi Składnia dekaracji zmiennej obiektowej: var <nazwa_zm_obiekt>: <nazwa_kasy>; Tworzenie nowego obiektu <nazwa_zm_obiekt> := <nazwa_kasy>.create; Usuwanie obiektu: <nazwa_zm_obiekt>.free; Definicji obiektu jest równoważna definicji zmiennej w języku Pasca, <nazwa_zm_obiekt> jest unikanym identyfikatorem języka Pasca, <nazwa_kasy> to kasa standardowa, ub zdefiniowana przez użytkownika, Dekaracja zmiennej obiektowej może wystąpić dopiero po definicji kasy, Zmienną obiektową, która nie przechowuje obiektu można inicjaizować stałą ni, Do sprawdzenia czy do zmiennej został przypisany obiekt służy standardowa funkcja Assigned(<nazwazm_obiekt>): Booean. Każdy obiekt utworzony metodą Create musi być usunięty przy pomocy Free. W przeciwnym przypadku pozostaje w pamięci do zakończenia programu. Programowanie obiektowe s.-3
Programowanie obiektowe s.-4 Obiekt ułamek - anaiza Ułamek zwykły wyrażenie postaci: m gdzie jest icznikiem, m mianownikiem ułamka. Obiekt tego typu opisują dwie iczby całkowite (icznik i mianownik), które zawierają kompetną informację o dowonym ułamku i jednoznacznie go charakteryzują. m m m m m m Dodawanie: Odejmowanie: m m m m m m m m m m m m m m Mnożenie: Dzieenie: Podstawowe operacje arytmetyczne: Dodatkowe operacje: ustawienie wartości icznika i mianownika, dostęp do icznika i mianownika, dostęp do wartości reprezentowanej przez ułamek.
Poa prywatne: FLicznik iczba całkowita, icznik ułamka, FMianownik iczba całkowita, mianownik ułamka. Metody pubiczne: Create konstruktor bezparametrowy, tworzy nowy obiekt, Poa i metody kasy Ułamek Ustaw dwa argumenty (iczby całkowite), ustawia wartość icznika i mianownika (m. procedurana), Licznik bezparametrowa, zwraca icznik jako iczbę (m. funkcyjna), Mianownik bezparametrowa, zwraca mianownik jako iczbę (m. funkcyjna), Tekst bezparametrowa, zwraca ułamek jako ciąg znaków postaci '/m' (m. funkcyjna), Dziesiętnie bezparametrowa, zwraca wartość ułamka jako iczbę dziesiętną (m. funkcyjna), Dodaj jeden argument, obiekt kasy Ułamek, dodaje do obiektu inny ułamek (m. procedurana), Odejmij, Pomnóż, Podzie anaogicznie do Dodaj. Programowanie obiektowe s.-5
Projekt kasy Ułamek Ułamek FLicznik: Integer FMianownik: Integer p.ustaw(,m: Integer) f.licznik: Integer f.mianownik: Integer f.tekst: String f.dziesiętnie: Rea p.dodaj(u: TUłamek) p.odejmij(u: TUłamek) p.pomnóż(u: TUłamek) p.podzie(u: TUłamek) Ułamek FLicznik: FMianownik: Ułamek FLicznik: FMianownik: 5 5 Obiekty w programie Obiekty rzeczywiste Kasa opisująca strukturę obiektów "Ułamek" Impementacja operacji arytmetycznych: W wyniku wykonania dowonej operacji nie powstaje nowy obiekt "Ułamek", następuje modyfikacja wartości ewego operandu, np. dodawanie ułamków u i u: u+u u.dodaj(u) nastąpi modyfikacja wartości ułamka u. Programowanie obiektowe s.-6
Impementacja kasy TUamek type TUamek = cass private FLicznik : Integer; FMianownik: Integer; pubic constructor Create; procedure Ustaw(, m: String); function Licznik : Integer; function Mianownik: Integer; function Tekst : String; function Dziesietnie: Rea; procedure Dodaj(u: TUamek); procedure Odejmij(u: TUamek); procedure Pomnoz(u: TUamek); procedure Podzie(u: TUamek); Programowanie obiektowe s.-7
TUamek konstruktor i metoda Ustaw Zadaniem konstruktora jest utworzenie nowego obiektu kasy ułamek i zainicjowanie jego pó. Konstruktor bezparametrowy powinien tworzyć obiekty o wartości neutranej. W przypadku iczb za wartość neutraną można przyjąć zero. Kasa nie może wykorzystać konstruktora domyśnego, ponieważ mianownik ułamka nie może być zerem (dzieenie przez zero jest niedozwoone). constructor TUamek.Create; FLicznik := 0; FMianownik := ; //!!!Mianownik ułamka nie może być zerem Metoda Ustaw umożiwia nadanie obiektowi Ułamek dowonej wartości (icznik i mianownik są prywatne, nie ma do nich dostępu poza kasą). procedure TUamek.Ustaw(, m: Integer); FLicznik := ; FMianownik := m; Programowanie obiektowe s.-8
TUamek metody Licznik i Mianownik Metody umożiwiają dostęp do prywatnych pó obiektu Ułamek (tzw. metody dostępowe). Takie rozwiązanie umożiwia swobodne korzystanie z wartości przypisanych do obiektu, a jednocześnie zabezpiecza przed nieuprawnioną (potencjanie błędną) zmianą informacji przechowywanej w obiekcie. function TUamek.Licznik: Integer; Resut := FLicznik; function TUamek.Mianownik: Integer; Resut := FMianownik; Programowanie obiektowe s.-9
TUamek metody Tekst i Dziesietnie Metoda "Tekst" zwraca ułamek w postaci łańcucha znaków, ułatwia wyświetanie wartości obiektu przy pomocy komponentów takich jak Edit ub Labe. Bez metody tego typu konieczne byłoby pobieranie icznika i mianownika jako iczby, konwersja na tekst i łączenie w pojedynczy łańcuch znakowy. function TUamek.Tekst: String; var znak: Integer; znak := sign(flicznik) * sign(fmianownik); Resut := Resut + IntToStr(znak*abs(FLicznik)) + '/' + IntToStr(abs(FMianownik)); Metoda "Dziesietnie" zwraca wartość ułamka jako iczbę rzeczywistą, pozwaa na proste użycie obiektu w wyrażeniach zawierających standardowe operatory arytmetyczne. function TUamek.Dziesietnie: Rea; Resut := FLicznik/FMianownik; Programowanie obiektowe s.-0
TUamek operacje arytmetyczne Metody reaizujące operacje arytmetyczne przyjmują, że pierwszym (ewym) operandem jest obiekt na rzecz którego metoda została wywołana, drugim (prawym) obiekt, który został przekazany jako argument. W odróżnieniu od standardowych operacji arytmetycznych (+, -, *, /) zaimpementowane metody nie tworzą nowego obiektu-wyniku, modyfikują obiekt będący ewym operandem. procedure TUamek.Dodaj(u: TUamek); FLicznik := FLicznik*u.FMianownik+u.FLicznik*FMianownik; FMianownik := FMianownik * u.fmianownik; procedure TUamek.Pomnoz(u: TUamek); FLicznik := FLicznik * u.flicznik; FMianownik := FMianownik * u.fmianownik; Uwaga: odwołania "FLicznik", "FMianownik" dotyczą obiektu na rzecz którego metoda jest wywoływana. Odwołania "u.flicznik", "u.fmianownik" dotyczą obiektu, który jest argumentem metody. Programowanie obiektowe s.-
Działanie: 3 Przykłady użycia kasy TUamek Kod programu: var u, u: TUamek; u := TUamek.Create; u.ustaw(,3); u := TUamek.Create; u.ustaw(4,5); u.odejmij(u); // Wynik odejmowania znajduje się w u u.free; u.free; Działanie: Kod programu: var u: TUamek; x: Rea; u := TUamek.Create; x := +u.dziesietnie; u.free; 4 5 3 4 u.ustaw(3,4); // Wynik odejmowania w zmiennej x Programowanie obiektowe s.-
Program Ułamki Ce programu Test metod kasy TUamek. Funkcje programu Przyciski "Licznik" i "Mianownik" tworzą obiekt na postawie danych w grupie "Ułamek", korzystając z odpowiednich metod dostępowych pobierają wartość atrybutu i wyświetają ją pou edycyjnym, Przycisk "Tekst" tworzy obiekt, pobiera jego znakową reprezentację i wyświeta w pou edycyjnym, Przycisk "Dziesiętnie" tworzy obiekt, pobiera jego reprezentację dziesiętną i wyświeta w pou edycyjnym, Przyciski "+", "-", "*" i "/" tworzą dwa obiekty i wykonują odpowiednią operację arytmetyczną modyfikując wartość pierwszego obiektu (Argument a), wynik w postaci znakowej i dziesiętnej wyświetany jest w dwóch poach edycyjnych. Pełny kod programu dostępny na stronie przedmiotu jako "Przykład0_6" Programowanie obiektowe s.-3
Organizacja kodu programu Definicję nowej kasy obiektów zazwyczaj umieszcza się w osobnym modue. Takie rozwiązanie ułatwia wieokrotne użycie kasy w różnych projektach (istniejący moduł można dołączyć do projektu przy pomocy poecenia uses). Nowy moduł można utworzyć wybierając opcję Fie->New->Unit. Dephi tworzy pusty szkieet modułu zawierający nagłówek, początek sekcji interfejsu (interface), początek sekcji impementacyjnej (impementation) oraz zakończenie modułu (end z kropką). Definicję kasy (definicję pó oraz dekarację prototypów metod) naeży umieścić w sekcji interfejsu modułu, definicję metod w sekcji impementacyjnej. Uwaga I: Nowoutworzone moduły nie mają dołączonych żadnych bibiotek. Zaeżnie od eementów użytych w kodzie kasy naeży dołączyć odpowiednie moduły używając kauzui uses (zazwyczaj co najmniej moduł SysUtis). Uwaga II: W ceu użycia kasy zdefiniowanej w osobnym modue naeży dołączyć ten moduł do kodu programu dopisując go do isty modułów w kauzui uses. Uwaga III: Listę wszystkich modułów wchodzących w skład projektu można wyświetić używając opcji View->Units Programowanie obiektowe s.-4
Program Ułamki moduł Unit, kod formuarza unit Unit; interface uses Windows, Messages, SysUtis, [ ]; type TForm = cass(tform) Edit: TEdit; Button: TButton; procedure ButtonCick(Sender: TObject); procedure ButtonCick(Sender: TObject);... private pubic var Form: TForm; impementation uses Unit; // <-- Dołączony moduł z definicją kasy {$R *.dfm} procedure TForm.ButtonCick(Sender: TObject);... procedure TForm.ButtonCick(Sender: TObject);...... end. Programowanie obiektowe s.-5
unit Unit; interface // sekcja interfejsu, definicja kasy type TUamek = cass private FLicznik : Integer; FMianownik: Integer; pubic constructor Create; procedure Ustaw(, m: Integer); function Licznik : Integer; procedure Dodaj(u: TUamek);... Program Ułamki moduł Unit, kod kasy impementation // sekcja impementacyjna, definicja metod uses SysUtis, Math; // bibioteki standardowe (IntToStr, sign) constructor TUamek.Create;... procedure TUamek.Ustaw(, m: Integer);... function TUamek.Licznik: Integer;...... end. Programowanie obiektowe s.-6
Program Ułamki procedura zdarzenia przycisku "Licznik" procedure TForm.ButtonCick(Sender: TObject); var u : TUamek; // zmienna obiektowa, m: Integer; := StrToInt(Edit.Text); m := StrToInt(Edit.Text); u := TUamek.Create; // utworzenie nowego obiektu u.ustaw(,m); // ustawienie icznika i mianownika Edit3.Text := IntToStr(u.Licznik); // pobranie icznika u.free; // usunięcie obiektu Przycisk "Mianownik" anaogicznie Programowanie obiektowe s.-7
Program Ułamki procedura zdarzenia przycisku "Tekst" procedure TForm.Button3Cick(Sender: TObject); var u : TUamek; // zmienna obiektowa, m: Integer; := StrToInt(Edit.Text); m := StrToInt(Edit.Text); u := TUamek.Create; // utworzenie nowego obiektu u.ustaw(,m); // ustawienie icznika i mianownika Edit3.Text := u.tekst; // pobranie reprezentacji tekstowej u.free; // usunięcie obiektu Programowanie obiektowe s.-8
Program Ułamki procedura zdarzenia przycisku "Dziesiętnie" procedure TForm.Button4Cick(Sender: TObject); var u : TUamek;, m: Integer; w : Rea; := StrToInt(Edit.Text); m := StrToInt(Edit.Text); u := TUamek.Create; // utworzenie nowego obiektu u.ustaw(,m); // ustawienie icznika i mianownika w := u.dziesietnie; // pobranie reprezentacji dziesiętnej Edit3.Text := FormatFoat('0.000', w); // Edit3.Text := FormatFoat('0.000', u.dziesietnie); u.free; // usunięcie obiektu Programowanie obiektowe s.-9
Program Ułamki procedura zdarzenia przycisku "+" procedure TForm.Button5Cick(Sender: TObject); var u, u: TUamek; // zmienne obiektowe, m,, m: Integer; := StrToInt(Edit4.Text); m := StrToInt(Edit5.Text); := StrToInt(Edit6.Text); m := StrToInt(Edit7.Text); u := TUamek.Create; // utworzenie obiektu u u.ustaw(,m); // ustawienie icz. i mian. u u := TUamek.Create; // utworzenie obiektu u u.ustaw(,m); // ustawienie iczn. i mian. u u.dodaj(u); // suma u+u (u jest modyfikowany) Edit8.Text := u.tekst; // pobranie wyniku Edit9.Text := FormatFoat('0.0###', u.dziesietnie); u.free; u.free; // usunięcie obiektu Programowanie obiektowe s.-30
Anaiza kasy TUamek Anaiza programu Ułamki Zaeta: powstał nowy typ danych, który umożiwia bezpośrednie działania na ułamkach zwykłych; Wada: utworzenie obiektu o dowonej wartości wymaga wykorzystania metody ustawiającej (nowy obiekt reprezentuje ułamek o wartości zero); Wada: metoda ustawiająca przyjmuje tyko wartości iczbowe (odpowiednie w przypadku tworzenia ułamków o wartościach stałych) w praktyce wygodne byłoby ustawianie icznika i mianownika na podstawie wartości łańcuchowych (ułatwia współpracę z typowym interfejsem użytkownika); Wada: zaimpementowane operacje arytmetyczne nie wyczerpują działań na ułamkach, możiwe jest np. dodawanie, mnożenie, itd. ułamka przez iczbę; Wada: kasa nie jest odporna na błędne wartości, możiwe jest utworzenie ułamka o zerowym mianowniku co prowadzi do błędów w programie. Anaiza kodu formuarza: Wada: program nie gwarantuje usuwania obiektów w przypadku błędu; Wada: obsługa błędów bardzo uproszczona, domyśne komunikaty nie opisują rzeczywistych probemów (naeży zapewnić obsługę wyjątków). Programowanie obiektowe s.-3