Selekcja (programowanie)

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 edytuj

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 edytuj

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 edytuj

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 edytuj

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 edytuj

Desygnator pola edytuj

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 edytuj

Osobny artykuł: 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 edytuj

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 edytuj

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 edytuj

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 edytuj

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 edytuj

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 edytuj

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

idf:typ renames ob_p

 
C[3][4][5] operator
  • . (kropka)
  • -> (strzałka dla wskaźników)
       
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ż edytuj

Przypisy edytuj

  1. a b c d e f g h i j k l m n o 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. a b c John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8.
  3. a b c d e 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. a b c d e f g h i j Jan Bielecki, Od C do C++. Programowanie obiektowe w języku C, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, ISBN 83-204-1332-X.
  5. a b c d Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7.
  6. a b c d e f 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. a b c d e f g h i j k l m n 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. a b c d e f g h i 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. a b c d e f Niklaus Wirth, Modula 2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8.
  10. a b c d e f g h i j 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. a b c d 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. a b c Eugeniusz Kurzydrem, Andrzej Macieliński, Urszula Szmidt, Eugeniusz Więcek, COBOL. Język programowania, Państwowe Wydawnictwo Ekonomiczne, Warszawa 1978, wydanie drugie.