Liskov substitutionsprincip - Liskov substitution principle

Substitutabilitet er et princip i objektorienteret programmering, der angiver, at i et computerprogram , hvis S er en undertype af T, kan objekter af type T erstattes med objekter af type S (dvs. et objekt af type T kan erstattes med ethvert objekt af en undertype S) uden at ændre nogen af ​​programmets ønskelige egenskaber (korrekthed, udført opgave osv.). Mere formelt, det Liskov substitutionsprincippet ( LSP ) er en særlig definition af et undertypisering forhold, kaldet ( stærk ) adfærdsmæssige subtypning , der oprindeligt blev introduceret af Barbara Liskov i en 1988 konference keynote adresse titlen data abstraktion og hierarki . Det er en semantisk snarere end blot syntaktisk relation, fordi den har til hensigt at garantere semantisk interoperabilitet mellem typer i et hierarki, især objekttyper. Barbara Liskov og Jeannette Wing beskrev princippet kortfattet i et papir fra 1994 som følger:

Undertype Krav : Lade være en ejendom bevislig om objekter af typen T . Så skulle være sandt for objekter af typen S , hvor S er en undertype af T .

I samme papir, Liskov og Wing detaljeret deres forestilling om adfærdsmæssige subtypning i en udvidelse af Hoare logik , der bærer en vis lighed med Bertrand Meyer 's design ved kontrakt i, at den anser samspillet mellem undertypisering med forudsætninger , postconditions og invarianter .

Princip

Liskovs forestilling om en adfærdsmæssig undertype definerer en forestilling om substituerbarhed for objekter; det vil sige, at hvis S er en undertype af T , kan objekter af type T i et program erstattes med objekter af type S uden at ændre nogen af ​​de ønskede egenskaber ved dette program (f.eks. korrekthed ).

Adfærdsmæssig undertypning er en stærkere opfattelse end typisk undertypning af funktioner, der er defineret i typeteorien , som kun er afhængig af kontravarians af parametertyper og kovarians af returtypen . Adfærdsmæssig underskrivning er generelt uafgørelig : hvis q er egenskaben "metode til x slutter altid ", er det umuligt for et program (f.eks. En kompilator) at kontrollere, at det er sandt for en undertype S af T , selvom q holder for T . Ikke desto mindre er princippet nyttigt til at ræsonnere om design af klassehierarkier.

Liskov-substitutionsprincippet stiller nogle standardkrav til signaturer, der er blevet vedtaget i nyere objektorienterede programmeringssprog (normalt på klasseniveau i stedet for typer; se nominel kontra strukturel undertypning for sondringen):

Ud over signaturkravene skal undertypen opfylde en række adfærdsmæssige betingelser. Disse er detaljeret i en terminologi, der ligner den for design efter kontraktmetodologi , hvilket fører til nogle begrænsninger for, hvordan kontrakter kan interagere med arv :

  • Forudsætninger kan ikke styrkes i undertypen.
  • Efterbetingelser kan ikke svækkes i undertypen.
  • Invarianter skal bevares i undertypen.
  • Historisk begrænsning ("historikreglen"). Objekter betragtes kun som modificerbare ved hjælp af deres metoder ( indkapsling ). Fordi undertyper kan indføre metoder, der ikke er til stede i supertypen, kan indførelsen af ​​disse metoder muliggøre tilstandsændringer i undertypen, der ikke er tilladt i supertypen. Historisk begrænsning forbyder dette. Det var det nye element, der blev introduceret af Liskov og Wing. En overtrædelse af denne begrænsning kan eksemplificeres ved at definere et muterbart punkt som en undertype af et uforanderligt punkt . Dette er en krænkelse af historisk begrænsning, for i historien om det uforanderlige punkt er staten altid den samme efter skabelsen, så den kan ikke inkludere historien om et foranderligt punkt generelt. Felter tilføjet til undertypen kan dog sikkert ændres, fordi de ikke kan observeres via supertype -metoderne. Således kan man definere en cirkel med uforanderlig centrum og foranderlig radius som en undertype af et uforanderligt punkt uden at krænke historiens begrænsning.

Oprindelse

Reglerne om før- og efterbetingelser er identiske med dem, der blev introduceret af Bertrand Meyer i sin bog fra 1988 Objektorienteret softwarekonstruktion . Både Meyer og senere Pierre America, som var den første til at bruge udtrykket adfærdsmæssig undertypning , gav bevisteoretiske definitioner af nogle adfærdsmæssige undertyper, men deres definitioner tog ikke højde for alias, der kan forekomme i programmeringssprog, der understøtter referencer eller pointer . Under hensyntagen til aliasing var den store forbedring foretaget af Liskov og Wing (1994), og en vigtig ingrediens er historisk begrænsning. Under definitionerne af Meyer og Amerika ville et omskifteligt punkt være en adfærdsmæssig undertype af et uforanderligt punkt, hvorimod Liskov -substitutionsprincippet forbyder dette.

Kritik

Selvom den er meget udbredt, siges karakteriseringen af adfærdsmæssig undertypning som evnen til at erstatte subtype -objekter med supertype -objekter at være mangelfuld. Det nævner ikke specifikationer , så det inviterer til en forkert læsning, hvor implementeringen af supertypen sammenlignes med implementeringen af undertypen. Dette er problematisk af flere grunde, den ene er, at den ikke understøtter det almindelige tilfælde, hvor supertypen er abstrakt og ikke har nogen implementering. Mere subtilt er det i forbindelse med objektorienteret imperativ programmering svært at definere præcist, hvad det vil sige universelt eller eksistentielt at kvantificere over objekter af en given type eller at erstatte et objekt med et andet. Når vi anvender undertypning, erstatter vi generelt ikke undertypeobjekter med supertypeobjekter, vi bruger simpelthen undertypeobjekter som supertypeobjekter. Det vil sige, at det er de samme objekter, undertypeobjekterne, der også er supertypeobjekter.

I et interview i 2016 forklarer Liskov selv, at det, hun præsenterede i sin keynote -adresse, var en "uformel regel", at Jeannette Wing senere foreslog, at de "forsøgte at finde ud af, hvad dette præcist betyder", hvilket førte til deres fælles offentliggørelse om adfærdsmæssige subtyping, og faktisk at "teknisk kaldes det adfærdsmæssig subtyping". Under interviewet bruger hun ikke substitutionsterminologi til at diskutere begreberne.

Se også

Referencer

Bibliografi

Generelle referencer

Specifikke referencer

eksterne links