Strażnik (informatyka)
W programowaniu komputerowym strażnik jest wyrażeniem boolowskim , które musi mieć wartość true, jeśli wykonywanie programu ma być kontynuowane w danej gałęzi. Niezależnie od tego, który język programowania jest używany, klauzula ochronna , kod ochronny lub instrukcja ochronna służy do sprawdzania warunków wstępnych integralności używanych w celu uniknięcia błędów podczas wykonywania.
Używa
Typowym przykładem jest sprawdzanie, czy odwołanie, które ma zostać przetworzone, nie jest puste, co pozwala uniknąć błędów związanych ze wskaźnikiem zerowym.
Inne zastosowania obejmują użycie pola boolowskiego dla idempotencji (więc kolejne wywołania są nopami), jak we wzorcu utylizacji .
public string Foo ( string username ) { if ( username == null ) { throw new ArgumentNullException ( nameof ( username ), "Username is null." ); } // Pozostała część kodu metody znajduje się tutaj... }
Bardziej spłaszczony kod z mniejszą liczbą zagnieżdżeń
Strażnik zapewnia wczesne wyjście z podprogramu standardowego i jest powszechnie stosowanym odstępstwem od programowania strukturalnego , usuwającym jeden poziom zagnieżdżenia i skutkującym bardziej spłaszczonym kodem: zamiana if guard {...}
na if not guard: return; ...
.
Używanie klauzul ochronnych może być techniką refaktoryzacji w celu ulepszenia kodu. Ogólnie rzecz biorąc, mniej zagnieżdżania jest dobre, ponieważ upraszcza kod i zmniejsza obciążenie poznawcze.
Na przykład w Pythonie:
# Ta funkcja nie ma klauzuli ochronnej def f_noguard ( x ): if isinstance ( x , int ): #kod #kod #kod return x + 1 else : return Brak # Równoważna funkcja z klauzulą ochronną. Zauważ, że większość kodu jest mniej wcięta, co jest dobre def f_guard ( x ): if not isinstance ( x , int
): powrót Brak #kod #kod #kod powrót x + 1
Terminologia
Termin ten jest używany w specyficznym znaczeniu w językach programowania APL , Haskell , Clean , Erlang , occam , Promela , OCaml , Swift , Python od wersji 3.10 i Scala . [ Potrzebne źródło ] W Mathematice strażnicy nazywani są ograniczeniami . Strażnicy są podstawową koncepcją w Guarded Command Language , języku metod formalnych . Osłony mogą być użyte do zwiększenia dopasowania wzoru z możliwością pominięcia wzoru, nawet jeśli struktura pasuje. Wyrażenia boolowskie w instrukcjach warunkowych zwykle również pasują do tej definicji strażnika, chociaż nazywane są warunkami .
Matematyka
W poniższym przykładzie Haskella strażnicy występują między każdą parą „|” i "=":
0
f x | x > = 1 | inaczej = 0
Jest to podobne do odpowiedniego zapisu matematycznego:
W tym przypadku strażnicy są w klauzulach „jeśli” i „w przeciwnym razie”.
Wielu strażników
Jeśli jest kilku strażników równoległych, zwykle są oni sprawdzani w kolejności od góry do dołu i wybierana jest gałąź, która przejdzie jako pierwsza. Strażnicy na liście spraw są zazwyczaj równolegli.
Jednak w rozumieniu list Haskella strażnicy są szeregowi i jeśli któryś z nich zawiedzie, element listy nie jest tworzony. Byłoby to to samo, co połączenie oddzielnych strażników z logicznym AND , z wyjątkiem tego, że wśród strażników mogą istnieć inne klauzule rozumienia listy.
Ewolucja
Proste wyrażenie warunkowe, obecne już w CPL w 1963 r., ma strażnika na pierwszym podwyrażeniu i drugie podwyrażenie do użycia w przypadku, gdy nie można użyć pierwszego podwyrażenia. Niektóre typowe sposoby pisania tego:
(x>0) -> 1/x; 0x>0? 1/x : 0
Jeśli drugie wyrażenie podrzędne może być kolejnym prostym wyrażeniem warunkowym, możemy podać więcej alternatyw do wypróbowania przed ostatnim przejściem :
(x>0) -> 1/x; (x<0) -> -1/x; 0
W 1966 r. ISWIM miał formę wyrażenia warunkowego bez obowiązkowego przypadku odrzucenia, oddzielając w ten sposób straż od koncepcji wyboru albo-albo. W przypadku ISWIM, jeśli żadna z alternatyw nie mogła być użyta, wartość miała być undefined , która została zdefiniowana tak, aby nigdy nie była obliczana jako wartość.
KRC , „zminiaturyzowana wersja” SASL (1976), był jednym z pierwszych języków programowania, w którym użyto terminu „strażnik”. Jego definicje funkcji mogą mieć kilka klauzul, a ta, która ma zostać zastosowana, została wybrana na podstawie strażników następujących po każdej klauzuli:
0
fac n = 1 , n = = n * fac ( n - 1 ), n > 0
Użycie klauzul ochronnych i terminu „klauzula ochronna” datuje się przynajmniej na praktykę Smalltalk w latach 90. XX wieku, skodyfikowaną przez Kenta Becka .
W 1996 roku Dyalog APL przyjął alternatywny, czysto funkcjonalny styl, w którym osłona jest jedyną strukturą kontrolną. Ten przykład w APL oblicza parzystość liczby wejściowej:
parzystość ← { 2 ∣ ⍵ : 'nieparzysty' 'parzysty' }
Strażnik wzoru
Oprócz osłony dołączonej do wzorca, osłona wzorca może odnosić się do użycia dopasowania wzorca w kontekście osłony. W efekcie dopasowanie wzorca oznacza pas. To znaczenie zostało wprowadzone w propozycji dla Haskella przez Simona Peytona Jonesa zatytułowanej Nowe spojrzenie na strażników w kwietniu 1997 roku i zostało wykorzystane przy realizacji propozycji. Funkcja zapewnia możliwość stosowania wzorców w osłonach wzorca.
Przykład w rozszerzonym Haskell:
niezgrabne środowisko var1 var2 | Just val1 <- wyszukaj env var1 , Just val2 <- wyszukaj env var2 = val1 + val2 -- ...inne równania dla clunky...
Brzmiałoby to: „Niezgrabne dla środowiska i dwóch zmiennych, w przypadku gdy wyszukiwania zmiennych ze środowiska dają wartości , jest sumą wartości.…” Podobnie jak w przypadku rozumienia list , strażnicy są szeregowi i jeśli którykolwiek z nich zawiedzie, gałąź nie jest zajęta.
Zobacz też
Linki zewnętrzne
- Guard in Free On-Line Dictionary of Computing - FOLDOC , Denis Howe (redaktor).
- Klauzula ochronna , WikiWikiWeb
- Raport Haskella 98 , rozdział 3 Wyrażenia .
- The Mathematica Book, sekcja 2.3.5 Nakładanie ograniczeń na wzorce
- Podręcznik użytkownika systemu kompilacji Glorious Glasgow Haskell , wersja 6.4, sekcja 7.3.2. Strażnicy wzorów