VOOP, 8 april 20021 Refleksion i objekt orienterede programmeringssprog Mandag 8/4 2002 Kasper Østerbye.

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

07 – Kort om OO Introduktion.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Object-Orienteret Programmering og Design. 2 Nordjyllands Erhvervakademi – 2009 Indhold “Classes, objects and object-oriented programming (OOP) play a.
Selve objektet versus referencen til objektet Nedarvning
09 – Arv og polymorfi i java
Hvordan man skriver koden.
01 – Java platform for starters. 2 NOEA2009Java-kursus – Java Platform Introduktion til Java Baggrund Hvad er Java? Faciliteter i Java.
Indledende Programmering Uge 5 - Efterår 2006 Om at udvikle korrekte og pålidelige programmer Susanne Lindros.
FEN IntroJava AAU1 Opsamling: afvikling af Java-programmer Input fra keyboard og fil Fra en prompt Fra BlueJ Fra NetBeans.
FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
GP 9, 10/ Grundlæggende programmering Forår 2002 Forelæsning 9 onsdag 10/ kl. 9:15 – 12:00.
Forelæsning 3.1 Collections Javas for-each løkke
Fundamentale datastrukturer
GP 8, 24/ Grundlæggende programmering Efterår 2001 Forelæsning 8 onsdag 24/ kl. 9:15 – 12:00.
GP 5, 26/ Grundlæggende programmering Efterår 2001 Forelæsning 5 onsdag 26/ kl. 9:15 – 12:00.
Objekter og klasser Rasmus D. Lehrmann DM
GP 6, 13/ Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/ kl. 9:15 – 12:00.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
Uge 14: distribuerede objekter, fjernprocedurekald, RMI Tirsdag: Introduktion Mulige fordele ved distribuerede objekter Introduktion til RMI: - Interfacets.
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
C#: Udtryk og metoder Kilde: Joe Hummel. 2 Nordjyllands Erhvervakademi – 2008 Indhold “With regards to programming statements and methods, C# offers what.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Hvad består en distribueret applikation af ? Processer der kører på hver deres maskine Tråde - 1 eller flere "letvægtsprocesser" per proces Objekter i.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
GP 4, 27/ Grundlæggende programmering Forår 2002 Forelæsning 4 onsdag 27/ kl. 9:15 – 12:00.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Blå gruppe: Søren, Alexander, Torben, Lasse. De 4 vigtige items: - Singelton - Override clone judiciously - Use interfaces only to define type - Prefer.
Forelæsning 7.1 – repetition
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
Variabler, klassevariabler, identitet og lighed, collections
DAIMIIntroducerende Objektorienteret Programmering1 Polymorfi og nedarvning Motivation for arv og “mange former”
 Jens Bennedsen 2001Multimedie programmering10A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
DAIMIIntroducerende objektorienteret programmering4B.1 Typer og tilstand i Java Typer, tilstand, erklæring, variable, primitive datatyper, reference- og.
 Jens Bennedsen 2002Objektorienteret systemudvikling Design -> kode Mapning af et klassediagram til kode.
Klasser og objekter. dIntProg, E08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Jens Bennedsen, 2003Introducerende objektorienteret programmeringinterfaces.1 Interfaces En ren kontrakt.
DAIMIIntroducerende objektorienteret programmeringkd.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
DAIMIIntroducerende objektorienteret programmering4B.1 Grundlæggende og Reference Typer i Java Typer, tilstand, erklæring, reference- og værdi semantik,
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type.
Objektorienteret analyse og design Ó Bennedsen 2001 Design - part Programmering og systemudvikling Lektion 7 Design - part 2.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
 Jens Bennedsen 2001Multimedie programmering3B.1 Specifikationer Betingelser, specifikationer og JavaDoc.
 Jens Bennedsen 2001Multimedie programmering3A.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
Klasser og objekter. dIntProg, F08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
Jesper Mosegaard Multimedie Programmering E2003 MMProg uge44 Java til Lingo Klasser, statements og lister.
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Objecter Introduktion Webintegrator HF1 PHP Object orienteret.
WebApi service x.
Quiz – Uge 4 – torsdag – første time
Klasser og objekter (Afsnit i manualen).
Simpel test-client (javascript) Session og Application data
Quiz – Uge 4 – torsdag – første time
Quiz – Uge 4 – torsdag – første time
Forelæsning Uge 4 – Torsdag
Præsentationens transcript:

VOOP, 8 april Refleksion i objekt orienterede programmeringssprog Mandag 8/ Kasper Østerbye

VOOP, 8 april Mål med denne lektion At give en fornemmelse for hvad refleksion er i programmeringssprog At give en motivation for dets eksistens At give en fornemmelse for hvad man kan gøre med det

VOOP, 8 april Modellering Car color length maxSpeed start() turn(angle) crash() Modellering toString() Hvis man skal opretholde ideen om at objekter modellerer udvalgte aspekter af den virkelighed et system skal repræsentere, så duer det ikke med metoder og andre egenskaber ved objekterne som repræsenterer egenskaber der er knyttet til det at objektet er en entitet i en computer.

VOOP, 8 april Class name superclass fields methods new() toString(obj) Modellering 2 Car color length maxSpeed start() turn(angle) crash() Modellering Ideen er at man laver en model af klasserne. Denne model modellerer så de egenskaber som klasserne har. Modellering Ud fra et symmetri synspunkt, skal der så være en model af modelen’s model osv. Dette gøres ofte ved en ”sløjfe”

VOOP, 8 april Meta klasser Klassen for en klasse kaldes en Metaklasse. Fordi klasserne er modellerede, og dermed tilstede som objekter på køretidspunktet, indeholder programmet ikke blot en model af en udvalgt del af virkeligheden, men også en model af sig selv. Det er denne selv modellering, der giver anledning til betegnelsen refleksion. Forskellige programmeringssprog håndterer dette forskelligt –Klasser er ikke modelleret i sproget. (F.eks. C++) –Klasser er modelleret i sproget, men kan ikke ændres på køretid. (F.eks. Java) –Klasser er modelleret i sproget, og kan ændres på compile tid, men ikke Køretid (F.eks. OpenJava). –Klasser er modelleret, og kan ændres på køretid (F.eks. Smalltalk & CLOS). og nogle prototype implementationer af Java.

VOOP, 8 april Java Java er godt med: Når man erklærer en metode eller attribut static i Java, så svarer det til at man erklærer den i meta klassen. Der er en klasse der hedder Class i java. Klasser i Java er instanser af Class. Man kan så undersøge hvilke metoder en klasse har vha. dens klasse objekt. Man kan sætte metode kald op så man kan kalde en metode hvis navn man kender i en string. Java er noget skammel Java har kun introspektion (man kan kun aflæse, ikke ændre) Java har ikke konstruktører for klasse objekter. Man kan ikke lave subklasser af Class. Java har en indbygget ”new” operation. Altså Car c = new Car(); egentlig burde dette være Car c = Car.new();

VOOP, 8 april Hvad bruger man reflektion til normalt At finde ud af hvilke metoder en klasse har på kørselstidspunkt. –Hvordan virker JUnit? –Hvordan virker en objekt-browser –Debuggere Dynamisk loadning og indkorporering af klasser i et system Enterprise beans forbindelse til database Generel serialisering og unserialisering Debuggere hvor man kan aktivere metoder på objekter Omdefinere hvordan metodekald virker, så man har automatisk distribution for nogle klasser. Skjult persistens. Et objekt læses først op på det tidspunkt man har brug for det. Sprog tilpasning

VOOP, 8 april Eksempel - JUnit JUnit aftesteren gør: 1.tager et klasse navn som input, 2.kalder setUp metoden 3.kalder alle metoder der starter med ”test” 4.rapporterer om test metoder der gav vejl. Det skal være muligt at få fat i en klasse ud fra dens navn som String Det skal være muligt at finde alle metoder i en klasse Det skal være muligt at finde metodernes navne Man skal kunne kalde en metode hvis navn man kun kender som en String

VOOP, 8 april Skaffe en klasse ud fra dens String navn Class myClass = Class.forName(className); Object obj = myClass.newInstance(); public class UnitTester { private Class testClass; private Vector testMethods; private TestCase testObject; public void setClass(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException { testClass = null; testClass = Class.forName(className); testObject =(TestCase) testClass.newInstance(); }

VOOP, 8 april Find alle metoder i en klasse public void getMethods(){ // get the methods in testClass that takes no arguments, and with // a methodName that starts with "test". testMethods = new Vector(); try{ Method[] all = testClass.getMethods(); for (int i = 0; i<all.length; i++){ if ( all[i].getName().startsWith("test") ){ testMethods.add(all[i]); } }catch(SecurityException ahvaba){ }

VOOP, 8 april Kald en metode ud fra et metode objekt Iterator itr = testMethods.iterator(); while ( itr.hasNext() ){ Method m = (Method)itr.next(); try{ m.invoke(testObject, new Object[0]); result += m.getName() + " OK\n"; } catch... }

VOOP, 8 april En test klasse public class EnTestKlasse extends TestClass { public void setUp(){ System.out.println("setUp is activated"); } public void testA(){// OK assert("7 er størst",7>5); } public void testB(){// Falsk assert ("syv er mindst",7<5); } public void testC(){// Failure assert ("Vi kan ikke dividere med 0", 7/0 == 8); }

VOOP, 8 april Klasse diagram for Java objekt model Class ClassLoader AccessibleObject MethodConstructorField Modifer Array Object Membership Instantiation Inheritance

VOOP, 8 april Design mønstre og programmeringsprog I et programmeringssprog har sprog konstruktionerne A, B og C (F.eks. klasser, arv og metoder) Når man en tid har brugt disse konstruktioner, kan man lave mønstre X, Y over brugen af disse konstruktioner. (F.eks. Singleton, Observer og Command). Når man i en tid har brugt disse mønstre vil nogle af dem blive indbyggede som nye programmeringsprogskonstruktioner, eller blive understøttet af klasse biblioteker. Når man en tid har brugt disse nye programmeringssprogskunstruktioner vil man lave mønstre over deres brug. osv.

VOOP, 8 april Design mønstre og programmeringsprog I dag understøttes Singleton i sprog som Beta: Car : {...}; // klasse som i Java myCar // final myCar = new Car(); customCar // ikke i Java Observer mønsteret understøttes i java.util af interface observer og klassen observable. Abstract factory er delvist understøttet i Smalltalk, idet new Car ikke behøver at lave en ny Car, men kan ændres til at instantiere noget andet (typisk en subklasse eller en proxy).

VOOP, 8 april Design mønstre og programmeringsprog Fordele ved at understøtte design mønstre direkte i programmeringssprog og klassebiblioteker. –Man er i meget højere grad tilbøjelig til at benytte noget som oversætteren kan understøtte, end at man selv skal holde styr på detaljerne. –Det er tydeligere at der er benyttet en klasse eller en sproglig konstruktion, end at der er benyttet et mønster. –Oversætteren kan ofte optimere bedre end vi kan som programmører. –Det kan være meget nemmere at benytte mønstret hvis det er støttet af et bibliotek eller sprogkonstruktion

VOOP, 8 april Command mønstret class SimpleCommand { Object receiver; Method action; SimpleCommand ( Object receiver, String methodName ){ this.receiver = receiver; action = findMethod(methodName); } public void execute() { action.invoke( receiver, new Object[0] ); } private Method findMethod( String methodName ) { // næste slide }

VOOP, 8 april findMethod private Method findMethod( String methodName ) { try{ Class receiversClass = receiver.getClass(); Method action = receiversClass.getMethod(methodName, new Class[0]); return action; } catch (NoSuchMethodException uups) { // Handle mispelling } catch ( SecurityException upps ){ // Handle it } return null; }

VOOP, 8 april Skabelse og kald af SimpleCommand Command cmd; cmd = new SimpleCommand( someObject, ”addCustomer” );... cmd.execute();

VOOP, 8 april Proxy’er Et proxy objekt er et objekt der træder i stedet for et andet. Men Alle metoder ser ud som draw. Der er mange forskellige typer data der har behov for at blive behandlet sådan aDocument image anImageProxy fileName realImage anImage data if (realImage == null) realImage = load(fileName); realImage.draw(...) draw(...)

VOOP, 8 april Java proxy class java.lang.reflect.Proxy klassen tilbyder en mekanisme der kan omforme alle kald til et proxy objekt til et generisk kald af en metode der kaldes invoke. Metoden Proxy.newProxyInstance skaber en ny Proxy ud fra tre argumenter: 1)(En class loader – ikke væsentlig) 2)En række interfaces som proxyen skal opfylde 3)En handler, som har til opgave at opfylde interface fra 2.

VOOP, 8 april ImageProxy IDrawable aDocument image anImageProxy fileName realImage anImage data if (realImage == null) realImage = load(fileName); realImage.draw(...) draw(...)

VOOP, 8 april Proxy interface Drawable { void draw(...); void resize(...); void move(...);... } class Document Drawable[] elements;... elements[3] = Proxy.newProxyInstance ( this.getClass().getClassLoader(), Drawable.class, new ImageHandler(”Image2.jpg”) )... elements[3].draw(); } class ImageHandler implements InvocationHandler { private String fileName; private Image anImage; ImageHandler(String fileName){ this.fileName = fileName; } public Object invoke (Object proxy, Method method, Object[] args) { if ( anImage == null ) anImage = loadImage(fileName); method.invoke(anImage, args); } anImage.draw(...)

VOOP, 8 april En log proxy Alle metoder der bliver kaldt på proxyen vil blive lavet om til et kald af en enkelt metode på handleren. invoke(Object proxy, Method method, Object[] args) Metoden er den metode der blev forsøgt kaldt, og args de argumenter der blev givet med. Proxyen er den proxy der modtog det oprindelige kald.

VOOP, 8 april Logging import java.lang.reflect.*; public class LoggerTest { public static void loggingTest(){ Hus etHus = new Hus(); IHus proxyHus = (IHus)(Proxy.newProxyInstance( etHus.getClass().getClassLoader(), new Class[]{IHus.class}, new Logger(etHus) )); proxyHus.setEjer("Hans Hansen"); proxyHus.setGrund(534); System.out.println("Ejer: " + proxyHus.getEjer() ); }

VOOP, 8 april Logging handler import java.lang.reflect.*; public class Logger implements InvocationHandler { Object theRealThing; Logger(Object obj){ theRealThing = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("I am calling " + method.getName()); try{ return method.invoke(theRealThing, args); } finally { System.out.println("I am returning from " + method.getName() ); }

VOOP, 8 april Brug en factory metode til proxy skabelse Proxy.newProxyInstance ( this.getClass().getClassLoader(), Drawable.class, new ImageHandler(”Image2.jpg”) ) Contra new Image(”Image2.jpg”) Den store forskel mellem disse to påvirker klart hvordan klienten ser ud. Der skal derfor laves en factory metode i Image klassen class Image { public static Image create(String fileName){ // lav enten image eller proxy } I klienten bliver det derefter et kald på formen Image.create(”Image2.jpg”) uanset om der anvendes proxy eller ej.

VOOP, 8 april Design overvejelser Problemer ved brug af refleksion Typecheck forsvinder ofte Effektivitet Læsbarhed Virker magisk på nogle Fordele ved reflektion Der er ting der kun kan gøres på denne måde Læsbarhed Det er ret enkelt

VOOP, 8 april OpenJava De eksempler vi indtil nu har set har været introspektive, dvs. at vi haf aflæst hvordan klasser er bygget op, og vi har kaldt eksisterende metoder. Man kunne også forstille sig at man havde mulighed for at manipulere hvordan klasserne er bygget op. Class myCarClass = Car.class.makeSubClass(); myCarClass.addField(Person.class, ”owner”); myCarClass.addMethod(”start”,Void.TYPE, new Class[0]); og lign.

VOOP, 8 april OpenJava public class Hello instantiates VerboseClass { public static void main( String[] args ) { hello(); } public static void hello() { System.out.println( "Hello, world." );} } public class Hello { public static void main( String[] args ) { System.out.println( "main is called." ); hello(); } public static void hello() { System.out.println( "hello is called." ); System.out.println( "Hello, world." ); } } OpenJava benytter sig af compile-time reflektion, hvilket betyder at man har manipulation på oversættelses tidspunkt, mens man kun har introspektion (som i alm. Java) på oversættelses tidspunkt. Det OpenJava gør er at man kan beskrive hvilken metaklasse en klasse skal være instans af. (Her VerboseClass).

VOOP, 8 april OpenJava Metaklassen beskriver hvordan klasse beskrivelsen skal fortolkes. import openjava.mop.*; import openjava.ptree.*; public class VerboseClass instantiates Metaclass extends OJClass { public void translateDefinition() throws MOPException { OJMethod[] methods = getDeclaredMethods(); for (int i = 0; i < methods.length; ++i) { Statement printStatement = makeStatement( "System.out.println( \"" + methods[i] + " is called.\" );" ); methods[i].getBody().insertElementAt(printStatement, 0 ); }

VOOP, 8 april Og hvad så. I en fejlsøgnings situation er det fikst at kunne sætte udskrifter ind alle steder uden at rette i koden om man så kan sige. I stedet for udskrift kunne man sætte en tæller ind, der kikker på hvor ofte en metode er kørt. –Det kunne f.eks. være relevant i forbindelse med aftestning hvor man kunne ønske at sikre sig at alle metoder var prøvet mindst en gang. Man kunne sætte et stop-ur ind først og sidst i metoder. Det kan bruges i forbindelse med performance.

VOOP, 8 april Et andet eksempel: Monitor Når man i Java laver en delt resource skal man huske at bruge synchronized foran alle public metoder. En sådan brug af en klasse kaldes i inden for concurrent programmering for en Monitor. Når vi modellerer en bankkonto, så skal der netop være beskyttet adgang til den. Altså kunne vi lade public betyde at der både er public og syncronized for en monitor. class Konto instantiates Monitor { private double saldo; public void hæv(double beløb){ saldo = saldo – beløb; } public void indsæt(double beløb){ saldo = saldo + beløb; }

VOOP, 8 april Monitor metaklassen import openjava.mop.*; import openjava.ptree.*; public class Monitor instantiates Metaclass extends OJClass { public void translateDefinition() throws MOPException { OJMethod[] methods = getDeclaredMethods(); for (int i = 0; i < methods.length; ++i) { if (! methods[i].getModifiers().has( public )) continue; // Burde sikre os at den ikke er static methods[i].getModifiers().add(OJModifer.SYNCRONIZED); } // Her skulle vi sikre os at der kun er private felter }

VOOP, 8 april Monitor og modellering Fra et modelleringsperspektiv er det der sker her rigtigt. På samme måde som når vi modellerer en bil ved en generel klasse, beslutter vi os her for at en konto skal modelleres ved en speciel type klasse, nemlig monitor. Det ville være forkert hvis Monitor var superklasse, idet Monitor ikke en et begreb i banker (hvis det er betyder det noget andet).

VOOP, 8 april Java udvidelser med OpenJava Man kan udvide med nye modifiers. class Truck extends Car... {... public overriding void turn(double angle){....} } Man kan udvide med nye sproglige konstruktioner 2 steder, umiddelbart før {...} i metoder og klasser. F.eks. –public void hæv(double beløb) pre (saldo+beløb > 0) { saldo = saldo – beløb} –class Car instantiates ComposedObject part body type Body lifts color {....}

VOOP, 8 april Opsummering Fra et modelleringssynspunkt kan man skille det at lave en model af problem området, for de aspekter der har med modellen at gøre som model. Det at der er en objektmodel for javas klasser (og metoder mv.) gør at man kan skrive nogle meget generelle abstraktioner – ikke problem område abstraktioner, men objekt abstraktioner. Man kan bruge meta programmering til visse former for sprog udvidelser. En sprog udvidelse kan betyde at man kan modellere problem området mere direkte. F.eks. –Roller –Monitor –Associationer Brug det med omtanke, det er et slagkraftigt værktøj, og skal ikke bruges i applikationsudvikling.