Lecture overview -- Keyboard shortcut: 'u'  Previous page: Kontraktbegrebet -- Keyboard shortcut: 'p'  Next page: Ydelse og nydelse i kvadratrods funktionen -- Keyboard shortcut: 'n'  Lecture notes - all slides and notes together  slide -- Keyboard shortcut: 't'  Help page about these notes  Alphabetic index  Course home  Play sound for this page -- Keyboard shortcut: 'y'  Page 15 : 31
Forelæsningsnoter i Objekt-orienteret Programmering
Designkontrakter og ansvarsfordeling
Kontrakter: ydelse og nydelse

En kontrakt indebærer som regel både fordele og forpligtelser. Vi benytter her de lidt poppede, men ganske sigende betegnelser 'ydelse' og 'nydelse'

Figuren udtrykker at der både er forpligtelser (ydelser) og lettelser (nydelser) når man indgår en kontrakt. Vi viser her nydelse og ydelse i forhold til en forsyner klasse og en klient klasse

En operation i klassen lover at opfylde post-betingelsen såfremt klienten kalder operationen med opfyldt prebetingelse. Kontrakten er udtryk for en klar ansvarsfordeling mellem klient og leverandøren. Det er klientens ansvar at undersøge, om prebetingelsen af supplier-operationen er opfyldt. Hvis dette ikke er tilfældet, bliver supplier-operationen ikke kaldt, og der opstår en fejlsituation i klienten. Det er således ikke nødvendigt i kroppen af en operation i leverandør-klassen at teste, om operationens pre-betingelse er opfyldt. Den skal være opfyldt.

Hvis supplier-operationen ikke opfylder sin post-betingelse opstår der en fejlsituation i supplier klassen. Denne klare ansvarsfordeling, og deraf følgende minimale, test af betingelser forud for udførelsen af en operation, står i skarp kontrast til defensiv programmering. Som vi har omtalt går man i defensiv programmering både med livrem og seler i den forstand, at man gerne udfører samme test (f.eks. prebetingelsen) to forskellige steder i programmet, for at forhindre misforståelser om ansvarsfordelingen. I og med at opfyldelse af prebetingelsen er klientens ansvar, skal alle dele af en prebetingelse være tilgængelig for klienterne.