Struktury i abstrakcyjne typy danych¶
Aby poradzić sobie ze złożonością problemów i sprawnie przeprowadzić proces znalezienia rozwiązania programiści używają abstrakcji, dzięki której główna uwaga poświęcona jest „ogólnemu charakterowi” zagadnienia, a nie poszczególnym elementom. Poprzez modelowanie dziedziny problemu możemy w efektywniejszy sposób dążyć do rozwiązania dzięki bliższemu powiązaniu danych modyfikowanych w algorytmie do rzeczywistego problemu.
Poprzednio, opisaliśmy abstrakcję proceduralną jako proces, który ukrywa szczegóły danej funkcji, umożliwiając użytkownikowi lub klientowi jej obsługę jedynie za pomocą wysokopoziomowego interfejsu. Teraz skupimy uwagę na podobnej idei, dotyczącej danych abstrakcyjnych. Abstrakcyjny typ danych, skrótowo nazywany ADT, jest to logiczny ich opis, zawierający sposób, w jaki są postrzegane przez nas i jakie operacje są na nich dozwolone, bez uwzględnienia, jak zostaną one zrealizowane. To z kolei oznacza, że mamy do czynienia tylko z tym, co te dane przedstawiają, a nie jak końcowo będą zaimplementowane. Taki poziom abstrakcji jest źródłem tzw. enkapsulacji (hermetyzacji) danych. Hermetyzacja ukrywa przed użytkownikiem szczegóły implementacji, co nazywamy ukrywaniem informacji.
Figure 2 przedstawia, czym jest abstrakcyjny typ danych i jak działa. Użytkownik obsługuje interfejs w sposób, który został określony przez zastosowany, abstrakcyjny typ danych. Stanowią one pewnego rodzaju powłokę, z którą użytkownik współpracuje. Szczegóły implementacji są ukryte na niższym poziomie, a użytkownik w żaden sposób nie musi być z nimi zaznajomiony.
Implementacja abstrakcyjnych typów danych, określana również strukturą danych, wymaga opracowania fizycznej ich realizacji za pomocą dostępnych konstrukcji programistycznych i pierwotnych typów danych. Jak wspomnieliśmy wcześniej, rozdzielenie tych dwóch perspektyw pozwoli nam tworzyć złożone modele danych dla naszych problemów, nie określając przy tym żadnych szczegółów, dotyczących budowy tego modelu. Umożliwia to analizę danych niezależnie od ich realizacji. Ze względu na różnorodność możliwych implementacji abstrakcyjnych typów danych, uniezależnienie się od rodzaju realizacji pozwala programiście swobodnie ją modyfikować bez żadnego wpływu na końcową obsługę tych danych przez użytkownika.