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.:

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.

Przykład w języku Ada[8]:

  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:

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) N with str do instrukcja

idf:typ renames ob_p

N
C[3][4][5] operator
  • . (kropka)
  • -> (strzałka dla wskaźników)
N N N N
Modula-2[9] symbol . (kropka) N WITH str DO instrukcje END N N
Pascal[6][7] symbol . (kropka) N with str do instrukcja N Self (Turbo/Borland Pascal)
Visual Basic[10] symbol . (kropka) N WITH str do instrukcje END WITH N Me

Zobacz też

Przypisy

  1. 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.
  2. 1 2 3 John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 1 2 3 4 5 6 7 8 9 10 John Walkenbach, Excel 2003 PL. Programowanie w VBA, HELION, 2004, ISBN 837361-504-0.
  11. Wojciech Rogowski, Arkadiusz Serodziński, Clipper 5.0, Warszawa: Wydawnictwo PLJ, 1991, ISBN 83-85190-20-1, OCLC 749775734.
  12. 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.
  13. 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.
  14. 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.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.