Pakiety i ATD 1 Definicja. Pakietem albo jednostką programową nazywamy grupę logicznie powiązanych elementów, które mogą być typami, podtypami, obiektami tych typów i podtypów oraz mogą być podprogramami z parametrami tych typów i podtypów. Ponadto, pakiet może zawierać inne pakiety. Pakiety mogą korzystać z elementów udostępnia-nych przez inne pakiety. Pakiety mogą posiadać dwie części: publiczną (definicyjną) i implementacyjną.
Pakiety i ATD 2 Część publiczna opisuje zasoby udostępniane przez pakiet jego użytkownikom. Zasoby te obejmują zazwyczaj: typy, podtypy, stałe i podprogramy. Część implementacyjna zawiera sposób implementacji zasobów określonych w części definicyjnej. Struktura hierarchiczna pakietów Ada posiada hierarchiczną strukturę pakietów. Struktura ta oparta jest o pojęcie pakietów potomnych.
Pakiety potomne mogą mieć swoje pakiety potomne itd. Pakiety i ATD 3 Wszystkie pakiety standardowe wywodzą się z trzech pakietów macierzystych: Ada Interfaces System Pakiet Ada jest pakietem macierzystym większości innych standardowych pakietów bibliotecznych Ady. Zasoby pozwalające na łączenie instrukcji Ady z instrukcjami pisanymi w innych językach można znaleźć w pakiecie Interfaces i jego pakietach potomnych. Pakiet System i jego pakiety potomne dostarczają charakterystyk otoczenia systemowego w jakim mają działać programy Ady. Pakiety potomne mogą mieć swoje pakiety potomne itd.
Ada.Numerics.Elementary_Functions Składnia części publicznej pakietu Pakiety i ATD 4 Przykład Pakiet standardowy Elementary_Functions jest pakietem potomnym pakietu Numerics, który jest pakietem potomnym pakietu Ada. Zapisujemy tę strukturę następująco: Ada.Numerics.Elementary_Functions Składnia części publicznej pakietu package_declaration ::= package_specification; package_specification ::= package defining_program_unit_name is {basic_declarative_item} [private[basic_declarative_item}] end [defining_program_unit_name];
Pakiety i ATD 5 defining_program_unit_name ::= [parent_program_unit_name.]identifier basic_declarative_item ::= type_declaration | subtype_declaration | object_declaration | subprogram_declaration | generic_instantation| generic declaration
Składnia części implementacyjnej pakietu Pakiety i ATD 6 Składnia części implementacyjnej pakietu package_body ::= package body defining_program_unit_name is declarative_part [begin sequence_of_statements] end [defining_program_unit_name]; declarative_part ::= {basic_declarative_item | subprogram_body} Słowniczek package_declaration – deklaracja pakietu, package_specification – specyfikacja pakietu,
Pakiety i ATD 7 defining_program_unit_name – nazwa jednostki programowej, basic_declarative_item – podstawowy element deklaracji, parent_unit_name – nazwa macierzystej jednostki programowej, type_declaration – deklaracja typu, subtype_declaration – deklaracja podtypu, object_declaration – deklaracja obiektu, subprogram_declaration – deklaracja podprogramu, generic_instantation – konkretyzacja, declarative_part – część deklaracyjna, subprogram_body – treść podprogramu.
Pakiety i ATD 8 Część implementacyjna zawiera szczegóły implementacyjne elementów deklarowanych w części publicznej. Część implementacyjna może także zawierać deklaracje typów, podtypów, stałych, konkretyzacje oraz podprogramy potrzebne do realizacji implementacji. Treść części implementacyjnej nie jest udostępniana programowi korzystającemu z zasobów pakietu udostępnianych przez jego część publiczną.
Pakiety i ATD 9 Część publiczna znajduje się w pliku z rozszerzeniem ads. Część implementacyjna jest w pliku z rozszerzeniem adb. Jeżeli pakiet zawiera obydwie części, to najpierw kompilowana jest część definicyjna, a potem implementacyjna. Część implementacyjna może zawierać część inicjującą, która, jeżeli występuje, jest ciągiem instrukcji po słowie kluczowym begin. Część publiczna może zawierać część prywatną, w której umieszcza się szczegóły implementacji tych typów i obiektów których niepełne deklaracje znajdują się w części publicznej.
Pakiety i ATD 10 Rodzaje pakietów Pakiety definiujące Pakiety takie zawierają określenia stałych i typów używanych w kilku programach, albo używane przez różnych programistów opracowujących różne części dużego programu. Pakiety takie nie mają części implementacyjnej. Przykład My_Reals, Atrybuty_Real, Test_Reals Pakiety usługodawcze Pakiety takie zawierają stałe, typy, podtypy i podprogramy konieczne do obsługi pewnych usług.
Pakiety i ATD 11 Przykład Ada.Text_IO, Ada.Numerics.Elementary_Functions Pakiety do abstrakcji danych Pakiety te służą najczęściej do określenia dodatkowych operacji, które mogą być wykonywane na danych typu określonego przez programistę. Przykład Wektory_2d
Pakiety i ATD 12 Abstrakcyjne typy danych Abstrakcja danych (data abstraction) polega na tym, że typ danych rozumiany jest jako określenie zbioru do którego należą dane i zdefiniowaniu podstawowych operacji, które mogą być wykonywane na elementach tego zbioru. Abstrakcyjny typ danych (ATD) (abstract data type - ADT) Abstrakcja danych służy do udostępniania operacji na danych przy jednoczesnym ukryciu szczegółów reprezentacji danych i szczegółów implementacji operacji określonych dla tych danych.
Pakiety i ATD 13 Program korzystający z ATD nazywamy programem klienckim (client program), albo klientem (client). W programie tym można deklarować obiekty ATD i używać operacji zdefiniowanych dla tego typu. Dzięki ukryciu informacji (information hiding) o reprezentacji typu i implementacji operacji osiąga się separację (separation) wykorzystania ATD w programie klienckim od reprezentacji typu i implementacji operacji na danych tego typu. Dzięki temu program kliencki może być opracowany niezależnie od abstrakcyjnego typu danych.
Pakiety i ATD 14 Struktura ATD Zazwyczaj ATD jest typem strukturalnym, najczęściej rekordem. Wyróżniamy następujące grupy operacji wykonywanych na obiektach ATD: Konstruktory (constructors) – tworzą lub konstruują obiekty ATD łącząc składowe w jedną całość, Selektory (selectors) – wybierają składowe obiektu, Zapytania (inquiries) – służą do ustalenia czy obiekt ATD ma pewną własność, Wejście/Wyjście (input/output) – służą do czytania i wypisywania danych ATD
Pakiety i ATD 15 W języku Ada istnieje kilka mechanizmów i pojęć pozwalających na realizację i stosowanie ATD. Podtypy – omówione w ramach skalarnych typów danych Inicjowanie pól rekordów – czyli nadawanie wartości domyślnych składowym typu rekordowego przy jego deklaracji Pakiety Typy prywatne Przeciążanie operatorów Definiowanie i obsługa wyjątków Atrybuty – omówione w ramach typów skalarnych, tablicowych i rekordowych Definicje ogólne