Laborationer, moment 4 5

Relevanta dokument
Laborationer, moment 4 5

Laboration 2: Designmönster

Laboration 2: Designmönster

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

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

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

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

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

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Classes och Interfaces, Objects och References, Initialization

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

JAVA Mer om klasser och objektorientering

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

Laboration 1 - Grunderna för OOP i Java

Chapter 4: Writing Classes/ Att skriva egna klasser.

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

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

TENTAMEN OOP

Malmö högskola 2008/2009 CTS

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

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

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

Objektorienterad programmering i Java

Tentamen i Programmering

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Grundläggande programmering med C# 7,5 högskolepoäng

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

Laboration 3, uppgift En klass för en räknare

DAT043 - Föreläsning 7

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

Tentamen Programmering fortsättningskurs DIT950

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

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

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TENTAMEN OOP

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

JAVAUTVECKLING LEKTION 7

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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

DAT043 Objektorienterad Programmering

Tentamen i Objektorienterad modellering och design

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Lösningsförslag övning 2.

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

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

Klasshierarkier - repetition

Tentamen i Objektorienterad modellering och diskreta strukturer

Tentamen, EDAA10 Programmering i Java

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Tentamen i Objektorienterad modellering och design Helsingborg

Kort om klasser och objekt En introduktion till GUI-programmering i Java

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

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

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

TENTAMEN OOP

Tentamen i Objektorienterad modellering och diskreta strukturer

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

Tentamen Nätverksprogrammering Lösningsförslag

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

Laboration 1: Figurer i hierarki

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TENTAMEN. Objektorienterade applikationer CHALMERS. 2018/2019, lp 3 DAT055. Uno Holmer

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

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Enkla variabler kontra referensvariabel

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

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Språkkonventioner och redigering av tal.

Transkript:

2D4135 Objektorienterad programmering, analys och design med Java, 5p, vt 2004 Laborationer, moment 4 5 Detta är andra delen av labkursen. Tag med denna sida till varje redovisning och se till att du får kvittens från din lärare. För din egen skull, spara sidan tills du sett att dina resultat är inrapporterade till Ladok! Namn... Personnr... Moment 4 Designmönster För betyg 3 gör man uppgifterna a, b, c, en av {d, e samt f (5 st). För betyg 4 gör man en uppgift till av d, e, g och h (6 st). För betyg 5 gör man ytterligare en (7 st). a Template... Kvitteras... b Abstract Factory... Kvitteras... c Composite... Kvitteras... d Observer... Kvitteras... e Adapter... Kvitteras... f Strategy... Kvitteras... g Strategy extra... Kvitteras... h Valfritt mönster... Kvitteras... Moment 5 Enkel Klient Godkänt den... Kvitteras... Betyg 4 5... Kvitteras... 1

En tom sida! 2

Moment 4: Designmönster Innehåll Genom designmönster beskriver man beprövade lösningar på vanliga problem som återkommer i olika sammanhang. Varje mönster ges ett (ibland flera) namn. Med hjälp av designmönster i verktygslådan kan designproblem diskuteras på en högre nivå än tidigare och förhoppningsvis lösas snabbare och med säkrare resultat. Det krävs dock en del övning för att bli duktig på designmönster. Vissa är komplicerade och tar tid att bli förtrogen med. Länkar Här är några länkar till information om designmönster. Finns också direkt på kurshemsidan. http://patterndigest.tripod.com http://hillside.net/patterns http://www.mindview.net/books/tipatterns/ Den sista är en on-line bok som tyvärr inte innehåller några UML-diagram. Uppgifter I den här uppgiften ska några enkla, grundläggande och vanliga designmönster studeras i detalj. De ska implementeras och tillämpas på mycket små stiliserade problem. Själva mönstret skall vara i fokus i varje övning och inte få skymmas av detaljer i en komplicerad tillämpning. Till varje mönster ska minst ett testprogram skrivas som visar att det fungerar. Målet med labmomentet är förståelse för designmönstren! 3

a) Template Method I en superklass definieras ett algoritmskelett där detaljer sparas till subklasserna. Skelett-metoden (eller metoderna) anropar metoder som definieras om i subklasserna. Se t.ex. Jia, avsnitt 7.2.2. Animeringsappleten som vi gör i labmoment 1 är ett lite större exempel på detta mönster. Superklass templatemethod() methodx() methody() templatemethod anväder methodx och methody Subklass methodx() methody() Tilläpma Template Method på följade: En engelsk gallon är 4.546 liter och en amerikansk gallon är 3.785 liter. I båda systemen definieras en pint som 1/8 gallon. Skriv en abstrakt klass SIConverter som superklass till de två konkreta klasserna ImperialConverter och USConverter. Skrivmetodenpint() som en template method i den abstrakta klassen. pint() får returnera gallon()/8. Metoden gallon() är abstrakt i superklassen men implementeras i respektive subklass och svarar med hur många liter en gallon är i det aktuella systemet. Skriv ett program som skapar objekt av båda konkreta klasserna och demonstrerar i ett testprogram att det fungerar. Obs! Metoderna ska göra mycket lite, bara returnera ett tal. Endast mönstret ska visas. 4

b) Abstract Factory Implementera en abstrakt klass Human med två konkreta subklasser Man respektive Woman. Använd en abstract factory teknik där instanser skapas enligt följande i Human: public static Human create (String pnr) {/* metodkropp */ pnr är ett personnummer som förutsätts riktigt, ni behöver inte kolla det. Om näst sista siffran i personnumret är udda så ska en instans av Man returneras och annars en instans av Woman. Se också till att det enda sättet att instansiera någon av de konkreta klasserna är via den ovan angivna metoden. Det ska inte gå att kompilera new Man (..) eller new Woman (..) i testprogrammet. Tips: För att att få detta att fungera bör man göra ett eget paket för Human och dess subklasser. Skapa en underkatalog human som också är det paket där de tre klasserna Human, Man och Woman ligger. Inled varje klass med package human; Med hjälp av rätta modifierare på metoder och konstruktorer kan man få den begärda strukturen. Låt testprogrammet ligga på nivån ovanför human. Se också till att testprogrammet på något sätt bekräftar att objekt av rätt typ skapas, t.ex. genom att personer har en String-representation som skrivs ut i testprogrammet. Human Human create(string pnr) Man Woman 5

c) Composite Idén med mönstret Composite är att grupper av objekt ordnade hierarkiskt i en trädstruktur och enstaka konkreta objekt skall kunna behandlas lika. Klassen för grupper Composite och klassen för ett enstaka objekt SomeProduct ärver båda från Product. EnobjektavComposite kan vara godtyckligt komplicerat. Här exemplifierar vi med produkter med pris. Priet för ett Composite objekt beräknas som summan av priserna för delarna där varje del i sin tur kan vara en grupp av objekt. Observera att inga rekursiva metoder ska skrivas, trots att ett Composite objekt blir rekursivt till sin natur. Det rekursiva byggs in i definitionerna av klasser och metoder. Inför redovisningen, rita gärna en bild av den Composite struktur ni skapat. Composite objektet måste bestå av minst 3objekt,varavminst två av dem består av flera objekt. Product float price() 0..* SomeProduct Composite float price float price() float price() parts 6

Om du är nöjd med betyg 3 på labkursen, hoppa över en av d och e d) Observer Implementera en klass Publisher som publicerar trycksaker och en Subscriber som prenumererar på trycksaker. Det räcker att Publisher har en lista (t.ex. ArrayList) där trycksaker representeras av strängar. Använd mönstret Observer för att låta prenumeranter prenumerera på informationen att nya trycksaker tillkommit i publicistens utbud. Alltså, den metod som lägger till nya strängar i trycksakslistan ska också underrätta alla beroende objekt, dvs alla objekt som registrerats som Observers. Detta mönster finns implementerat i Java som standardgränssnittet Observer och standardklassen Observable. Dessa ska användas i uppgiften. 7

e) Adapter En adapter är ett objekt som anpassar gränssnittet mellan två objekt så att det passar båda. Tänk er följande situation: En Client kommunicerar genom gränssnittet ClientInterface med ett Target objekt.target objektet måste bytas ut mot ett objekt av Adaptee som tillhandahåller samma tjänster som Target men via ett annat gränssnitt, nämligen AdapteeInterface. Inget av gränssnitten får ändras, de används i andra sammanhang. <<Interface>> ClientInterface <<Interface>> AdapteeInterface Client Target Adapter Adaptee Adaptee adaptee request() request() specificrequest() Client Adapter Adaptee I en minimal demo implementation av detta kan gränssnitten se ut så här: public interface ClientInterface { public int value (); // Läs värde public void value (int v); // Ändra värde och public interface AdapteeInterface { public int getvalue (); // Läs värde public void setvalue (int v); // Ändra värde Skriv klassen Adaptee som innehåller ett värde som kan sättas och läsas av, klassen Client som sätter och läser värden i sitt target-objekt via gränssnittet ClientInterface. (Obs! Client ska inte implementera ClientInterface). Skriv klassen Adapter som ser till klienten kan använda Adaptee objektet. Observera att klienten inte får känna till klassen Adaptee utan endast gränssnittet ClientInterface.Se även beskrivningen i Jia, avsnitt 10.4.1. Skriv ett testprogram till det hela. 8

f) Strategy Använd mönstret Strategy för att konstruera en räknare till vilken man kan ge ett objekt som definierar startvärde, slutvärde, steg och uppräkningsfunktion. I ett testprogram kan följande rader stå: Incrementor plusett = new ArithmeticIncrementor(1,5,1); Incrementor gångertvå = new GeometricIncrementor(1,1024,2); Counter c1 = new Counter(plusEtt); Counter c2 = new Counter(gångerTvå); c1.count(); c2.count(); Utskrifter kan bli: 1 2 3 4 5 1 2 4 8 16 32 64 128 256 512 1024 I klassen Counter finns en variabel, t.ex. myinc som bundits till det aktuella Incrementor objektet. Metoden count kan då innehålla ungefär while (!myinc.atend()) { System.out.print(myInc.getValue() + " "); myinc.next(); System.out.print(myInc.getValue() + "\n"); Skriv den abstrakta klassen Incrementor, de konkreta klasserna för aritmetisk (+/-) respektive geometrisk (*) uppräkning, klassen Counter samt ett testprogram. Det är tillåtet att ändra detaljer i uppgiften, bara mönstret Strategy används. 9

g) Strategy extra I den föregående uppgiften föreslås att räknarna ska sluta då det aktuella värdet är lika med stopp värdet. Då måste man räkna ut det exakta slutvärdet då man skapar en räknare, räknar man fel så ger count en oändlig repetition. Bättre är att avsluta count då aktuellt värde passerat slutvärdet. Men vad betyder passera? Jo, att värde >= slutvärde om steget är > 0 och att värde <=slutvärde om steget är <0. Ett sätt att lösa detta är förstås att låta metoden atend testa värdet av steget och använda olika tester beroende på stegets tecken. Detta är en lösning som inte är särskilt objektorienterad. En OO-lösning får man om man tillhandahåller jämförelsefunktionen också i ett objekt enligt mönstret Command. Varje Incrementor objektskadåhaettcomparator objekt där det finns en funktion som jämför värde och slutvärde och talar om ifall räknaren är färdig eller ej. Ändra Incrementor klassen så att den har ytterligare en konstruktor, där man utöver de tre talen kan ge ett objekt med en jämförelsefunktion. Låt den tidigare konstruktorn vara kvar men utöka den så att den som default använder ett objekt med jämförelsefunktion som fungerar som den enklare jämförelsen, som bara testar om värde == slutvärde. För att lösa denna uppgift måste alltså ytterligare ett interface skrivas och implementeras av tre olika klasser. Incrementor och dess implementationer måste ändras men inte Counter klassen (om man följt instruktionerna). Testprogrammet bör kunna köras igen men bör sedan utökas för att testa det nya. h) Alternativ extrauppgift Välj något annat designmönster om implementera ett demonstrationsexempel. 10

Moment 5: En enkel klient Välj Uppmuntran eller Primtal Två serverprogram Två serverprogram finns tillgängliga på en dator på Nada. Det ena ger uppmuntrande kommentarer till ditt programmerande och det andra serverar primtal. Båda programmen kör på datorn nada28.nada.kth.se, uppmuntranprogrammet i port 4712 och primtalen i port 4713. Båda programmen börjar med att läsa på sin inström, tolka det första kom kommer där som klientens namn och skriver sedan två rader meddelanden på sin utström, ungefär så här: Hej Anna! Välkommen till PrimeServern. Just nu finns 3 användare. Sedan starten av servern har vi haft 9 besökare. Programmen övergår sedan till att omväxlande läsa på sin inström och skriva på sin utström. När det på inströmmen kommer null, q eller Q så avslutas tråden. Programmen kan ha flera klienter uppkopplade samtidigt genom att varje klient får ett eget trådobjekt med en run-metod. När runmetoden kör klart avslutas tråden och klienten kopplas ned. Det mesta av koden till Muntra servern finns på sid 12, dock lite "hoptryckt" för att få plats på en sida. Prime servern är mycket lik Muntra servern. Vi går (har gått) igenom dem på en lektion. Se lektionsmaterialet! Uppmuntran Varje gång något som ej är ett avslutningskommando läses av servern från inströmmen kommer en uppmuntrande kommentar att skickas ut på utströmmen. Primtal Varje rad som läses av servern tolkas som ett heltal och närmast följande primtal beräknas och skickas till utströmmen. Servern använder enklast möjliga metod för beräkning av primtalen så det kan ta lång tid för stora tal. Upp till åtminstone ca 10 10 är det inga problem. Om man skickar in data som ej kan tolkas som heltal eller om man ger ett för stort heltal så ges svaret -1. Primeservern översätter inkommande text till heltal av typ long. Uppgift Välja ett av dessa serverprogram, skriv ett litet klientprogram som så länge användaren vill upprepar att hämta indata från användaren, skicka till servern, hämta data från servern och presentera för användaren. För betyg 3 Gör textgränssnitt (det räcker inte att koppla sig till servern med telnet, det kan man faktiskt göra utan att skriva något program!) För betyg 4-5 Gör ett grafiskt gränssnitt till klienten. Extra Använd primeservern för att hitta primtalstvillingar. 11

import java.net.*; import java.io.*; import java.util.*; public class Muntra { public static void main(string[] args){ try { ServerSocket sock = new ServerSocket(4712); while (true) { new Tråd(sock.accept()).start(); catch(ioexception e){system.err.println(e); class Tråd extends Thread { static int antaltrådar=0, antalbesökare=0; BufferedReader in; PrintWriter ut; Socket socket; public Tråd(Socket socket) { this.socket = socket; try { in = new BufferedReader (new InputStreamReader(socket.getInputStream())); ut= new PrintWriter(socket.getOutputStream()); catch(ioexception e) {System.err.println(e); public void run() { Random random=new Random(); String[] hand={...; // Här ligger alla uppmuntrande uttalanden. int n = hand.length; try { String namn=in.readline().trim(); ut.println("hej "+ namn + ", välkommen till MuntraServern." + " Just nu finns " + (++antaltrådar) + " användare"); ut.flush(); ut.println("sedan starten av servern har vi haft " + (++antalbesökare) + " besökare\n"); ut.flush(); while(true) { String inrad = in.readline(); if(inrad==null inrad.trim().equalsignorecase("q")) break; ut.println(hand[random.nextint(n)] + " " + namn); ut.flush(); socket.close(); System.out.println("Nu slutade "+namn); antaltrådar--; catch(exception e) {System.err.println(e); 12