Föreläsning 15: Repetition DVGA02
Vad handlar kursen om? Kursen kan i grova drag delas upp i tre delar: 1. Objekt-orienterad programmering 2. Grafiska användargränssnitt 3. Datastrukturer Dessutom genomsyras hela kursen av hur man i olika steg (som analys, design, implementering, testning och underhåll) utvecklar programvara, dvs hur man använder systematik när man utvecklar programvara. 2
Realistisk bild av vattenfallsprocessen (används vid programutveckling) Analys Design Implementering Testning Underhåll 3
Vattenfallsmodellen Specifikation: En beskrivning av problemet i text. Analys: Analysera problemet (tillsammans med potentiella användare) för att förstå problemet (vad ska göras?). Design: Tänk ut hur man ska gå till väga för att lösa problemet, hitta en plan (hur ska det göras?). Resultatet blir en översikt och beskrivning (i text) av komponenterna samt figurer (UML, skärmbilder, etc.). Implementering: Genomför planen genom att konstruera ett program i ett programmeringsspråk. Testning: Se tillbaka. Kontrollera att programmet fungerar som det ska. Underhåll: Rätta till, lägg till. 4
Objektorienterad programmering I kursen använder vi Java som är ett objektorienterat språk. Vad är ett objektorienterat program? Det är ett program som består av en samling delar (kallade objekt) som samarbetar för att genomföra en uppgift. Vad är då objektorienterad programmering? Det är processen att skriva en modell i ett objektorienterat språk genom att definiera de objekt den innehåller och relationerna mellan dem. 5
Hur gör man modeller? Objekt modellerar substantiv : - konkreta ting som buss, apa, bok, etc. - abstrakta ting som möte, kurs, etc. Objekt samarbetar genom att skicka varandra meddelanden om att genomföra viss operationer och genom att svara på sådana meddelanden från andra objekt (dessa motsvaras av verb ). 6
Hur gör man modeller? Sådant ett objekt kan göra kallas ett objekts förmågor (metoder). Dessa motsvaras ofta av verb. Sådant ett objekt känner till kallas dess egenskaper (instansvariabler). Tre typer: - attribut (ofta adjektiv som grön, lång, etc.) - komponenter (ett objekt innehåller eller är sammansatt av sina delar) - associationer till peer objekt (ett objekt känner till sina peer objekt) Vid modellering ska man abstrahera bort detaljer (förenkla). 7
Komplexitet Trots att vi abstraherar bort alla detaljer vi kan kan en modell bli ganska komplex. Objektorienterad programmering erbjuder flera tekniker för att hantera denna komplexitet: - inkapsling (man gömmer vissa saker hos ett objekt som andra objekt inte behöver veta om) - del-hierarkier (samlingen av ett objekt, dess delar, delarnas delar etc.) - arv (om vissa klasser har vissa egenskaper och förmågor som är gemensamma kan vi samla dessa i en klass) 8
Tänk på att: Klasser grupperar ihop liknande objekt. Arv grupperar ihop liknande klasser. Gränssnitt (interface) grupperar ihop klasser efter en viss roll de spelar, exempelvis att förflytta sig. 9
Laboration 1 - Komposition Syftet med laborationen var att: - göra klasser med komponenter (sammansatta objekt) - göra klasser med peer objekt 10
UML-diagram Bowl Iguana - _color: Color - _leftbackleg, rightbackleg: Leg - _fooddish: Bowl - _cage: Cage 2 Leg + Leg() + move(): void Cage + Iguana() + move(): void + eat(): void Klass-diagram för Leguan-klassen och relaterade klasser 11
Java-kod (Leguan-klassen) /** * This class is a very simple model of an iguana. */ public class Iguana { // first model the properties private Color _color; // attributes private Leg _leftbackleg, _rightbackleg; // components private Bowl _fooddish; // peer objects private Cage _cage; // put the constructor second public Iguana(Bowl abowl, Cage acage) { _color = GREEN; _leftbackleg = new Leg(); _rightbackleg = new Leg(); _fooddish = abowl; _cage = acage; } } // put the methods third, for example public void move() { _leftbackleg.move(); _rightbackleg.move(); } 12
Laboration 2 Arv, polymorfism, gränssnitt Syftet med laborationen var att: ge övning i att använda arv ge övning i att göra gränssnitt och klasser som implementerar gränssnitt illustrera polymorfism, dvs hur man definierar instansvariabler som fungerar polymorfiskt 13
Arvshierarki Animal Reptile Mammal Bird Iguana Monkey Penguin Figur 3.1 (s. 101) Swan - UML-notation, träddiagram - arv är en relation mellan två klasser där subklassen ärver alla egenskaper och förmågor av superklassen (och dess superklasser) - arv sparar arbete (jmf. s. 102) - arv är en är -relation (fågel är ett djur) - superclass (parent class, base class, överklass) - subclass (child class, derived class, underklass) - subklassen utvidgar (extends) och specialiserar superklassen - varje klass i Java har exakt en superklass (utom Object); Crow en klass kan ha godtyckligt många subklasser (single inheritance) 14
UML-diagram för gränssnitt <<interface>> Mover Namnval: -er, -able (engelska) Dog Bicycle Planet -are, -bar (svenska) Figur 4.1 (s. 130) 15
Arvspolymorfism För parametrar och variabler gäller att: aktuell typ = deklarerad typ eller någon subklass till den deklarerade typen Exempel: Person person = new Superhero(); SuperHero hero; Skyscraper skyscraper;... hero.leap(skyscraper); TallBuilding Skyscraper Person Superhero Shape Shape shape = new Ellipse(); Ellipse 16
Gränssnittspolymorfism Om den deklarerade typen (för parametrar och variabler) är ett gränssnitt gäller att: aktuell typ = en klass eller subklass till en klass som implementerar gränssnittet Exempel: Mover mover = new Meteor(); mover.move(); <<interface>> Mover Meteor 17
Laboration 3 GUI Syftet med laborationen var att: Ge övning i att göra grafiska användargränssnitt (GUI), dvs - hur man skapar komponenterna i ett GUI, - hur man arrangerar dem i ett fönster och - hur interaktionen med användaren sker. 18
För att göra grafiska användargränssnitt: Måste man veta hur man skapar komponenterna i ett GUI och vilka det finns. De mest grundläggande är JFrame, JPanel, JButton och JLabel. Måste man veta hur man arrangerar komponenterna i ett fönster. Man kan använda sig av Måste man veta hur interaktionen med användaren sker (koppla lyssnare till komponeneterna). 19
Laboration 4 ADT:er och datastrukturer Syftet med laborationen var att: ge övning i att använda abstrakta datatyper (ADT) ge övning i att använda olika datastrukturer ge övning i att använda kontrakt (för- och eftervillkor) ge övning i säker inmatning 20
ADT:er och datastrukturer Dessa två begrepp är kopplade till varandra men de står för olika saker. En ADT (abstrakt datatyp) är just abstrakt och är inte kopplad till något programmeringsspråk eller till implementering. En datastruktur är konkret och till de flesta programmeringsspråk finns en eller flera inbyggda datastrukturer. 21
ADT (abstrakt datatyp) En ADT är en programspråksoberoende beskrivning av en mängd data och operationer på denna data för att lagra, komma åt och manipulera den. Abstrakta datatyper är abstrakta i den meningen att det inte finns definierat hur datan och operationerna är implementerade. Primitiva datatyper som heltal och flyttal har värde och operationer (t.ex. plus, minus, multiplikation och division). Precis som primitiva datatyper har värde och operationer har också abstrakta datatyper det. I objektorienterade programmeringsspråk (som Java) implementeras ADT:er med klasser. 22
ADT (abstrakt datatyp) Exempel på vanliga abstrakta datatyper är: - mängd - sekvens (lista, kö, stack) - träd (binärt sökträd, AVL-träd, B-träd) - graf I lab 3 kom vi i kontakt med ADT:n Memory som är en beskrivning av den data och de operationer (på den datan) som behövs för en miniräknare. Många programmeringsspråk har inbyggda implementationer av vissa ADT:er. Exempelvis finns olika list-implementationer i Java. I Java finns också olika gränssnitt för att underlätta implementerandet av ADT:er. 23
Datastruktur En datastruktur är en samling data (sammanbundna på något sätt) med ett namn och en mängd operationer. Operationerna kan variera från datastruktur till datastruktur men inkluderar metoder för att ge åtkomst till datan. När man implementerar en ADT kan man behöva en datastruktur. En datastruktur kan modellera en abstrakt datatyp. I Java finns flera datastrukturer som modellerar en lista: - Vector (bygger på en array) - ArrayList (bygger på en array) - DefaultListModel (bygger på en Vector) - LinkedList (bygger på länkade noder) 24
Laboration 5 Länkad lista Syftet med laborationen var att: ge övning i att implementera en länkad lista och ge övning i testning _head 25
Laboration 6 Rekursion, datastrukturen träd och filhantering Syftet med laborationen var att: ge övning i att skriva rekursiva metoder ge övning i att implementera datastrukturen träd ge övning i filhantering ge övning i undantagshantering 26
För att använda rekursion krävs: Ett problem som innehåller ett eller flera delproblem som liknar problemet självt. Ett enkelt fall av problemet som är lätt att lösa (utan rekursion). Detta kallas basfallet. Ett sätt att förenkla problemet så att det kommer närmare basfallet. 27
Träd Ett träd är en datastruktur som tillåter oss att modellera sådant som vi inte kan modellera med linjära datastrukturer. Ett datavetenskapligt träd består av noder med pilar emellan. Ett datavetenskapligt träd ritas upp och ner med roten överst. Ett träd representerar både en samling noder och någon form av relation mellan dem. 28