Relationer mellan objekt

Relevanta dokument
Introduktion. Byggstenar TDBA

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Kopiering av objekt i Java

Introduktion till arv

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

Objektorienterad programmering med Java, Generics

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

Laboration A Objektsamlingar

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorientering. Grunderna i OO

Klasser och objekt. Henrik Johansson. August 20, 2008

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

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

Abstrakta Klasser 2. Kodning är bara en liten del i programvaruutvecklingen 6% 1% 6% Abstrakta Klasser - deklaration. Programutveckling sker i faser

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Laboration 1 - Grunderna för OOP i Java

Inkapsling (encapsulation)

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

Objektorienterad programmering i Java

OOP Objekt-orienterad programmering

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

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 5-6 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Chapter 4: Writing Classes/ Att skriva egna klasser.

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Arv. Objektorienterad och komponentbaserad programmering

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

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

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Classes och Interfaces, Objects och References, Initialization

Föreläsning 13 Innehåll

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

Föreläsning 15: Repetition DVGA02

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Objektorienterad Programmering (TDDC77)

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Objektorienterad Programmering (TDDC77)

Objektorienterad analys och design

Programmering för språkteknologer II, HT2014. Rum

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Modeller, Objekt och Klasser

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

DAT043 Objektorienterad Programmering

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Föreläsning 9: Arv och UML

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen, EDAA20/EDA501 Programmering

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Objekt och klasser - Introduktion

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Konstruktion av klasser med klasser

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

Objektorienterad analys och design

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Föreläsning 4 Innehåll

TDDC77 Objektorienterad Programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningar för tenta 3 DAT043,

Objektorienterad Programmering DAT043

Att bekanta dig med NetBeans programmeringsmiljö och skriva några enkla program med programmeringsspråket Java.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Arrayer. results

Information. Computer

Transkript:

Relationer mellan objekt Att utveckla en applikation När man utvecklar en applikation börjar man självklart inte direkt att programmera. Först måste man analysera problemet och utveckla en design för lösningen. Här följer 4 huvudfaser vid applikationsutveckling. 1. Analysfas: Förstå problemet som ska lösas och kraven på programmet. Vad ska användaren göra med applikationen? 2. Designfas: Skapa en design av programmet. Vilka objekt/klasser kommer att behövas? Hur samverkar dessa objekt? Vilka operationer kommer att behövas i klasserna. 3. Implementationsfas: Realisera designen i något programmeringsspråk. 4. Testning: Uppfyller applikationen kraven från analysfasen? Observera att det är först i det tredje steget, implementationen, som man börjar skriva kod. Att hitta objekt och relationer mellan dessa En viktig del av designfasen är att förstå vilka objekt, och alltså klasser, som behövs samt hur dessa objekt ska samverkar sinsemellan. I det senare fallet talar man om vilka relationer som finns mellan objekten. Ett exempel, kortspel Tänk dig att vi ska skapa en applikation där användaren ska kunna spela ett enkelt kortspel, t.ex. 21, mot datorn. Under analysfasen ska vi skaffa oss en klar beskrivning av vad som händer när spelet spelas. Detta kan vi göra genom att studera ett verkligt 21-spel och sedan överföra det till en situation där en användare spelar mot en dator. Objekt En del av beskrivningen kan se ut som nedan. De substantiv som kan tänkas beskriva blivande objekt i programmet har strukits under. Dealern blandar kortleken och delar ut 2 kort till spelarens hand. Spelaren betraktar korten och beräknar deras totala poäng. Om kortens totala poäng är 21 har spelaren vunnit, om poängen är över 21 har spelaren förlorat. Om poängen är mindre än 21 anger spelaren om hon vill ha fler kort... Här har vi följande kandidater till objekt/klasser: kort, kortlek, hand, spelare, dealer och poäng. Naturligtvis måste man rensa en sådan lista från dubbletter (kandidater som beskriver samma sak), kandidater som inte är relevanta för problemets lösning och kandidater som snarare är datamedlemmar i något objekt än ett objekt i sig (poäng kan vara en datamedlem i klassen som representerar spelaren).

Relationer mellan objekt Det är viktigt att vi kan beskriva vilka relationer som finns mellan objekten. Detta ger oss senare viktig information om operationer som måste definieras i klasserna och också om datamedlemmar som måste definieras. I vårt exempel ser jag följande relationer: Dealern känner till kortleken (för att ta kort) Dealern känner till spelaren (delar ut kort) Kortleken har (består av) 0 till 52 kort Spelaren har ett antal kort Vi beskriver vår lösning, och relationerna, så här långt med en bild. [I de boxar som beskriver klasser anges klassens namn högst upp, under detta datamedlemmar och längst ned metoder. - står för private och + står för public.] Diagrammet följer syntaxen för klassdiagram i Unified Modeling Language, UML, ett generellt språk för modellering av alla typer av system. Det finns 3 huvudtyper av relationer mellan objekt i UML, Association: känner till Aggregat: har, är uppbyggd av Beroende (dependency)

Association En association mellan objekt av typer beskriver att objekten känner till varandra. I vårt fall känner Dealer till Deck för att kunna ta kort ur denna. En association ritas med ett streck mellan klassymbolerna för de aktuella objekten. Man kan ange riktning för associationen som en pil; pilens riktning är riktad mot den klass som tillhandahåller tjänsten, i detta fall Deck som tillhandahåller tjänsten att lämna ut ett kort. Siffran närmast 1 vid associationens anger kardinaliteten, eller multipliciteten, för associationen. Den ska läsas som att ett objekt av typen Dealer associerar till ett och endast ett objekt av typen Deck. Texten på associationssymbolen är en beskrivning av associationen. Aggregat Ett speciellt fall av association är aggregat. Aggregat innebär att en klass, den aggregerande, är uppbyggd av objekt av andra klasser. Aggregat beskrivs ofta med har en eller består av. I vårt exempel består en kortlek av kort; objekt av typen Deck är aggregat av 0 till 52 objekt av typen Deck. Ett aggregat representeras av ett heldraget streck mellan klasserna med en romb vid den aggregerande klassen. Kardinaliteten är alltså 0..52 för Card-objekt i denna relation. Delat aggregat versus komposition Det kan vara bra att skilja på om delobjekten i ett aggregat exklusivt tillhör ett enda aggregat eller inte, komposition respektive delat aggregat. Delat aggregat, shared aggregation Vid delat aggregat är delobjekten som aggregatet består av utbytbara och/eller kan delas mellan, tillhöra, flera aggregat. Relationen mellan Deck och Card ovan är ett exempel på delat aggregat. Ett kort i leken kan ju lämnas ut från denna för att i stället hamna hos en spelare. Delat aggregat anges med en ofylld romb.

Komposition, composite aggragation Vid komposition tillhör delobjekten exklusivt det aggregerande objektet. Delobjekten lämnas aldrig ut till andra objekt, och delobjektens livslängd bestäms av aggregatets livslängd, när aggregatet försvinner gör också delobjekten detta. En bil består av en motor och fyra däck, som bara tillhör denna bil. När bilen försvinner, försvinner också motor och däck. Som synes anges komposition med en fylld romb vid den aggregerande klassen. Dependency, kortvarigt beroende Dependency syftar i UML på att ett objekt är beroende av ett annat. Association och aggregat är exempel på beroenden, men man brukar använda begreppet dependency speciellt vid kortvariga, flyktiga beroenden. Om en klass har en metod där andra objekt används endast under exekveringen av metoden (lokala variabler i metoden snarare än datamedlemmar) är det att betrakta som dependency. T.ex. har de flesta klasser ett beroende till klassen String (via tostring-metoden). En klass med en main-metod där objekt skapas lokalt i main kan sägas ha ett beroende till dessa objekt. Dependency anges med en streckad pil som i exemplet nedan. Operationer, metoder I ett senare skede av designfasen söker vi vilka operationer, metoder, som behövs. Ofta får vi information om dessa operationer från relationerna mellan objekt. Ett exempel i fallet med kortspelet: Dealern blandar kortleken och delar ut 2 kort. Detta ger oss att vi behöver metoderna shuffle och getcard i klassen Deck.

Ett fullständigt klassdiagram för Deck kanske ser ut som nedan. Notera att aggregatet har realiserats med en datamedlem, thecards, av typen Card-array i klassen Deck. Det är vanligt att man inte anger datamedlemmar som representerar en association, eller ett aggregat, inuti klassymbolen. Det framgår ju redan av relationssymbolen att de finns, som i figuren nedan.

Kodexempel i Java Som du nog redan förstått realiseras association och aggregat med datamedlemmar som refererar det/de objekt som relationen pekar mot. I en aggregerande klass finns datamedlemmar som är referenser till de delobjekt som det aggregerande objektet har. I exemplet ovan med kortleken, Deck, kan det se ut så här i källkoden. public class Deck { private Card[] thecards; // Aggregation private int noofcards; /** Create a new deck with 52 cards. */ public Deck() { thecards = new Card[52]; // Create the 52 individual cards...... Exempel på association alternativt delat aggregat Det är vanligt att vi behöver en klass som lagrar en samling av objekt av någon typ 1. Vi har då en klass som har en array av objektreferenser, till de objekt som ska lagras, som datamedlem. I just detta fall är det inte klart om detta ska beskrivas som en association, känner till, eller som ett aggregat, har/består av. Faktum är att i detta fall ser implementationen i Java likadan ut oavsett om vi betraktar relationen som en association eller ett aggregat. I vårt exempel ska vi studera en klass, ListOfAccounts, som har till uppgift att lagra en samling av kontoobjekt, Account. Vi vill att det ska vara möjligt att lägga till kontoobjekt till vår lista och att söka efter ett visst objekt i listan. Se UML-diagrammet nedan. Kardinaliteten (siffrorna på aggregatsymbolen) står för att en kontolista kan innehålla från inget till obegränsat antal konton (0..*). I klassen kommer det att behövas en array med kontoreferenser som datamedlem (av typen Account[]). Vi låter den ha plats för 100 konton initialt. Det behövs också en datamedlem, noofaccs, 1 Det finns visserligen färdiga API-klasser, som ArrayList, men här är poängen att exemplifiera relationer och hur dessa realiseras i kod.

som anger hur många konton som för tillfället finns i listan. Konstruktorn skapar arrayen och sätter noofaccs till 0. public class ListOfAccounts { private Account[] thelist; private int noofaccs; public ListOfAccounts() { thelist = new Account[100]; noofaccs = 0;... Vi lägger till nya objekt i listan med metoden addaccount. Det nya objektet placeras efter det sista i listan och antalet räknas upp ett steg. Innan detta utförs måste vi dock kontrollera om arrayen är full och om så är fallet utöka storleken (det senare görs i hjälpmetoden resize). Så här ser addaccount ut: public void addaccount(account a) { if(noofaccs >= thelist.length) { this.resize(); thelist[noofaccs] = a; noofaccs++; Vi behöver en metod som returnerar en referens till ett sökt konto. Kom ihåg att vi inte kan komma åt inkapslade konton och deras metoder om inte aggregerande klassen själv lämnar ut referenser till dessa. Metoden findaccount tar ett sökt namn (kontoinnehavare) som argument och returnerar en referens till kontot eller, om det inte hittas, null. public Account findaccount(string name) { Account a = null; // initialize String foundname; for(int i = 0; i < noofaccs; i++) { foundname = thelist[i].getname(); if(foundname.equals(name)) { // Not ==! a = thelist[i]; break; return a; Notera att det via den referens som returneras, av metoden findaccount, blir möjligt att ändra i det Account-objekt som finns i ListOfAccounts privata array! Det fullständiga kodexemplet finns på kurssidan. Exempel på komposition, composite aggregation Komposition är ett specialfall av aggregat där delobjekten inte kan delas med andra objekt och där delobjekten försvinner då det aggregerande objektet försvinner.

Betrakta följande situation. Information om studenter ska lagras i ett register. En student har en adress, denna adress modelleras av en separat klass. Studentklassen deklarerar alltså en datamedlem som är en referens till ett adressobjekt, se nedan. Vi vill dock inte att det ska vara möjligt att via metoden getaddress, i klassen Student, ändra den privata adressen. Kom ihåg att detta blir möjligt om vi lämnar ut en referens till den privata datamedlemmen theaddress. Lösningen blir att låta konstruktorn i klassen student själv skapa adressobjektet och sedan aldrig lämna ut en referens till detta. Metoden getaddress skapar en kopia, en klon, av adressobjektet och returnerar en referens till detta. Detta är ett exempel på komposition, composite aggregation. public class Student { private String firstname, lastname; private Address theaddress; public Student (String first, String last, String street, String city) { firstname = first; lastname = last; theaddress = new Address(street, city); // Create the address object public Address getaddress() { // Return a copy (i.e. a clone) return new Address(theAddress.getStreet(), theaddress.getcity());...