Paradygmaty programowania - Katedra Informatyki > Home

Transkrypt

Paradygmaty programowania - Katedra Informatyki > Home
Paradygmaty programowania
Typy, typy abstrakcyjne
Cezary Bolek
Katedra Informatyki
UŁ
Czym jest typ ?
•
Typ to pewien ustalony zbiór wartości (w domyśle: które mogą
być przyjmowane przez zmienne)
•
W praktyce z kaŜdym typem związany jest zbiór operacji, które
moŜna wykonywać na wartościach z tego typu
•
Dozwolone operacje to wszystkie operatory (w szerokim
rozumieniu, czyli równieŜ podprogramy, podstawienia itp.),
których dziedziną jest ów typ lub typ z nim zgodny (tu zgodność
moŜna rozumieć jako zawieranie).
•
Przykładowo, niemal w kaŜdym języku występuje podstawowy
typ całkowity (int, integer). Jest to skończony podzbiór zbioru
liczb całkowitych, na ogół odpowiadający zakresowi liczb, jakie
moŜna przechowywać w jednym słowie danego komputera.
Dozwolone operacje to np. dodawanie, odejmowanie,
mnoŜenie, dzielenie.
Paradygmaty programowania
Cezary Bolek
2
Tworzenie nowych typów
• Typ pierwotny to taki, którego w danym języku nie da
się zdefiniować za pomocą innych typów.
• Większość języków posiada pewien zestaw typów
pierwotnych, np. char, int, float.
• Z typów pierwotnych moŜna tworzyć typy złoŜone,
np. rekordy, tablice.
• MoŜna tworzyć typy wyliczeniowe, czyli listy stałych.
Ich waŜną cechą jest to, Ŝe definiując typ
jednocześnie określamy liniowy porządek na nim.
• Jest wreszcie mechanizm tworzenia podtypów i
typów pochodnych.
• PowyŜsze mechanizmy to klasyka języków
imperatywnych zapoczątkowana przez Algol.
Paradygmaty programowania
Cezary Bolek
3
1
Po co są typy?
• Na poziomie maszynowym wszelkie dane zapisane
są jako układy bitów, niezaleŜnie od tego, co
reprezentują.
• Typy są sposobem na nadanie znaczenia tym
„anonimowym” układom bitów.
• Dzięki temu zyskuje się moŜliwość wykrywania wielu
powszechnych błędów (przez sprawdzanie zgodności
typów).
• Dodatkową korzyścią moŜe być optymalizacja kodu
przez kompilator, który np. zna zakresy liczb i moŜe
wybrać bardziej efektywną reprezentację.
• Typy abstrakcyjne są sposobem na modularyzację
programów.
Paradygmaty programowania
Cezary Bolek
4
Abstrakcyjne typy danych
•
Typ abstrakcyjny to konstrukcja języka programowania, w której
definiuje się typ oraz operacje na nim w taki sposób, Ŝe inne
byty w programie nie mogą manipulować danymi inaczej niŜ za
pomocą zdefiniowanych operacji.
•
Istotą rzeczy jest tu oddzielenie części „prywatnej” typu (czyli
szczegółów reprezentacji danych i implementacji
poszczególnych operacji) od części „publicznej” (tego, co
moŜna wykorzystywać w innych miejscach programu).
•
Ta koncepcja stała się podstawą rozwoju programowania
obiektowego:
– instancje abstrakcyjnych typów danych (czyli konkretne wartości z
typów, zwane obiektami) moŜna postrzegać jako samodzielne byty,
które współdziałają poprzez wykonywanie udostępnianych sobie
operacji.
Paradygmaty programowania
Cezary Bolek
5
Typy abstrakcyjne - przykłady
• Wbudowane w języki programowania typy pierwotne
moŜna uznać za abstrakcyjne: nie ma dostępu do
reprezentacji wewnętrznej, więc moŜna posługiwać
się jedynie tym, co dostarcza język.
• Zdefiniowany przez programistę w Pascalu typ
rekordowy i kilka procedur na nim działających nie
stanowi abstrakcyjnego typu danych. Zadeklarowanie
rekordu tego typu, pozwala działać bezpośrednio na
tym rekordzie z pominięciem „oficjalnych” procedur.
• Sztandarowy przykład to klasa np. z Javy lub C++.
Dane schowane w części prywatnej klasy nie są
dostępne na zewnątrz, stąd nie da się wykonywać
Ŝadnych operacji bezpośrednio.
Paradygmaty programowania
Cezary Bolek
6
2
Pierwotne typy danych
• Są to na ogół typy odzwierciedlające cechy sprzętu.
• Podstawowy pierwotny typ całkowity (int, integer)
odpowiada zazwyczaj takiemu zakresowi liczb, jaki
mieści się w jednym słowie maszyny.
• Podstawowy typ całkowity miewa warianty róŜniące
się rozmiarem (byte, short, long) i dopuszczaniem
znaku, tzn. liczb ujemnych (signed/unsigned).
• Pierwotne typy zmiennopozycyjne (float, double) to
obecnie prawie zawsze typy obsługiwane sprzętowo,
zgodne ze standardem IEEE 754.
• Pierwotne typy znakowe (char, character) przez
długie lata wykorzystywały kodowanie ASCII; obecnie
coraz częściej uŜywany jest Unicode.
Paradygmaty programowania
Cezary Bolek
7
Pierwotne typy danych
• Pierwotny typ logiczny (boolean) moŜe być
kodowany za pomocą pojedynczych bitów (co jest
oszczędne pamięciowo, ale wolniejsze w dostępie)
lub całych bajtów.
• Występują równieŜ pierwotne typy stałopozycyjne
(zwykle zwane decimal), czyli liczby z ustaloną w
deklaracji liczbą cyfr i liczbą miejsc po przecinku.
– Typy takie dobrze nadają się do obliczeń finansowych,
pozwalając uniknąć niektórych problemów z zaokrągleniami
charakterystycznych dla typów zmiennopozycyjnych. Inne
zastosowanie to obliczenia na urządzeniach pozbawionych
sprzętowej obsługi liczb zmiennopozycyjnych, np. przenośne
urządzenia do gier.
Paradygmaty programowania
Cezary Bolek
8
Aspekty implementacyjne dla róŜnych
typów
Paradygmaty programowania
Cezary Bolek
9
3
Typy napisowe
• Typ napisowy moŜe być typem pierwotnym
– np. w Javie (klasa String)
• W wielu językach, np. w C, napisy są szczególnym
rodzajem tablic (a więc nie są typem pierwotnym).
• Są róŜne moŜliwości obsługi napisów o zmiennej
długości
– Napisy statyczne, czyli po zadeklarowaniu nie moŜna
zmienić długości napisu, np. obiekty z klasy String w Javie.
– Napisy dynamiczne o długości ograniczonej statycznie.
Deklarujemy napis z górnym ograniczeniem na długość, np.
tablica znakowa w C.
– Napisy w pełni dynamiczne, czyli długość moŜe zmieniać się
bez ograniczeń, np. w Perlu.
– Ada pozwala stosować wszystkie trzy rodzaje napisów.
Paradygmaty programowania
Cezary Bolek
10
Typy napisowe
• Sposób implementacji napisów dynamicznych
istotnie wpływa na ich zachowanie
• Reprezentacja taka jak w języku C (kolejne znaki
zapisane w tablicy, ze znakiem o kodzie zero na
końcu) jest prosta, ale ma powaŜne wady: Ŝeby
poznać długość napisu, trzeba przejrzeć go od
początku do końca.
• Inny typowy sposób to pamiętanie osobno bieŜącej
długości napisu.
• Napisy w pełni dynamiczne wymagają alokowania
pamięci w miarę potrzeb, co jest kosztowne.
Paradygmaty programowania
Cezary Bolek
11
Tablice zwykłe
• Tablica to zestaw elementów takiego
samego typu, gdzie dostęp do
poszczególnych elementów jest poprzez
indeksowanie. Wymaga to dynamicznego
wyliczania adresu elementu (chyba Ŝe indeks
jest stałą znaną w czasie kompilacji).
Paradygmaty programowania
Cezary Bolek
12
4
Tablice - problemy implementacyjne
• Kiedy i skąd alokowana jest pamięć dla tablicy?
Generalnie tak jak dla zwykłych zmiennych, choć
języki obiektowe skłaniają się do alokowania tablic
dynamicznie, ze sterty (np. Java).
• Jakiego typu mogą być indeksy? W
najpowszechniejszym przypadku są to podtypy typu
(zakresu) całkowitego, ale niektóre języki
dopuszczają wszelkie typy „porządkowe”, czyli
dające się odwzorować na zakres liczb całkowitych:
typ znakowy, typ logiczny, typy wyliczeniowe.
• Czy indeksy są sprawdzane w czasie wykonania
programu?
– Ada sprawdza indeksy bardzo pieczołowicie, C – wogóle
Paradygmaty programowania
Cezary Bolek
13
Tablice - problemy implementacyjne
• Kiedy wiązany jest zakres (typ) indeksów?
– Jeśli tablica alokowana jest statycznie, to zakres indeksów
oczywiście musi teŜ być znany statycznie, np. globalna
tablica w C.
– Zakres indeksów moŜe być wiązany statycznie, mimo Ŝe
sama tablica jest alokowana dynamicznie, np. w Pascalu.
– I zakres, i pamięć mogą być wiązane dynamicznie, czyli
wymiar tablicy moŜe być zadany za pomocą wyraŜenia
wyliczanego dopiero w chwili alokacji tablicy.
– PowyŜsze podejścia traktują o tablicach, których rozmiar jest
ustalony w chwili alokacji. Istnieją takŜe tablice w pełni
dynamiczne, które mogą rosnąć i kurczyć się w okresie
swojego Ŝycia - np. w Perlu.
Paradygmaty programowania
Cezary Bolek
14
Tablice - problemy implementacyjne
• Czy i jak moŜna inicjować tablice?
• Czy dopuszczamy tablice wielowymiarowe?
• Czy dopuszczalne jest operowanie na wycinkach
tablic?
– Wycinek oznacza tu spójny fragment o rozmiarze mniejszym
niŜ rozmiar pierwotnej tablicy. Szczególnie interesujące są
wycinki tablic wielowymiarowych; moŜna wtedy wycinać np.
dwuwymiarowy fragment tablicy trójwymiarowej.
• Czy dopuszczalne są operacje indukowane z operacji
na elementach? W pewnych sytuacjach takie
operacje byłyby naturalne, np. dodawanie macierzy.
Tego typu operacje oferuje Fortran.
Paradygmaty programowania
Cezary Bolek
15
5
Dostęp do elementów tablicy
• Tłumacząc instrukcje zawierające odwołania do
elementów tablicy, kompilator generuje kod wyliczający
adres elementów.
• Dla tablic jednowymiarowych adres elementu T[i]:
(adres pierwszego elementu) + (i – indeks pierwszego
elementu)*(rozmiar elementu)
• Tablice wielowymiarowe przechowywane są tak, jakby to
były tablice tablic jednowymiarowych, w dwóch moŜliwych
wariantach: wierszami lub kolumnami.
• Przy ułoŜeniu tablicy dwuwymiarowej wierszami daje to
adres elementu T[i, j] równy:
(adres elementu T[0, 0]) + (i*n + j)*(rozmiar
elementu)
• gdzie n jest liczbą elementów w wierszu.
Paradygmaty programowania
Cezary Bolek
16
Tablice asocjacyjne
• Tablica asocjacyjna to nieuporządkowany zestaw
elementów identyfikowanych za pomocą kluczy.
Istotą rzeczy jest to, Ŝe klucze mogą pochodzić z
obszernego zbioru moŜliwych wartości. Nie ma
zatem prostego odwzorowania kluczy na adresy
elementów tablicy. Tablice asocjacyjne są uŜyteczne
tam, gdzie potrzebny jest swobodny
(nieuporządkowany) dostęp do elementów. Typowy
przykład tablic asocjacyjnych pojawia się w Perlu, np.
%wzrost = (”Jacek” => 177, ”Joanna” => 166, ”Jerzy” => 199);
$wzrost{”Józefina”} = 188;
delete $wzrost{”Jerzy”};
if (exists $wzrost{”Joanna”}) ...
Paradygmaty programowania
Cezary Bolek
17
Rekordy
• Rekord to zestaw elementów dowolnych
typów.
• Elementy rekordu zwane są polami.
• Większość języków stosuje zapis „z kropką”
na oznaczenie dostępu do pól rekordu.
• Rekordy przechowywane są w pamięci w
kolejnych komórkach, choć architektura
sprzętu moŜe narzucać wymóg umieszczania
niektórych pól pod adresami będącymi
wielokrotnością np. czterech.
– MoŜe to powodować luki pomiędzy polami.
Paradygmaty programowania
Cezary Bolek
18
6
Unie
• Unia to zestaw elementów dowolnych typów, z
których w dowolnym momencie przechowywany jest
tylko jeden.
• Cel - oszczędne wykorzystanie pamięci w sytuacji,
gdy elementy nigdy nie są potrzebne jednocześnie.
• W niektórych językach unie są deklarowane jako
fragment rekordu (rekord z wariantami).
• Podstawowe pytanie implementacyjne to czy chcemy
mieć dynamiczne sprawdzanie typu.
– Jeśli nie, to odpowiedzialność za uŜycie niewłaściwej
wartości z unii spada na programistę (C, C++)/
– Jeśli typ ma być sprawdzany, to unia musi dodatkowo
zawierać znacznik przechowujący informację o typie
przechowywanej w danej chwili wartości (Ada i Pascal).
Paradygmaty programowania
Cezary Bolek
19
Typy wskaźnikowe
• Typ wskaźnikowy obejmuje wartości, które mogą
wskazywać inne wartości w pamięci, oraz dodatkową
wartość „pustą”, która jest inna niŜ jakikolwiek
„prawdziwy” wskaźnik.
• Wartość „pusta” bywa oznaczana jako null lub nil.
• Z technicznego punktu widzenia wskaźniki są po
prostu adresami komórek pamięci.
• RóŜnica między wskaźnikiem a adresem to
dodatkowa informacja o typie wskazywanych
obiektów, którą posiada kompilator (i wykorzystuje do
sprawdzania zgodności typu).
• Motywacją do uŜywania wskaźników jest moŜliwość
dynamicznego zarządzania pamięcią oraz
elastyczność, jaką daje adresowanie pośrednie.
Paradygmaty programowania
Cezary Bolek
20
Operacje na wskaźnikach
•
Potrzebne jest przypisanie i dereferencja wskaźnika, czyli
dostęp do elementu wskazywanego przez wskaźnik.
•
Niektóre języki mają niejawną dereferencję, np. Ada czyni tak w
oczywistych przypadkach (odwołania postaci p.x).
•
Do zarządzania pamięcią potrzebny jest mechanizm alokacji,
np. new, malloc.
•
Adresowanie pośrednie wymaga posiadania operatora pobrania
adresu (wskazania) zmiennej (operator & w języku C).
•
Arytmetyka na wskaźnikach, czyli moŜliwość swobodnego
przesuwania wskaźnika, daje programiście duŜe moŜliwości, ale
jest niebezpieczna: łatwo sięgnąć do „nieswojej” pamięci (np. w
C i C++).
•
Bez moŜliwości przesuwania wskaźnika mechanizm staje się
bezpieczniejszy (Java).
Paradygmaty programowania
Cezary Bolek
21
7
Wskaźniki
• Problemy
– Wiszący wskaźnik to wskaźnik odnoszący się do zmiennej,
która została juŜ zdealokowana.
– Ten problem znika, gdy w języku nie ma jawnej dealokacji
(np. Java).
– Zgubiona zmienna to zmienna na stercie, do której nie
mamy Ŝadnego wskaźnika.
• Typy referencyjne
– Pod tym pojęciem kryją się typy wskaźnikowe o
ograniczonych moŜliwościach.
– W C++ typ referencyjny obejmuje stałe wskaźniki z niejawną
dereferencją, na których nie są dozwolone operacje
arytmetyczne.
– W Javie referencje odnoszą się do obiektów. MoŜna je
kopiować przez przypisanie; arytmetyka nie jest dozwolona.
Paradygmaty programowania
Cezary Bolek
22
Implementacja niejawnej dealokacji
• Pierwsza metoda - liczniki odwołań. Dla kaŜdego
przydzielonego bloku pamięci utrzymujemy licznik
odwołań do tego bloku. Licznik aktualizujemy przy
kopiowaniu wskaźników, wyjściu wskaźnika poza
zakres widoczności itp. Blok, do którego nie ma
odwołań, jest dealokowany.
• Druga metoda - zbieranie śmieci. Gdy brakuje
miejsca na stercie, rozpoczyna się zbieranie śmieci.
Przeglądamy stertę i wszystkie wskaźniki,
zaznaczając te bloki, do których nie ma odwołań.
Bloki te są następnie dealokowane.
• Dopuszczenie arytmetyki wskaźnikowej uniemoŜliwia
stosowanie powyŜszych metod, gdyŜ nie da się
wówczas stwierdzić, do których bloków są odwołania
Paradygmaty programowania
Cezary Bolek
23
Abstrakcyjne typy danych
•
Abstrakcja to reprezentacja pewnego bytu, w której pominięto
nieistotne w danym kontekście szczegóły. Pozwala to grupować
byty według ich wspólnych cech i - zaleŜnie od potrzeby - albo
zajmować się całymi grupami (czyli owymi wspólnymi cechami),
albo bytami wewnątrz grupy (czyli szczegółami róŜniącymi byty
w grupie). Chodzi oczywiście o to, by poradzić sobie ze
złoŜonością problemów.
•
Dwie podstawowe abstrakcje w językach programowania to:
– Abstrakcja procesu: Abstrakcjami procesów są podprogramy.
Pozwalają wskazać (przez ich wywołanie), Ŝe pewna czynność ma
być wykonana, bez wskazywania jak ma być wykonana. Szczegóły
znajdują się w treści podprogramu, której wywołujący nie musi
znać.
– Abstrakcja danych: Zamknięta całość obejmująca reprezentację
pewnego typu danych wraz z podprogramami, umoŜliwiającymi
działanie na tych danych.
Paradygmaty programowania
Cezary Bolek
24
8
Abstrakcyjny typ danych
•
•
Jest to konstrukcja języka programowania, w której definiowany
jest typ oraz operacje na nim w taki sposób, Ŝe inne byty w
programie nie mogą manipulować danymi inaczej niŜ za
pomocą zdefiniowanych przez nas operacji.
Istotą rzeczy jest tu oddzielenie
– części „prywatnej” typu (czyli szczegółów reprezentacji danych i
implementacji poszczególnych operacji)
– od części „publicznej” (tego, co moŜna wykorzystywać w innych
miejscach programu).
•
•
Rozdzielenie składników abstrakcyjnego typu danych na część
prywatną i publiczną jest moŜliwe za pomocą zawartych w
języku programowania mechanizmów sterowania dostępem.
Dane w typie abstrakcyjnym zwane są
– właściwościami lub danymi składowymi; uŜywa się teŜ określeń
pole lub po prostu zmienna
– Operacje zwane są metodami lub funkcjami składowymi.
Paradygmaty programowania
Cezary Bolek
25
Abstrakcyjny typ danych
• Obiekt to instancja abstrakcyjnego typu
danych, czyli pojedynczy „egzemplarz” tego
typu zaalokowany
– na stercie (najczęściej),
– na stosie
– lub statycznie (najrzadziej).
• Sam abstrakcyjny typ danych w większości
języków zwany jest klasą.
Paradygmaty programowania
Cezary Bolek
26
Implementacja abstrakcyjnych typów danych
• Co powinno być w języku?
– Jednostka syntaktyczna mieszcząca definicję typu
– Sposób wyszczególnienia danych i podprogramów
publicznych.
– Kilka podstawowych, wbudowanych operacji na obiektach z
typu, np. podstawienie, sprawdzenie równości.
– Pewne operacje są potrzebne niemal w kaŜdym typie, są
jednak zaleŜne od szczegółów tego typu. Muszą zatem być
implementowane przez programistę. Są to np. konstruktory,
destruktory, iteratory.
– Język moŜe oferować abstrakcyjne typy danych wprost
(C++, C#, Java) lub moŜe mieć bardziej ogólne konstrukcje
(np. Ada).
Paradygmaty programowania
Cezary Bolek
27
9
Język Ada
• Ada zawiera konstrukcje enkapsulacyjne (czyli
konstrukcje wiąŜące mniejsze jednostki w zamkniętą
całość) zwane pakietami.
• Pakiet składa się z dwóch części: specyfikacji i ciała.
• Programista moŜe udostępnić element pakietu w
całości lub tylko w postaci interfejsu (czyli
specyfikacji, jak uŜyć danego elementu).
• W pierwszym przypadku, element staje się
bezpośrednio dostępny za pomocą nazwy. Nie jest
wówczas typem abstrakcyjnym.
• W drugim przypadku, skrócona deklaracja pojawia
się w publicznej części specyfikacji, a reprezentacja części prywatnej.
Paradygmaty programowania
Cezary Bolek
28
Język Ada - przykład
• Przykład specyfikacji pakietu do obsługi stosu:
package Stos is
type typ_stosowy is limited private;
maks_rozmiar: constant := 1000;
function pusty(st: in typ_stosowy) return Boolean;
procedure połóŜ(st: in out typ_stosowy; elem: in Integer);
procedure zdejmij(st: in out typ_stosowy);
function szczyt(st: in typ_stosowy) return Integer;
private
type typ_listowy is array (1..maks_rozmiar) of Integer;
type typ_stosowy is record
list: typ_listowy;
wsk_stosu: Integer range 0..maks_rozmiar := 0;
end record;
end Stos;
Paradygmaty programowania
Cezary Bolek
29
Język C++
•
•
•
•
•
•
•
•
Język oferuje dwie konstrukcje: class i struct, róŜniące się domyślnymi
regułami dostępu.
Klasy języka C++ są typami.
Jednostka programu, która zadeklarowała instancję klasy (obiekt), ma
dostęp do publicznych bytów tej klasy, ale tylko poprzez tę instancję.
KaŜda instancja klasy ma własny zestaw danych, natomiast funkcje
(metody) nie są powielane lecz przechowywane wspólnie dla całej
klasy.
Obiekty mogą być statyczne oraz dynamiczne, alokowane na stosie
(dostęp przez „zwykłe” zmienne) lub na stercie (dostęp przez
wskaźniki).
Alokacja i dealokacja na stercie są jawne; słuŜą do tego operacje new i
delete.
Definicja klasy moŜe zawierać konstruktor, który będzie niejawnie
wywoływany przy tworzeniu obiektu z klasy.
Definicja klasy moŜe teŜ zawierać destruktor, wołany przy dealokacji
obiektu
Paradygmaty programowania
Cezary Bolek
30
10
Język C++ przykład
• Przykład klasy do obsługi stosu liczb całkowitych:
class stos {
private:
int *baza, maks_rozmiar, wsk_stosu;
public:
stos() {
baza = new int [1000];
maks_rozmiar = 999;
wsk_stosu = -1;
};
~stos() {delete []baza;};
void poloz(int elem) {...};
void zdejmij() {...};
int szczyt() {...};
int pusty() {...};
}
Paradygmaty programowania
Cezary Bolek
31
Język Java
•
W Javie wszystkie typy zdefiniowane przez uŜytkownika są
klasami.
•
Wszystkie obiekty są alokowane na stercie.
•
Podprogramy (metody) mogą być definiowane tylko w klasach.
•
Klasy są deklarowane i definiowana w jednej jednostce
syntaktycznej.
•
Do sterowania dostępem stosuje się oznaczenia public, private i
protected przy poszczególnych definicjach.
•
Pakiety pozwalają na modularyzację programów. W obrębie
pakietu elementy klasy bez oznaczenia dostępu są widoczne
dla innych klas.
•
Nie ma destruktorów, gdyŜ Java wykonuje niejawne zbieranie
śmieci.
Paradygmaty programowania
Cezary Bolek
32
Język Java - przykład
• Przykład klasy do obsługi stosu liczb całkowitych:
class Stos {
private int baza[];
private int maks_rozmiar, wsk_stosu;
public Stos() {
baza = new int[1000];
maks_rozmiar = 999;
wsk_stosu = -1;
};
public void poloz(int elem) {...};
public void zdejmij() {...};
public int szczyt() {...};
public boolean pusty() {...};
}
Paradygmaty programowania
Cezary Bolek
33
11
Język C#
•
•
•
Wszystkie obiekty typów zdefiniowanych za pomocą class są
alokowane na stercie; na stosie są alokowane obiekty typów
zdefiniowanych za pomocą struct.
C# wykonuje zbieranie śmieci, więc destruktory nie są
konieczne. Mogą być jednak definiowane, jeśli programiście
zaleŜy na wykonaniu jakichś czynności przed dealokacją
obiektu.
W C# istnieje pojęcie akcesorów („pobieraczy” i „ustawiaczy”)
pozwalających na ograniczony dostęp do danych prywatnych.
Jest to bezpieczniejsze niŜ dostęp bezpośredni.
– „Pobieracz” to funkcja, która jest wykonywana przy odczytywaniu
prywatnej zmiennej obiektu, którą programista postanowił
udostępnić w taki sposób.
– Podobnie „ustawiacz” jest wywoływany przy próbie podstawienia
pod zmienną.
Paradygmaty programowania
Cezary Bolek
34
12