Selekcja w programowaniu, czyli odniesienie do składowej – zawarta w kodzie źródłowym operacja odniesienia (odwołania, selekcji, wyboru) do pewnej składowej struktury danych[1][2]. Takie odwołanie umożliwia:
- przypisanie składowej określonej wartości
- odczytanie (pobranie) wartości przechowywanej w składowej
- wywołanie podprogramu stanowiącego składową.
Sposoby odniesienia
W językach programowania stosuje się następujące sposoby odniesienia do składowych struktur[1][2]:
- desygnator
- pomijanie nazwy struktury, w przypadku stosowania unikatowych identyfikatorów składowych
- instrukcja wiążąca
- dodatkowa nazwa dla składowej
- słowo określające właśnie definiowaną strukturę.
Struktury danych
W różnych językach programowania istnieje możliwość definiowania w kodzie źródłowym i używania struktur danych, składających się z pól (zmiennych) różnych typów, oraz ewentualnie (w przypadku klas), także metod (podprogramów), wykonujących określone operacje na definiowanej strukturze i komunikacji z otoczeniem.
Typowe struktury danych, do których stosuje się selekcje, to m.in.:
- struktura[3][4][5], rekord[6][7][8][9]
- unia[3][4][5], rekord z wariantami[6][7][8][9]
- klasa, typ obiektowy[4][7][10]
- rekord bazy danych[11].
Oprócz powyższych, typowych struktur danych, selekcje mają zastosowanie również w przypadku definiowania odrębnych jednostek programowych, takich jak np. moduły, biblioteki, pakiety, wyliczenia, czy przestrzenie nazw, w celu wskazania właściwego elementu, reprezentowanego w kodzie źródłowym za pomocą pewnego identyfikatora, który to identyfikator może odnosić się do różnych elementów zdefiniowanych w odrębnych jednostkach. Selekcja umożliwia wybór elementu z konkretnej jednostki i jest stosowania w przypadku wystąpienia konfliktów nazw (jednakowych identyfikatorów)[7][10].
Elementy składowe
Jak wyżej wspomniano struktura danych może zawierać następujące rodzaje składowych[1][7][4]:
- pola
- metody (dla klas, obiektów).
Elementy składowe struktury mogą być rozmieszczone w pamięci[1]:
- jedna składowa za drugą[3][7]
- jedna składowa za drugą, ale z rozmieszczeniem od określonego miejsca w pamięci, np. granicy słowa[12]
- począwszy od tego samego miejsca w pamięci – adresu (unie i pola wariantowe)[7][4].
W rozpatrywanym kontekście, zasygnalizowany powyżej podział składowych i ich sposób rozmieszczenia, nie ma wpływu na sposób specyfikacji operacji selekcji. Jednakże pewne przypadki szczególne limitują możliwość odniesienia do pewnych składowych, np. w polach wariantowych, gdy zapisany aktualnie rekord posiada atrybuty dla innego wariantu[8].
Bardzo ważną zasadą jest możliwość zagnieżdżania struktur danych, tzn. pole pewnej struktury może stanowić również strukturę danych[12][2]. Takie zagnieżdżanie, we współczesnych systemach programowania jest niemal nieograniczone[1]. Oznacza ono stosowanie wielokrotnych desygnatorów pól, przy odwołaniu do pól najbardziej zagnieżdżonych w hierarchii struktur[1][10].
Miejsce stosowania
Zasadniczo selekcje stosuje się wewnątrz kodu definiującego określony algorytm. Selekcje jednak muszą także występować w przypadku deklaracji i definicji. Takie konstrukcje spotyka się głównie w tych językach, w których składnia umożliwia oddzielenie deklaracji pewnej struktury (klasy, pakietu itp.), od definicji poszczególnych składowych (metod), w których to definicjach umieszcza się selekcję, do której klasy dana metoda przynależy[4][8].
Przegląd selekcji
Desygnator pola
Desygnator pola; operator selekcji; odniesienie, odwołanie do składowej; operator wyboru; to operator lub symbol leksykalny zdefiniowany w określonym języku programowania, umożliwiająca w kodzie źródłowym odniesienie do pola lub metody, stanowiącego składową pewnej, zdefiniowanej danej strukturalnej. Zwykle jest to podstawowy sposób selekcji składowej. Występuje w każdym języku programowania wysokiego poziomu, w którym występują struktury danych wskazane wyżej. Polega na specyfikacji poszczególnych poziomów hierarchicznej struktury zagnieżdżenia danych, za pomocą odpowiedniego symbolu lub operatora.
Zalety:
- jednoznaczność jawnej i pełnej specyfikacji hierarchii
Wady:
- przy wielokrotnych zagnieżdżeniach zapis odwołania może być bardzo długi
- nużące i podatne na błędy zapisywanie takich odwołań
- zaciemnianie kodu źródłowego.
Najczęściej stosowanym desygnatorem jest kropka, np. w językach Pascal[6][7] , C[3][4][5] , C++[4] , PL/I[12] , Ada[8] , Modula-2[9] , Visual Basic[10] i wielu innych.
Przykład w języku Visual Basic for Applications[10] (porównaj z instrukcją wiążącą):
Selection.Font.Bold = MBold
Selection.Font.Italic = MItalic
Selection.Font.Underline = MUnderline
Selection.Font.Spacing = MSpacing
Selection.Font.Size = MSize
Instrukcja wiążąca
Ten sposób stosowany jest w takich języka jak np. Ada[8], Pascal[6][7], Modula-2[9], Visual Basic[10].
Zalety:
- zwięzłość zapisu
- strukturalność zapisu
- jawna specyfikacja, że w danych fragmencie kodu występuje skrócone odwołanie do składowych
Wady:
- trudności w analizie kodu przez człowieka
- konieczność stosowania desygnatorów w danym fragmencie przy kilku strukturach o składowych z identycznymi nazwami.
Przykład w języku Visual Basic for Applications[10] (porównaj z desygnatorem pola):
With Selection.Font
.Bold = MBold
.Italic = MItalic
.Underline = MUnderline
.Spacing = MSpacing
.Size = MSize
End With
Należy nadmienić, że powyższy zapis nazw pól w instrukcji wiążącej, polegający na poprzedzeniu identyfikatora składowej desygnatorem (w tym przypadku kropką), jest specyficzny dla systemu Visual Basic. Wiąże się on z wyborem przez programistę składowej, z listy składowych, która otwiera się automatycznie po wprowadzeniu, w edytorze tego systemu programowania, desygnatora. W językach takich jak Pascal[6][7] czy Modula-2[9], nie poprzedza się desygnatorem, w instrukcji wiążącej, identyfikatora składowej struktury wyspecyfikowanej w nagłówku instrukcji wiążącej.
Słowo kluczowe
Ten rodzaj selekcji, dzięki swojej składni, kładzie nacisk na pole jako ważniejszy element w porównaniu do całej struktury[1].
Zalety:
- jednoznaczność odwołania
Wady:
- niewygodny zapis.
Przykłady:
Pomijanie nazwy struktury
Rzadko występujący sposób odwołań (np. PL/I[12], COBOL[14])[1]. Polega on na podawaniu samej nazwy pola, nie poprzedzonej nawą struktury, do której pole przynależy. Jest to forma niejawnej specyfikacji selekcji, krytykowany jednak w literaturze przedmiotu za wady znacznie przewyższające zaletę zwięzłości zapisu[1].
Zalety:
- zwięzłość zapisu
Wady:
- konieczność znajomości deklaracji wszystkich struktur, tak aby tworzyć unikatowe identyfikatory także dla składowych
- co również oznacza brak możliwości stosowania przy zagnieżdżeniu w strukturze więcej niż jednej, jednakowej struktury podrzędnej, za względu na powtarzanie się identyfikatorów
- trudności przy zmianie kodu.
Nazwa składowej
To rozwiązanie polega na wprowadzenie dodatkowej deklaracji identyfikatora dla wybranego odwołania do składowej. Zastosowane zostało m.in. w języku Ada[8][1], COBOL[14][1], Euclid[1].
Zalety:
- zwięzłość zapisu
- jawna specyfikacja, wyprzedzające selekcji skróconej
Wady:
- konieczność dodatkowej deklaracji
- zwiększenie ilości identyfikatorów w kodzie.
odw: '''renames''' str.str_wewn.pole;
Słowo odwołujące do definiowanej struktury
Ten sposób selekcji dotyczy definiowana metod przynależnych do określonej klasy. W kodzie takiej definicji można użyć określonego w składni słowa identyfikującego definiowaną klasę, bez specyfikacji literalnej nazwy klasy. Stosowane są słowa sugerujące takie właśnie wskazanie:
Self
: Turbo Pascal[7], Smalltalk[1]this
: C++[4]Me
: Visual Basic[10].
Selekcje modułów
Definicja obiektu kodu (np. zmiennej, podprogramu itp.) o określonym identyfikatorze, w pewnej, niezależnej, odrębnej jednostce (module, bloku itp.), może spowodować albo konflikt nazw z inną równorzędną jednostką, albo przesłonięcie nazwy w jednostce zagnieżdżonej. Każde odwołanie do identyfikatora spowoduje odwołanie do obiektu lokalnego. W celu umożliwienia odwołania do obiektu zewnętrznego, lub jawnego wskazania, o element z której jednostki programowej chodzi, stosuje się selekcje, w postaci desygnatora, analogicznie jak w odniesieniu do struktur danych. Takie rozwiązanie dostępne jest między innymi w Turbo Pascalu[7] i Visual Basicu, w tym także w VBA[10], a w języku Python obowiązkowe.
Przykład w Turbo Pascalu[7]:
uses Crt;
begin
{ brak selekcji spowodowałby użycie procedury writeln modulu Crt }
System.writeln;
…
end.
Selekcje w językach programowania
język programowania | desygnator | pomijanie nazwy struktury | instrukcja wiążąca | dodatkowa nazwa | słowo własne | |
---|---|---|---|---|---|---|
rodzaj jednostki | oznacznik, symbol | |||||
Ada[8] | symbol | . (kropka) |
with str do instrukcja |
|
||
C[3][4][5] | operator |
|
||||
Modula-2[9] | symbol | . (kropka) |
WITH str DO instrukcje END |
|||
Pascal[6][7] | symbol | . (kropka) |
with str do instrukcja |
Self (Turbo/Borland Pascal) | ||
Visual Basic[10] | symbol | . (kropka) |
WITH str do instrukcje END WITH |
Me |
Zobacz też
Przypisy
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Michael Marcotty, Henry Ledgord, W kręgu języków programowania, tłumaczenie: Krystyna Jerzykiewicz, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1342-7.
- 1 2 3 John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8.
- 1 2 3 4 5 Brian W. Kernighan, Dennis M. Ritche, Język C, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1067-3.
- 1 2 3 4 5 6 7 8 9 10 Jan Bielecki, Od C do C++. Programowanie obiektowe w języku C, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, ISBN 83-204-1332-X.
- 1 2 3 4 Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7.
- 1 2 3 4 5 6 Michał Iglewski, Jan Madey, Stanisław Matwin, Pascal. Język wzorcowy – Pascal 360, Wydawnictwa Naukowo-Techniczne, Warszawa 1984, wydanie trzecie – zmienione, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0597-1.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994, seria: Biblioteka Użytkownika Mikrokomputerów, ISBN 83-85060-53-7, ISSN 0867-6011.
- 1 2 3 4 5 6 7 8 9 A. Nico Habermann, Dewayne E. Perry, Ada dla zaawansowanych, Wydawnictwa Naukowo-Techniczne, Warszawa 1989, seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1058-4.
- 1 2 3 4 5 6 Niklaus Wirth, Modula 2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8.
- 1 2 3 4 5 6 7 8 9 10 John Walkenbach, Excel 2003 PL. Programowanie w VBA, HELION, 2004, ISBN 837361-504-0.
- ↑ Wojciech Rogowski , Arkadiusz Serodziński , Clipper 5.0, Warszawa: Wydawnictwo PLJ, 1991, ISBN 83-85190-20-1, OCLC 749775734 .
- 1 2 3 4 Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4.
- ↑ Jan Małuszyński, Krzysztof Pisecki, Algol 68. Wprowadzenie do języka Algol 68, A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff,.H. Lindsey, L.G.L.T. Meertens, R.G. Fisker, w tłumaczeniu Jana Małuszyńskiego i Krzysztofa Piseckiego, Zmieniony raport o języku algorytmicznym Algol 68, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0161-5.
- 1 2 3 Eugeniusz Kurzydrem, Andrzej Macieliński, Urszula Szmidt, Eugeniusz Więcek, COBOL. Język programowania, Państwowe Wydawnictwo Ekonomiczne, Warszawa 1978, wydanie drugie.