Videregående programmering i Java



Relaterede dokumenter
Objektorienterede metoder

Videregående programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Videregående programmering i Java

Videregående programmering i Java

Dag 10 Flertrådet programmering

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

9.8 Kildekode. side 88. Pakke Klasse Sidenummer. fortsætter..

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Abstrakte datatyper C#-version

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Videregående programmering i Java

Dag 10 Flertrådet programmering

CRMProxy. Installation og opsætning

Forelæsning Uge 3 Mandag

Videregående programmering i Java

Skriftlig eksamen i Datalogi

Forelæsning Uge 6 Mandag

public Set(int size) { this.listelement = new LinkedList<Integer>(); }

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Forelæsning Uge 3 Mandag

Kursus navn: Indledende programmering Kursus nr

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Forelæsning Uge 3 Mandag

Parallelle algoritmer

SWC eksamens-spørgsmål. Oversigt

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Webserverprogrammering

Årsafslutning i SummaSummarum 4

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

A Profile for Safety Critical Java

AU-HR Sharepoint Vejledning Medarbejder indplacering

Note om RMI af Peter Kjærsgaard

VERSION JULI 2013

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Tree klassen fra sidste forelæsning

BRP Kursusintroduktion og Java-oversigt

UNI Login brugeradministration. - fra Lectio til UNI Login

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Software Construction 1 semester (SWC) Spørgsmål 1

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Klasser og nedarvning

Forelæsning Uge 3 Mandag

Eksempel: Skat i år 2000

Det sprogpædagogiske kørekort 2012/2013. Modul 2: Blog for begyndere

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Web- og serverprogrammering

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Singleton pattern i Java

Ordbogsværktøjet mikrov.dk

Tabeller (I) Tabeller

SDB. MySQL Installation Guide

Dansk Ride Forbunds Stævnesystem Netværksopsætning

Brugerguide Integration af erhvervsdata fra NN Markedsata til Microsoft Dynamics NAV 2015

Kursus i OOP og Java

Pia Schiermer, Underviser ved UNI-C og Amtscentrene 2 pia@schiermer.dk

Skolemedarbejder 9. klasse. Brugervejledning Optagelse.dk

Forelæsning Uge 12 Torsdag

Projekt ID. Funktionen anvendes til:

Service i rengøring. Service i rengøring. Daglig erhvervsrengøring

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004

Arbejdsmiljøgruppens problemløsning

Skriftlig eksamen i Datalogi

Spørgsmål og svar om håndtering af udenlandsk udbytteskat marts 2016

Lederadfærdsanalyse II egen opfattelse af ledelsesstil

Borgerens Plan. Innovationspartnerskab til bedre tværsektorielt samarbejde med udgangspunkt i borgeren

Sæt ord pa sproget. Indhold. Mål. November 2012

Dokumentation. Udbyder : sms1919.dk Service : sms-dialog Version : v1.01

Rediger eller opret institutionsmedarbejder på en ungdomsuddannelse

Infrastruktur i primærsektoren

GODE RÅD. Vild med dansk 8 - Sprog der handler. Hvad skal stå hvor i sætningsskemaet? Biled 1 eller biled 2? Hvilke ord hører til samme led?

Objektorienteret Programmering

Forelæsning Uge 2 Torsdag

Spørgeskema på HVAL.DK

Netværksguide. sådan bruger du dit netværk. Danmarks måske stærkeste netværk

Stakke, køer og lidt om hægtede lister

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

FAQ Værd at vide om nyt ForældreIntra

Videregående programmering i Java

Den bedste dåse, en optimeringsopgave

Forelæsning Uge 12 Mandag

Bogstavregning. Formler Reduktion Ligninger Bogstavregning Side 45

Kommuniker: Symbolskrivning 2 Kom godt i gang med tavler 1

Forelæsning Uge 5 Mandag

Forelæsning Uge 5 Mandag

OOP e uge kursusgang: Samtidighed (II) Safety = sikkerhed. Safety

DANMARKS TEKNISKE UNIVERSITET

RMI med BlueJ. Tutorial lavet af Jákup W. Hansen TSU semester 11. desember 2007

Har du ikke tidligere arbejdet, kan du altså tjene op til kr., uden at skulle bekymre dig om, at din pensionsydelse bliver mindre.

Start med at vælge hvilken afdeling der skal laves ændringer i f.eks. fodbold.

Vejledende løsninger

Ældresagen datastue Aktivitetsteltscentret Bavnehøj Nørre Snede Tema: Internettet på ipad. Tema. Internettet. på ipad Opdateret 29.

1. Send Digitalt knappen anvendes til at afsende meddelelsen til de valgte modtagere. (Alt- S)

Anvendelse af metoder - Programmering

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Videregående Programmering for Diplom-E Noter

Transkript:

Videregående programmering i Java Dag 4 objektorienteret design & hyppigt anvendte designmønstre Hyppigt anvendte designmønstre: Proxy, Adapter, Iterator, Facade, Dynamisk Binding Objektorienteret design Udskudt JNI og kald til maskinkode/c/c++ fra Java Udgår Styring af eksterne komponenter (OpenOffice.org / COM) Udskudt Automatiseret afprøvning med JUnit Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Modularitet Programmer er ofte for store og for komplekse til at blive designet og implementeret som ét system. De bør derfor deles op i håndtérbare moduler "Del og hersk" Principper for modulerne: Hvert modul bør have et klart ansvarsområde Modulerne bør have lav kobling indbyrdes

Kohæsion og kobling Kohæsion Hvor relaterede funktionerne, der varetages inden for et modul, er Metoderne i en klasse bør gøre relaterede ting Ergo: Høj kohæsion er godt Kobling Handler om graden af afhængighed, der er mellem modulerne Modulerne bør stort set være uafhængige og kun løst forbundet Ergo: Lav kobling er godt

Ansvarsområder Ansvarsområder for et objekt/modul kan være: At oprette nye objekter eller udføre en beregning At foretage en handling i andre objekter At kontrollere og koordinere aktiviteter i andre objekter At kende private data At kende relaterede objekter At kende ting, som objektet kan beregne Høj kohæsion (sammenhæng eng.: high cohesion) at et objekt har ét overskueligt og let forståeligt ansvarsområde (eller eventuelt flere områder tæt relaterede til hinanden)

Designfase Hvordan skal programmet fungere Redskaber til objektorienteret design Ord til klasser Kollaborationsdiagrammer Klassediagrammer Vi bruger nu 10 minutter til hvert punkt! Fremlæggelse næste gang!

Ord til klasser Tommelfingerregler: Navneord (substantiver) i ental bliver ofte til klasser Klassenavne skal altid være i ental Udsagnsord (verber) bliver ofte til metoder

Kollaborationsdiagrammer Husk ansvarsområder Forskelligt antal => forskellige klasser Tegn (har)relationer på opdaterer fremviser har Regel Blok Blokvindue har tjekker har bruger Raflebaeger Spiller har Spiller Terning er en Computerspiller er en Menneske opdaterer fremviser Turvindue er en DumComputerspiller GraadigComputerspiller

Klassediagrammer To vejs redigering med et UML udviklingsværktøj TogetherJ JDeveloper PoseidonUML

Designmønstre http://www.javacamp.org/designpattern/ http://www.fluffycat.com/java/patterns.html (http://www.jguru.com/faq/patterns)

Designmønstret Adapter Problem: Et system forventer et objekt af en bestemt type (der implementerer et bestemt interface eller arver fra en bestemt klasse), men det objekt, man ønsker at give til systemet, har ikke denne type. Løsning: Definér et Adapter objekt af den type, som systemet forventer, og lad Adapter objektet delegere kaldene videre til det rigtige objekt. En Adapter fungerer som omformer mellem nogle klasser Få et objekt til at passe ind i et system ved at bruge et Adapter objekt, der passer ind i systemet, og som kalder videre i det rigtige objekt

Designmønstret Adapter Eksempel: Få et Opgave objekt omformet til at passe til Threads forventning om et Runnable objekt public class OpgaveRunnableAdapter implements Runnable Opgave opg; OpgaveRunnableAdapter(Opgave o) opg = o; public void run() // Oversæt kald af run() til kald af udfør() opg.udfør();

Designmønstret Adapter Eksempel: Få data (en liste af Kunde objekter) til at passe ind i en JTables forventning om et TableModel objekt import java.util.*; import javax.swing.table.*; public class KundelisteTableModelAdapter extends AbstractTableModel private List liste; public KundelisteTableModelAdapter(List liste1) liste = liste1; public int getrowcount() return liste.size(); public int getcolumncount() return 2; // navn og kredit public String getcolumnname(int kol) return kol==0? "Navn" : "Kredit"; public Object getvalueat(int række, int kol) Kunde k = (Kunde) liste.get(række); return kol==0? k.navn : ""+k.kredit;

Designmønstret Proxy Problem: Et objekt, der bliver brugt af klienten, skal nogen gange bruges lidt anderledes, men ikke altid, så det er uhensigtsmæssigt at ændre i klassen eller i klienten. Løsning: Lav en Proxy klasse, der lader som om, den er det rigtige objekt, og kalder videre i det rigtige objekt. Proxy på dansk "stråmand" eller "mellemmand" Ordet brugtes oprindeligt i banksektoren Internet: En proxy server Oftest ved klienten ikke at den bruger en proxy. Når proxyen bliver kaldt, vil den som regel delegere kaldet videre til det andet objekt, men den kan også vælge f.eks.: at returnere med det samme og udføre kaldet i baggrunden at afvise kaldet (f.eks. ved at kaste en undtagelse) at udføre kaldet på en anden måde (f.eks. anderledes parametre)

Designmønstret Proxy Staklogger: en Stak, der delegerer videre til en anden Stak: Stak s = new Staklogger( new StakMedNedarving2() ); public class Staklogger implements Stak private Stak rigtigestak; public Staklogger(Stak s) rigtigestak = s; public void lægpå(object o) System.out.print("Staklogger: lægpå("+o+")"); rigtigestak.lægpå(o); public Object tagaf() Object o = rigtigestak.tagaf(); System.out.print("Staklogger: tagaf() gav: "+o); return o;

Designmønstret Proxy Uforanderlige samlinger: Collection d = new ArrayList(); d.add("hej"); d.add("med"); d.add("dig"); d = new UforanderligSamling(d); // Her: vores egen implementation // d = Collections.unmodifiableCollection(d) // Her: fra standardbiblioteket // herefter kan dataene ikke mere ændres gennem d... d.add("igen"); // undtagelse opstår I standardbiblioteket findes Collections.unmodifiableCollection(): Uforanderligt Proxy objekt Collections.synchronizedCollection(): Trådsikkert Proxy objekt

public class UforanderligSamling implements Collection, Serializable private Collection c; // til videredelegering Designmønstret Proxy UforanderligSamling(Collection c) if (c==null) throw new NullPointerException(); this.c = c; // videredelegering af kald, der ikke ændrer samlingen c public int size() return c.size(); public boolean isempty() return c.isempty(); public boolean contains(object o) return c.contains(o); public boolean containsall(collection coll) return c.containsall(coll); public String tostring() return c.tostring(); private static void fejl() throw new UnsupportedOperationException("Denne samling kan ikke ændres"); // afvisning af kald, der ændrer samlingen public void clear() fejl(); public boolean add(object o) fejl(); return false; public boolean remove(object o) fejl(); return false; // iteratorer skal afvise ændringer, men ellers fungere som c's iterator public Iterator iterator() return new Iterator() // anonym klasse, der implementerer Iterator Iterator i = c.iterator(); // videredelegering til c's iterator public boolean hasnext() return i.hasnext(); public Object next() return i.next(); public void remove() fejl(); ;

Variationer af designmønstret Proxy Fjernproxy (eng.: Remote Proxy) bruges, når man har brug for en lokal repræsentation af et objekt, der ligger på en anden maskine. Afsnit 16.8.2 Dataforbindelse over netværk er et eksempel på dette. RMI (Remote Method Invocation) beskrevet i afsnit 14.3 anvender også dette princip. Cache fungerer som proxy for et objekt med nogle omkostningsfulde metodekald. I de tilfælde hvor en tidligere cachet returværdi fra metodekaldet kan bruges, foretages kaldet ikke, men den cachede værdi returneres i stedet (se afsnit 16.8.3, Dataforbindelse, der cacher forespørgsler). Adgangssproxy bestemmer, hvad klienten kan gøre med det virkelige objekt (Eksempel: UforanderligSamling). Virtuel Proxy udskyder oprettelsen af omkostningsfulde objekter, indtil der er brug for dem.

Doven Initialisering/Virtuel Proxy public class VirtuelStak implements Stak private Stak rigtigestak; public void lægpå(object o) if (rigtigestak==null) rigtigestak = new StakMedNedarving2(); rigtigestak.lægpå(o); public Object tagaf() if (rigtigestak==null) rigtigestak = new StakMedNedarving2(); return rigtigestak.tagaf(); Fordele og ulemper: Det rigtige objekt kan ikke oprettes endnu, f.eks. fordi det afhænger af andre objekter, der ikke er klar endnu, At oprette det rigtige objekt er dyrt i hukommelses eller CPUforbrug, og det er måske slet ikke sikkert, at programmet kommer til at bruge objektet, så det er en fordel at udskyde oprettelsen. Hver gang objektet skal bruges, skal det først tjekkes, om det rigtige objekt er blevet oprettet.

Designmønstret Iterator Problem: Du er i gang med at lave et system, som andre (klienter) skal anvende, hvor de skal kunne gennemløbe dine data. Du ønsker ikke, at de skal kende noget til, hvordan data er repræsenteret i dit system (f.eks. antal elementer eller deres placering i forhold til hinanden). Løsning: Definér et hjælpeobjekt (en Iterator), som klienten kan bruge til at gennemløbe data i dit system. En Iterator er beregnet til at gennemløbe data En Iterator har som minimum: en metode til at spørge, om der er flere elementer, og en metode til at hente næste element En Iterator bruges i stedet for en tællevariabel. Fordelen ved at definere en Iterator er, at klienten ikke behøver at vide noget om strukturen af de data, der gennemløbes.

public class UforanderligSamling implements Collection, Serializable private Collection c; // til videredelegering Designmønstret Iterator UforanderligSamling(Collection c) if (c==null) throw new NullPointerException(); this.c = c; // videredelegering af kald, der ikke ændrer samlingen c public int size() return c.size(); public boolean isempty() return c.isempty(); public boolean contains(object o) return c.contains(o); public boolean containsall(collection coll) return c.containsall(coll); public String tostring() return c.tostring(); private static void fejl() throw new UnsupportedOperationException("Denne samling kan ikke ændres"); // afvisning af kald, der ændrer samlingen public void clear() fejl(); public boolean add(object o) fejl(); return false; public boolean remove(object o) fejl(); return false; // iteratorer skal afvise ændringer, men ellers fungere som c's iterator public Iterator iterator() return new Iterator() // anonym klasse, der implementerer Iterator Iterator i = c.iterator(); // videredelegering til c's iterator public boolean hasnext() return i.hasnext(); public Object next() return i.next(); public void remove() fejl(); ;

Designmønstret Facade Problem: Et sæt af beslægtede objekter er indviklede at bruge, og der er brug for en simpel grænseflade til dem. Løsning: Definér et hjælpeobjekt, en Facade, der gør objekterne lettere at bruge. En Facade er altså et objekt, der giver en "brugergrænseflade" til nogle andre objekter og dermed forenkler brugen af disse objekter. Eksempel: URL URL er facade til URLConnection Eksempel: Socket og ServerSocket Er to forskellige facader til SocketImpl, der varetager den egentlige netværkskommunikation

Designmønstret Dynamisk Binding Problem: Programmet skal senere kunne udvides til at bruge nogle flere klasser, uden at programmet skal skrives om. Løsning: Definér et fælles interface (eller superklasse) for klasserne, og søg efter egnede klasser på køretidspunktet, indlæs dem og brug dem. Indlæs klasser dynamisk under kørslen, efter at programmet er startet. Dynamisk Binding/ Lænkning (eng.: Dynamic Linkage) Class.forName() Class klassen = Class.forName("java.util.Vector"); Object objektet = klassen.newinstance(); Eksempel: JDBC

Designmønstret Dynamisk Binding public interface Funktion public double beregn(double x); public class Funktion_sin implements Funktion public double beregn(double x) return Math.sin(x); public class FunktionsfortolkerDynBind public Funktion findfunktion(string navn) try // Prøv at indlæse en klasse der hedder f.eks. Funkt Class klasse = Class.forName("Funktion_"+navn); // Opret et objekt fra klassen Funktion f = (Funktion) klasse.newinstance(); return f; catch (Exception ex) ex.printstacktrace(); throw new IllegalArgumentException("ukendt funktion: public class BenytFunktionsfortolkerDynBind public static void main(string arg[]) public Funktion fortolk(string udtryk) FunktionsfortolkerDynBind analysator = new FunktionsfortolkerDynBind(); Funktion f = analysator.fortolk("sin(5*cos(x))"); // endnu ikke implementeret - returner bare noget. System.out.println("f(1)=" + f.beregn(1) return ); findfunktion("sin");