Zasada substytucji Liskov - Liskov substitution principle

Zastępowalność jest zasada programowania obiektowego stwierdzając, że w programie komputerowym , jeśli S jest podtypem T, a następnie obiektów typu T może być zastąpiona z obiektami typu S (czyli obiekt typu T może być podstawiony z dowolny obiekt podtypu S) bez zmiany jakichkolwiek pożądanych właściwości programu (poprawność, wykonane zadanie itp.). Bardziej formalnie, zasada substytucji Liskov ( LSP ) jest szczególną definicją relacji podtypowania, zwanej ( silnym ) podtypowaniem behawioralnym , która została po raz pierwszy wprowadzona przez Barbarę Liskov podczas wystąpienia na konferencji w 1988 roku zatytułowanej Abstrakcja i hierarchia danych . Jest to relacja semantyczna, a nie tylko syntaktyczna, ponieważ ma na celu zagwarantowanie semantycznej interoperacyjności typów w hierarchii, w szczególności typów obiektowych. Barbara Liskov i Jeannette Wing zwięźle opisały tę zasadę w artykule z 1994 roku w następujący sposób:

Wymaganie podtypu : Niech będzie właściwością możliwą do udowodnienia o obiektach typu T . Wtedy powinno być prawdziwe dla obiektów typu S, gdzie S jest podtypem T .

W tym samym papierze, a Liskov Skrzydło szczegółowo ich pojęcie podtypy behawioralnej w przedłużeniu Hoare logiki , który nosi pewne podobieństwo do Bertrand Meyer „s projektu umowy w tym, że uważa interakcję Subtyping z niezbędnych warunków , postconditions i niezmienników .

Zasada

Pojęcie podtypu behawioralnego Liskova definiuje pojęcie substytucyjności obiektów; to znaczy, jeśli S jest podtypem T , to obiekty typu T w programie mogą zostać zastąpione obiektami typu S bez zmiany jakichkolwiek pożądanych właściwości tego programu (np. poprawności ).

Podtypowanie behawioralne jest pojęciem silniejszym niż typowe podtypowanie funkcji zdefiniowane w teorii typów , które opiera się tylko na kontrawariancji typów parametrów i kowariancji typu zwracanego. Podtypy behawioralne są generalnie nierozstrzygalne : jeśli q jest właściwością „metoda dla x zawsze się kończy ”, to program (np. kompilator) nie może zweryfikować, czy jest ona prawdziwa dla pewnego podtypu S z T , nawet jeśli q ma dla T . Niemniej jednak zasada ta jest przydatna w rozumowaniu dotyczącym projektowania hierarchii klas.

Zasada substytucji Liskov nakłada pewne standardowe wymagania na podpisy , które zostały przyjęte w nowszych językach programowania obiektowego (zwykle na poziomie klas, a nie typów; zobacz podtypy nominalne i strukturalne dla rozróżnienia):

  • Kontrawariancja typów parametrów metody w podtypie.
  • Kowariancja typów zwracanych metod w podtypie.
  • Nowe wyjątki nie mogą być zgłaszane przez metody w podtypie, chyba że są podtypami wyjątków zgłaszanych przez metody nadtypu.

Oprócz wymagań dotyczących podpisu podtyp musi spełniać szereg warunków behawioralnych. Są one szczegółowo opisane w terminologii przypominającej metodologię projektowania według umowy , co prowadzi do pewnych ograniczeń dotyczących interakcji umów z dziedziczeniem :

  • Warunków wstępnych nie można wzmocnić w podtypie.
  • Warunki końcowe nie mogą być osłabiane w podtypie.
  • Niezmienniki muszą być zachowane w podtypie.
  • Ograniczenie historii („reguła historii”). Obiekty są uważane za modyfikowalne tylko za pomocą ich metod ( enkapsulacja ). Ponieważ podtypy mogą wprowadzać metody, które nie są obecne w nadtypie, wprowadzenie tych metod może pozwolić na zmiany stanu w podtypie, które nie są dozwolone w nadtypie. Ograniczenie historii zabrania tego. Był to nowy element wprowadzony przez Liskova i Winga. Przykładem naruszenia tego ograniczenia jest zdefiniowanie punktu zmiennego jako podtypu punktu niezmiennego . Jest to naruszenie ograniczenia historii, ponieważ w historii punktu niezmiennego stan jest zawsze taki sam po utworzeniu, więc nie może obejmować ogólnie historii punktu zmiennego . Pola dodane do podtypu mogą być jednak bezpiecznie modyfikowane, ponieważ nie można ich zaobserwować za pomocą metod nadtypu. W ten sposób można zdefiniować okrąg o niezmiennym środku i zmiennym promieniu jako podtyp niezmiennego punktu bez naruszania ograniczenia historii.

Początki

Zasady dotyczące warunków wstępnych i końcowych są identyczne z tymi wprowadzonymi przez Bertranda Meyera w jego książce Object-Oriented Software Construction z 1988 roku . Zarówno Meyer, jak i później Pierre America, który jako pierwszy użył terminu podtypowanie behawioralne , podali teoretyczne definicje niektórych pojęć podtypów behawioralnych, ale ich definicje nie uwzględniały aliasingu, który może występować w językach programowania obsługujących odwołania lub wskaźniki . Uwzględnienie aliasingu było główną poprawą dokonaną przez Liskova i Winga (1994), a kluczowym składnikiem jest ograniczenie historii. Zgodnie z definicjami Meyera i Ameryki, punkt zmienny byłby podtypem behawioralnym punktu niezmiennego, podczas gdy zasada substytucji Liskova tego zabrania.

Krytyka

Chociaż powszechnie stosowana, charakterystyka podtypów behawioralnych jako zdolności zastępowania obiektów podtypów obiektami nadtypów jest błędna. Nie wspomina o specyfikacjach , więc zachęca do nieprawidłowego odczytania, w którym implementacja nadtypu jest porównywana z implementacją podtypu. Jest to problematyczne z kilku powodów, jednym z nich jest to, że nie obsługuje typowego przypadku, w którym nadtyp jest abstrakcyjny i nie ma implementacji. Ponadto, subtelniej, w kontekście obiektowego programowania imperatywnego trudno jest precyzyjnie zdefiniować, co to znaczy uniwersalnie lub egzystencjalnie kwantyfikować nad obiektami danego typu, czy też zastępować jeden obiekt innym. Stosując podtypy, generalnie nie zastępujemy obiektów podtypów obiektami nadtypów, po prostu używamy obiektów podtypów jako obiektów nadtypów. Oznacza to, że te same obiekty, obiekty podtypów, są również obiektami nadtypowymi.

W wywiadzie w 2016 roku sama Liskov wyjaśnia, że ​​to, co przedstawiła w swoim wystąpieniu, było „nieformalną regułą”, że Jeannette Wing zaproponowała później, aby „spróbowali dokładnie ustalić, co to oznacza”, co doprowadziło do ich wspólnej publikacji na temat behawioralnych podtypowanie i rzeczywiście „technicznie nazywa się to podtypowaniem behawioralnym”. Podczas rozmowy nie używa terminologii substytucyjnej do omawiania pojęć.

Zobacz też

Bibliografia

Bibliografia

Ogólne odniesienia

Konkretne referencje

Zewnętrzne linki