Paradygmaty programowania

Podobne dokumenty
zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy Programowania Obiektowego

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Definiowanie własnych klas

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Ada-95. Dariusz Wawrzyniak

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Lab 9 Podstawy Programowania

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Podstawy Programowania C++

Wykład 8: klasy cz. 4

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie 2. Język C++. Wykład 3.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Programowanie obiektowe - 1.

Technologie i usługi internetowe cz. 2

Podstawy programowania skrót z wykładów:

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

1 Podstawy c++ w pigułce.

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Java Podstawy. Michał Bereta

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wstęp do programowania obiektowego. Wykład 2

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład 4: Klasy i Metody

Java Język programowania

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Algorytmy i struktury danych. wykład 1

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

MATERIAŁY DO ZAJĘĆ II

Wstęp do programowania 2

Algorytmy i struktury danych

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie w języku C++ Podstawowe paradygmaty programowania

Podstawy programowania. Podstawy C# Tablice

Wskaźniki. Informatyka

Podstawowe części projektu w Javie

Szablony funkcji i szablony klas

Technologie obiektowe

TEMAT : KLASY DZIEDZICZENIE

Wykład 1: Wskaźniki i zmienne dynamiczne

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Wykład 9: Polimorfizm i klasy wirtualne

Platformy Programistyczne Podstawy języka Java

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Materiały do zajęć VII

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy programowania obiektowego

Dziedziczenie jednobazowe, poliformizm

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Deklaracja struktury w C++

Aplikacje w środowisku Java

Podstawy programowania w języku C++

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe

Podstawy i języki programowania

Programowanie obiektowe

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

ZASADY PROGRAMOWANIA KOMPUTERÓW

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Wykład 5: Klasy cz. 3

Programowanie Komputerów

Transkrypt:

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