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