Design by Contract, Exceptions, Initialisering. Objekt-orienterad programmering och design (DIT952) Johannes Åman Pohjola, 2017

Relevanta dokument
Design by Contract, Exceptions. Objekt-orienterad programmering och design (DIT953) Johannes Åman Pohjola, 2018

Classes och Interfaces, Objects och References, Initialization

Undantag, Sammanfattning och Tentamensinfo. Objekt-orienterad programmering och design Alex Gerdes, 2016

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Undantag, Sammanfa,ning och Tentamensinfo. Objektorienterad programmering och design Alex Gerdes, 2018

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Föreläsning 6. Använd beskrivande namn

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

OOP Objekt-orienterad programmering

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Felhantering TDDD78, TDDE30, 729A

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Att skriva till och läsa från terminalfönstret

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Föreläsnings 9 - Exceptions, I/O

Rekursion. Koffman & Wolfgang kapitel 5

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Föreläsning 6. Eleganta metoder Separation of concern Command-Query Separation Principle Kontraktbaserad design Självdokumenterande kod

1 Comparator & Comparable

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Programmering fortsättningskurs DIT950

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Testning av program. Verklig modell för programutveckling

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

Kopiering av objekt i Java

Fördjupad Java. Undantagshantering. Fel

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Föreläsning 6. Eleganta metoder Separation of concern Command-Query Separation Principle Kontraktbaserad design Assertions Självdokumenterande kod

Klassen javax.swing.timer

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

OOP Objekt-orienterad programmering

Felsökning, UML. Översikt. Java starkt typat. Typomvandling (casting) Exempelhierarki. Stark typning

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Föreläsning 8: Exempel och problemlösning

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Recitation 4. 2-D arrays. Exceptions

Lösningsförslag till tentamen

Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Objektorienterad programutveckling, fk

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Kap J 7-1 Mer om arv. (superklass) (subklass)

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Föreläsning 14. Filhantering

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen LÖSNINGSFÖRSLAG

Testning och felhantering

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Hos vad? och bör därför vara instanseller klassvariabel i vilken klass?

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Lösningar för tenta 2 DAT043,

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Objektorienterad programmering

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Institutionen för datavetenskap HT /2008. Testning med JUnit

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

DAT043 Objektorienterad Programmering

Länkade strukturer, parametriserade typer och undantag

Klasshierarkier - repetition

Lösningsförslag till tentamen

Transkript:

Design by Contract, Exceptions, Initialisering Objekt-orienterad programmering och design (DIT952) Johannes Åman Pohjola, 2017

Design by Contract Designfilosofi där en metods specifikation betraktas som ett kontrakt mellan anroparen och metoden. Om du lovar att ge mig två positiva heltal, lovar jag att ge tillbaka deras största gemensamma delare.

Design by Contract Förvillkor (precondition): ett predikat som måste gälla för att metoden ska få anropas. Eftervillkor (postcondition): ett predikat som måste gälla efter att metodanropet är fullbordat, givet att förvillkoret gällde innan. (Klass)invariant: ett predikat som måste gälla för att en klass ska vara i ett välformat tillstånd.

Design by Contract Med metodkontrakt får vi: Resonera om korrekthet Abstraktion (jämför Dependency Inversion Principle) Ansvarsfördelning Precis formulering av Liskov Substitution Principle

Korrekthet by Contract En metod är korrekt, dvs uppfyller sin specifikation, om: För varje anrop som uppfyller förvillkoret så resulterar anropet i att eftervillkoret uppfylls, och Om klassinvarianten var sann innan anropet är den också sann efteråt. Möjliggör formell verifiering: att bevisa programmet korrekt. Begränsning: förutsätter att specifikationen är korrekt, dvs motsvarar kundens önskemål.

Live code Date.hashCode()

Abstraktion by Contract Den som anropar en metod ska bara behöva känna till dess specifikation; inte dess implementation. Specifikationen måste alltså vara tillräckligt informativ för att ge anroparen meningsfulla garantier. /** * Computes a number based on x and * y. x and y must be positive * @return a number */ public int gcd(int x, int y) { } /** * Computes the gcd of x and y. * x and y must be positive. * @return the greatest common * divisor of x and y */ public int gcd(int x, int y) { }

Abstraktion by Contract Den här specifikationen är för informativ. Oläslig. Låg abstraktionsnivå. Anroparen behöver inte känna till dessa detaljer. Unmaintainable: måste skrivas om ifall vi byter till en annan gcd-algoritm. /** * Computes the gcd of x and y by * by first computing the prime * factorization of x and saving the * prime factors in an array, then * doing the same for y, and then * iterate through the prime factors * of y for each prime factor of x * to compute their common prime * factors, save those in an array, * and compute the product of those. * x and y must be positive. * @return the greatest common * divisor of x and y */ public int gcd(int x, int y) { }

Abstraktion by Contract Depend upon abstractions, not concretions. En bra specifikation håller en hög abstraktionsnivå. Anroparen kan bortse från detaljer som specifikationen inte tar upp (DIP). Metodens implementation kan ändras utan att specifikationen behöver ändras (OCP)....men för mycket abstraktion riskerar att utelämna information som anroparen behöver känna till.

Live code Bags, Ciphers

Ansvar by Contract Den som anropar en metod ansvarar för att förvillkoret är uppfyllt. T ex: den som gör anropet x/y ansvarar för att y!= 0 Metoden ansvarar för att uppfylla eftervillkoret, samt att inte krascha eller kasta exceptions, om anroparen uppfyllde förvillkoret. T ex: / måste returnera kvoten av dess argument, om det andra argumentet inte är 0.

Ansvar by Contract Om förvillkoret är brutet så är metoden, enligt Design by Contractfilosofin, helt ansvarsfri. Vad som helst kan hända! Något katastrofalt...eller oväntat, eller... alldeles alldeles underbart!

Ansvar by Contract Att vi får göra vad som helst, betyder såklart inte att vi borde. Defensiv programmering: helgardera så att programmet kan hantera oförutsedda omständigheter på ett snyggt sätt. Lita inte på att input utifrån uppfyller förvillkoret kontrollera! Använd exceptions för att tydligt signalera feltillstånd till anroparen. Använd assertions för att verifiera att inget vansinnigt händer internt.

Exceptions Ett exception (undantag) i Java är ett objekt som representerar, och innehåller information om, ett fel som uppstått av en eller annan anledning. Ett exception kan kastas (throw). Ett exception kan fångas (catch). När ett exception inträffar innebär det en form av non-local transfer of control. Koden följer inte den normala strukturen, utan kan hoppa till ett catch-block långt bort från där exception kastas.

Error vs Exception Alla former av fel-objekt är i Java sub-klasser till klassen Throwable, som namnet till trots är en klass och inte ett interface. Throwable Error representerar ett fel som inte går att återhämta sig från, exekveringen ska avslutas. E.g. VirtualMachineError Kan fångas, men bör bara fångas för att avsluta programmet på ett snyggt sätt. Exception representerar fel som bör fångas och hanteras, på någon nivå i programmet. Error RuntimeException Exception

Checked vs Unchecked RuntimeException representerar buggar saker som inte borde inträffa och därför inte borde behöva varnas för. E.g. ArrayIndexOutOfBoundsException, IllegalArgumentException Dessa är unchecked, dvs behöver inte deklareras från metoder. Även Error och dess subklasser är unchecked. Alla andra exceptions är checked de representerar saker som vi förväntar oss kommer att inträffa under normal körning undantagsfall, förvisso, men ändå. Dessa måste vi varna användare för. E.g. FileNotFoundException, SQLException RuntimeException Unchecked exceptions Exception Checked exceptions

Checked exceptions För checked exceptions måste vi deklarera, i metoders signaturer, om de kan komma att kasta exceptions av typen i fråga: public String readfile(string filename) throws FileNotFoundException { } En metod som anropar readfile måste antingen fånga FileNotFoundException, eller själv deklarera att den kan komma att kasta samma exception. Kallas exception propagation

Att fånga exceptions public void appendfile(string filename, String str) throws IOException { try { String contents = readfile(filename); contents += str; writefile(filename, contents); } catch (FileNotFoundException e) { createfile(filename); writefile(filename, str); } } Vi fångar en sorts fel Men kan fortfarande orsaka andra sorters IOException, e.g. om vi inte har permission att skriva.

Dokumentera exceptions Det är kutym att dokumentera vilka exceptions som kan kastas under vilka omständigheter, så anroparen vet vad hen bör fånga.

Null "I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years." Tony Hoare (CS giant)

Defensive null checking public void appendfile(string filename, String str) throws IOException { if (filename!= null) { try { String contents = readfile(filename); if (contents!= null) { contents += str; writefile(filename, contents); } } catch (FileNotFoundException e) { createfile(filename); writefile(filename, str); } } else { throw new IllegalArgumentException( ); } } Kontrollera: Att argument till metoden inte är null. Att metoder som anropas inuti metoden inte returnerar null.

Design för exceptions Vid felaktig hantering ( buggar ), kasta ett unchecked exception. Principen Fail fast, fail hard. Returnera aldrig null från metoder kasta checked exception istället. Utgå inte från att andra följer den principen. Lämna aldrig objekt i ett felaktigt state. Om ett exception inträffar i en mutator, använd finally för att återställa till tidigare tillstånd. Kallas Failure Atomicity (jfr rollback för databas-transaktioner).

Assertions Ett assert-statement gör inget om testet returnerar true. Annars kastas ett AssertionError. Behöver aktiveras med flaggan -ea Implicit dokumentation av invarianter och antaganden. Användbart för debugging. Assert:a saker som borde vara omöjliga att bryta mot. Felaktig input är långt ifrån omöjligt! int z = gcd(int x, int y); assert x % z == 0; assert y % z == 0; public class Rational { private int numerator; private int denominator; } private boolean invariant() { return(denominator!= 0); } public void Foo() { assert invariant(); }

Live code Bags

Liskov Substitution Principle Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it. Robert C. Martin If a client thinks he has a reference to an object of type A but actually has a reference to an object of subtype B, there should be no surprises when he sends messages to the object. Principle of least astonishment Dale Skrien

LSP med Design by Contract En formell formulering av Barbara Liskov själv (minus formler): Förvillkor får inte förstärkas i subtypen. Eftervillkor får inte försvagas i subtypen. Subtypen bevarar supertypens invariant. Subtypen möjliggör inga tillståndsförändringar som: vore omöjliga att göra i supertypen, och är observerbara via typernas gemensamma metoder.

LSP med Design by Contract Rectangle är inte en subtyp till Square: invarianten att sidorna är lika långa bevaras inte. MutableSquare är inte en subtyp till MutableRectangle: stärker förvillkoren till metoder som bara ändrar en sida i taget. FIFO-kö är inte en subtyp till FILO-kö: pop()-metoderna har helt olika eftervillkor. Point är inte en subtyp till ImmutablePoint: tillståndsförändringar via move är observerbara via getx() CircleWithMutableRadius är en subtyp till ImmutablePoint: mutation av radien är visserligen omöjlig i supertypen, men sådana mutationer är inte observerbara om vi betraktar cirkeln som en punkt. (Obs: ändå fult: inget is-a-förhållande)

LSP med Design by Contract Följer man LSP så bevaras korrekthet av kovariant typsubstitution! Ett korrekt program förblir korrekt om man byter ut alla förekomster av en typ mot förekomster av en subtyp som följer LSP. (korrekt = följer sitt kontrakt) (förutsätter att klienter beror på specifikationen, inte implementationen)

LSP med Design by Contract Att hålla kontrakt på en hög abstraktionsnivå är att följa OCP! Gör det enklare att definiera subtyper som följer LSP. Subtypens kontrakt kan vara: en konkretisering av supertypens kontrakt, och/eller en utökning av supertypens kontrakt, med starkare eftervillkor och svagare förvillkor.

Live code Bags, Ciphers

Initialisering av objekt När vi anropar en konstruktor sätter vi igång en kedja av händelser, som mynnar ut i att vi får tillbaka ett objekt av typen i fråga. (Detta förutsatt att inga throwables kastas)

Initialisering av objekt 1. Statisk initialisering av klassen ( maskinen startar upp ). static initializer blocks, samt initialisering för static attribut. Görs bara om maskinen inte redan startats av ett tidigare anrop, till konstruktor eller någon static metod (eller användning av static attribut). 2. Anrop till konstruktorn för objektets superklass ( maskinen utgår från tidigare modell ) Explicit anrop till någon super( )-konstruktor måste göras allra först i en konstruktor. Om ingen super-konstruktor anropas explicit, anropas implicit super(). 3. Initialisering av objektet ( maskinen skapar grunden ) Non-static initializer blocks, samt initialisering för non-static attribut. 4. Exekvering av konstruktorn självt ( maskinen färdigställer ) Koden som explicit skrivits i konstruktorn, förutom eventuellt anrop till en super-konstruktor.

Exempel på initialisering public class Init { static String hello = Hello! ; int x = 5; String foo; } Init() { constructorcode(); } Init init = new Init(); ======================== hello = Hello! ; super(); x = 5; foo = null; constructorcode(); Ett anrop av konstruktorn resulterar i 1. static init 2. super 3. object init 4. constructor