Programmering 2 eksamensnoter

Størrelse: px
Starte visningen fra side:

Download "Programmering 2 eksamensnoter"

Transkript

1 Programmering 2 eksamensnoter Andreas Troelsen Mathias Bak Bertelsen December 24, 2012 Contents 0.1 Læs dette først! Generelt om mundtlig eksamen Fremlæggelse af patterns Recursive Methods & Data Structures Fibonacci Fraktaler Evaluering af udtryk Dispositionsforslag Dispositionsforslag Class Design & Invariants Klassestruktur Indkapsling Cloning Quality of class interfaces Programming by contract Dispositionsforslag Dispositionsforslag Polymorphism & Interfaces Interfaces Polymorfi Nedarvning Abstract classes Dispositionsforslag Dispositionsforslag Design Patterns Observer Pattern Template Method Pattern Strategy Pattern Composite Pattern Dispositionsforslag Dispositionsforslag

2 5 Inheritance & Abstract Classes Superclass (generel) og subclass (specialiseret) Abstract classes Hvornår er nedarvning ikke en god ide? Dispositionsforslag Dispositionsforslag Exceptions & Files Defensive programming Hvis man ikke har exceptions? Throwable hierakiet Exception handling Error recovery and avoidance File handling Dispositionsforslag Dispositionsforslag The Java Type System and Object Model Typer og værdier Subtype-forhold Wrappers (aka. Snoop Dogg) Enum Type inquiry The Object class - mother of all classes Serialization Generic Types Dispositionsforslag Dispositionsforslag Frameworks & Collections Frameworks og libraries Applets Collections Dispositionsforslag Dispositionsforslag Multithreading Fordele Ulemper Runnable interfacet Selfishness Tilstand interrupt() Race conditions Dispositionsforslag Dispositionsforslag

3 0.1 Læs dette først! Dokumentet er ment som en hjælp til at læse op til eksamen i Programmering 2. Det er på ingen måde komplet, og vi giver ingen garanti for korrektheden af indholdet. Hvis du opdager fejl, eller har forslag til forbedringer, er du mere end velkommen til at skrive til en af os. s findes på forsiden af dokumentet. Dokumentet er opbygget med et kapitel for hvert eksamensemne. Først er der noter til emnet og til sidst to eksempler på dispositioner. Nogle af punkterne i dispositionerne er markeret med fed skrift - det er disse punkter, vi anbefaler, at du skriver på tavlen, efter du har trukket dit emne. 0.2 Generelt om mundtlig eksamen Det er vigtigt at forberede sig godt på emnerne og komme i gang i god tid. Det tager som regel længere tid at forberede sig, end man regner med. En god teknik er at arbejde sammen i grupper af to eller tre personer og fremlægge for hinanden. På denne måde får man feedback med det samme og kan således nå at forbedre sin fremlæggelse inden eksamen. Tag også tid på dine fremlæggelser. Det er vigtigt at tiden passer nogenlunde, så du får sagt alt det, du gerne vil, og at du ikke er færdig efter fem minutter. Øvelse, øvelse, øvelse... og atter øvelse - Holger A. Nielsen. Det kan derudover være en god ide at overvære hinandens eksamener. Aftal med din læsemakker, at I går med ind til hinandens eksamener. På den måde kan I få ekstra feedback på jeres præsentation, og dermed forbedre jer til næste eksamen. Husk på, at skulderklap ikke hjælper ret meget, så man skal kunne tåle at høre, hvad man har gjort galt. Udover at få god feedback finder du også ud af, hvilke spørgsmål censor og eksaminator stiller, og muligvis hvilke emner, der bør undgås. 0.3 Fremlæggelse af patterns Når du skal fremlægge et pattern er det vigtigt at have styr på tre ting: UML-diagrammet for det pågældende pattern skal være helt på plads. Pilene skal tegnes korrekt og der skal være styr på relationerne mellem klasser og interfaces. Det kan være en god ide at tegne dette som noget af det første, da du resten af tiden vil kunne referere til det og kigge på det, hvis du glemmer noget. Hvilket problem dette pattern løser og i hvilke situationer det er relevant at benytte. Dette er skrevet på punktform for hvert pattern i Horstmann-bogen, så det burde ikke være så svært at finde ud af. Et konkret eksempel på brug. Sørg for at have et godt eksempel som du føler dig tryg ved (brug fx afleveringerne, hvis det specifikke pattern er blevet anvendt i en aflevering). Hvis du ikke selv bringer det op kan du risikere at blive spurgt. Det kan være svært at finde på et godt eksempel midt under eksaminationen. 3

4 1 Recursive Methods & Data Structures Rekursive metoder er metoder, som kalder sig selv. Rekursion kan i nogle tilfælde gøre kodestykker meget kortere og være meget lettere at implementere end iteration (fx Koch-kurver). Derimod kan rekursion nemt være meget langsommere, og nogle gange fylde meget mere i hukommelsen, hvis man ikke er varsom. 1.1 Fibonacci Fibonacci-tallene er et godt eksempel på en noget som kan defineres som en rekursiv funktion. Sekvensens definition siger, at hvert nyt tal i sekvensen er summen af de to foregående tal, og de to første tal er begge 1. Kvadrater med sidelængde af disse tal kan sættes op omkring hinanden i spiraler. Sekvensen ser således ud: 1, 1, 2, 3, 5, 8, 13, 21, 34, etc = 2, = 3, = 5, = 8, etc. Rekursivt kan metoden defineres således: { 1 n {1, 0} F n = F n 1 + F n 2 n > 1 Man kan skrive en tilsvarende metode i Java således: public int fib(int n) { if (n == 0 n == 1) return 1; return fib(n-1) + fib(n-2); } Testen for om n er 0 eller 1 kaldes en stopbetingelse. En rekursiv metode bør altid have en stopbetingelse, så man er sikker på, at den ikke fortsætter med at kalde sig selv uendeligt. Rekursive kald giver anledning til visualisering vha. træstrukturer. For et kald til fib(4) laves to yderligere kald, fib(3) og fib(2), og hver af disse kald laver yderligere to kald, etc. Følgende træstruktur viser kaldet til fib(4): fib(4) fib(3) fib(2) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) Bemærk, at fib(2) og fib(0) kaldes to gange, mens fib(1) kaldes tre gange. Dette er et perfekt eksempel på en langsom/ineffektiv implementation, hvor de samme værdier beregnes flere gange. 1.2 Fraktaler Fraktaler er rekursiv grafik. Fraktaler er kurver som aldrig er glat nok til at kunne approximeres med linjestykker. Hvis man zoomer ind på en fraktal vil den altid udfolde sig mere. Velkendte fraktaler inkluderer Mandelbrot-mængden, Sierpinski-trekanter og Koch-linjer. 4

5 En Koch-linje er et linjestykke med et trekantet hak i midten, som gør at hvert linjestykke brydes ned i fire linjestykker, som hver brydes ned i fire linjestykker, osv. Koch-linjen kan defineres rekursivt vha. et tegneobjekt, fx et Crayon objekt c, hvis turn(x) metode drejer objektet x grader, og move(y) tegner en streg af længde y. private void kochline(int order, double len) { // Stopkriterie if (order == 0) c.move(len); } // Rekursionsskridt kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); c.turn(120); kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); Hvis stopbetingelsen ikke er opfyldt vil hvert kald til kochline lave 4 rekursive kald. Det bliver derfor meget hurtigt kompliceret manuelt at gennemløbe sådan en metode, og træstrukturen vil blive meget bred, meget hurtigt. 1.3 Evaluering af udtryk Rekursion kan bruges til evaluering af matematiske udtryk. Man kan have et udtryk som 3+4 5, som ikke beregnes lineært. Her kan man opdele de matematiske udtryk i forskellige elementer. Operatorer Deludtryk, som kan være enten et tal eller endnu et deludtryk 5

6 På den måde vil en metode, fx getvalue(string exp) kalde sig selv rekursivt, hver gang den har brudt et udtryk ned i to deludtryk. Når deludtrykkene til sidst udmunder i tal bliver der langsomt returneret delværdier, indtil hele udtrykket er beregnet. 6

7 1.4 Dispositionsforslag 1 Hvad er rekursion? Fordele: simplere kode, let at implementere Ulemper: adskillige pitfalls Rekursive metoder Fibonacci-tal Rekursionstræer Rekursive datastrukturer Tree, Node, Leaf UML-diagram Visitor Pattern UML-diagram accept(), visitnode() og visitleaf() FileSystemNode-aflevering Sammenlign med Composite Pattern 7

8 1.5 Dispositionsforslag 2 Rekursion vs iteration Stopkriterie og rekursionstilfælde (skriv matematisk notation og kode for fibonacci eller fakultet) Mange problemer er rekursive af natur og derfor simplere at løse på denne måde. Kodens læsbarhed kan også øges markant. Eks. nyttigt til fraktaler (husk dintprog) Kan være (meget!) ineffektivt i forhold til iteration (kan føre til stackoverflow) Tegn kald-træ for fibonacci Tradeoff mellem simplicitet og effektivitet Visitor pattern Referer til afleveringen Tegn UML og forklar hvordan et accept()-kald fungerer Composite pattern 8

9 2 Class Design & Invariants En klasse er en samling af fields og metoder. Ofte bruges klasser som skabeloner, som objekter kan instantieres fra. Nogle klasser kan således betragtes som blueprints, som man kan skabe objekter ud fra. Et velgennemtænkt og godt struktureret klassedesign er meget vigtigt for brugbarhed af klasser. 2.1 Klassestruktur Klasser indeholder typisk nogle fields, en eller flere constructors og en række metoder. Klassens fields udgør dens tilstand, og dens metoder udgør dens interface (klasse-interface). Constructors sørger for at objekter instantieres fra klasser med nogle bestemte værdier for deres fields, dvs. en starttilstand. Metoder er funktioner som kan kaldes på klassen selv (static), eller på individuelle objekter instantieret fra en klasse Utility-klasse: En klasse med en private constructor (kan ikke instantieres), og udelukkende static metoder (fx Math, Collections). 2.2 Indkapsling Visibility modifiers: public/private/protected static Constructors er generelt public. Metoder kan være begge dele. Ofte bruges private metoder som hjælpemetoder til public metoder. (Én gang public, altid public - gælder også for protected) Fields bør altid være private, og objekters/klassers tilstande bør altid tilgås/manipuleres gennem public metoder. Fields og metoder tagged som static er tilgængelige på klassen selv, og alle objekter instantieret fra klassen. Static fields deles mellem alle objekter af klassen. Static metoder (kaldes på klassen) kan kun tilgå static fields. Non-static metoder (kaldes på objekter) kan tilgå både static og non-static fields. Et objekts tilstand (dvs. fields) aflæses gennem accessorer (fx get() metoder), og modificeres gennem mutatorer (fx set() metoder). Objekters tilstande må aldrig modificeres af accessorer (da de så vil være mutatorer), men de må gerne aflæses af mutatorer, så længe der samtidig er en tilsvarende accessor-metode, som aflæser tilstandene uden at ændre på dem. Scanner er et godt eksempel på dårlig stil: Ingen accessor (getcurrent()), så hvis man skal bruge det nuværende element skal man efter kaldet til next() gemme værdien/referencen i en lokal variabel, da next() flytter cursoren ét element frem inden den returnerer et element. Et objekt er mutérbart, hvis dets fields kan manipuleres med enten via direkte adgang (public) eller gennem mutator-metoder. Omvendt kaldes det immutérbart, hvis det kun består af accessor-metoder (fx String), og således ikke kan ændres på, efter det er blevet skabt. Kun immutérbare objekter bør deles mellem andre objekter. 9

10 Mutérbare objekters indre tilstand kan ændres, hvis deres fields af reference-typer returneres direkte af get() metoder (fx ArrayList, HashMap), da sådanne return-values returnerer objekt-referencen, fremfor blot at returnere en simpel værdi (som med primitive typer). Hvis mutérbare objekter skal returneres i get() metoder bør objekterne klones først vha. clone(). På samme måde bør constructors klone eventuelle mutérbare objekter, som de får som parametre. 2.3 Cloning Deep/shallow clone. 2.4 Quality of class interfaces Cohesion: En klasse er cohesive eller sammenhængende, hvis dens metoder alle har at gøre med det samme overordnede emne. Fx en Mailbox-klasse som kun har metoder, som har at gøre med breve/beskeder. Completeness: En klasse er complete eller fuldstændig, hvis den har metoder til ethvert tænkeligt formål indenfor dens scope. Fx Math-klassen, som har en stor mængde metoder til matematiske beregninger (dog ingen metoder til beregning af egentlige brøker, dvs. ikke helt complete). Convenience: En klasse er convenient eller bekvem, hvis simple operationer og opgaver er nemme at løse. Et klasseinterface skal være nemt at bruge, så brugere ikke skal kalde 10 forskellige metoder for at få et simpelt resultat. Clarity: En klasse er clear eller letforståelig, når der ikke kan opstå meget forvirring omkring dens interface. ListIterator s next() og add() metoder er meget analog til hvordan et tekstbehandlingsprogram virker, men dens remove() metode er meget klodset. Dårlig clarity. Consistency: En klasse er consistent hvis dens metoder ikke afviger i fx parameter-syntax. Fx tager Java s GregorianCalendar klasse et månednummer mellem 0 og 11, men et dagnummer mellem 1 og 31, i dens constructor, hvilket er meget fjollet. 2.5 Programming by contract En måde at undgå tunge, performance-sænkende gyldighedschecks. Ved at opstille kontrakter for hvordan metoder må/skal benyttes kan man fralægge sig ethvert ansvar for effekterne af at kalde metoderne med ugyldige parametre (dvs. hvis preconditions ikke er opfyldt). Samtidig kan man garantere at metoden gør hvad den skal (postconditions), hvis preconditions er opfyldte. Preconditions Skal være opfyldt for at metoden kan garantere en korrekt/gyldig kørsel. For at gøre preconditions fair skal kalderen af metoden kunne checke om preconditionen er opfyldt eller ej, før den laver metodekaldet. Man bør ikke kaste exceptions som resultat af uopfyldte preconditions; det er netop pointen med preconditions: hvis ikke du opfylder disse krav, så garanterer jeg intet og du må sejle i din egen sø. Postconditions 10

11 Skal være opfyldt når metoden er fuldført. Invarianter En måde at checke pre- og postconditions er ved at lave assertion-metoder, som checker et objekts fields gyldighed. Assertion-metoderne kaldes efter constructor og efter metoder, og bruges til runtime debugging. 11

12 2.6 Dispositionsforslag 1 Klasser og objekter Hvordan er en klasse opbygget? Tilstand (fields), klasseinterface (metoder) Indkapsling Visibility modifiers (once public, always public) Accessors vs. mutators Mutable vs. immutable Programming by contract Invarianter generelt Preconditions, postconditions JavaDocs, exceptions/returværdier Cloning Deep vs. shallow Java API en, ArrayList Pointer-diagram 12

13 2.7 Dispositionsforslag 2 Indkapsling Regler Mutable Immutable (klasser uden mutators eks. String) Husk at klone før returnering Visibility modifiers En gang public, altid public 1 Ingen public feltvariable! Dette vil resultere i klassen aldrig kan ændre sin interne repræsentation. Benyt altid getters og setters. Kloning Deep / Shallow (tegn og forklar på tavlen) Programming by contract Invarianter - Sand efter constructoren og sand efter enhver metode Preconditions hos subklasser max lige så stærke som hos superklasse Postcondions hos subklasser minimum lige så stærke som hos superklasse Pre- og post skal nemlig overholde Liskov s substitution Throws definerer hvilke exceptions metoden kan smide (lav kodeeksempel) Assertions (kan bruges til at tjekke pre- og postconditions) 1 Når en metode har været public kan den aldrig laves protected eller private. Hvis andre afhænger af denne metode kan ændringen ødelægge deres programmer. 13

14 3 Polymorphism & Interfaces Polymorfi betyder mangeformet, med hvilket der menes evnen for en variabel af type B at udgive sig for at være af type A, hvis A er en supertype til B. Fx kan klasserne Dog og Cat begge udgive sig for at være Animal objekter. 3.1 Interfaces Et interface er en samling metodesignaturer. Dvs. metoder, som ingen krop har. Metoderne er ikke implementerede. En klasse kan implementere et interface, hvilket betyder, at alle interfacets metoder skal implementeres i klassen. Dette betyder, at hvis en klasse implementerer et interface, kan compileren være sikker på, at interfacets metoder eksisterer i klassen. Java-keyword: implements public class Dog implements Animal {... } 3.2 Polymorfi Hvis en klasse implementerer et interface er klassen en subtype til interfacet. Oprettes en variabel a af type Animal kan den indeholde et objekt af en klasse som implementerer Animal interfacet, fx Dog. Nu har variablen a en formel type (Animal) og en aktuel type (Dog). Liskov s substitutionsprincip siger, at et object af en subclass kan benyttes nårsomhelst et objekt af dens superclass forventes. Eksempelvis kan et Manager objekt altid lægges i en Employee variabel, men ikke den anden vej rundt. Da Manager objekter altid er garanteret at have samme metoder og variable (og lidt til) som Employee objekter, er dette netop muligt. På samme måde kan Dog objekter altid lægges i Animal variable. 3.3 Nedarvning is-a forhold: <subclass> is-a <superclass> Java-keyword: extends public class Manager extends Employee {... } Subclasses arver alle metoder og variable fra deres superclass Subclasses kan override deres superclass metoder, dog ikke hvis de er erklæret final Polymorfi bestemmer hvilken metode der kaldes vha. objektets aktuelle type. En Employee variabel kan fx indeholde et Manager objekt (Liskov s substitutionsprincip), og polymorfien sørger for at kalde Manager-objektets overridden metode - hvis en sådan eksisterer. Override-metoder skal have samme metodesignatur (samme return type, samme parametre), som superclassen s metode. Selvom en metode er overridden kan subclasses godt kalde deres superclass version af metoden med keywordet super. Preconditions til overridden metoder må ikke være mere strikse end superclassens preconditions. Hvis ingen preconditions findes i superclassen må subclassens overridden metode heller ikke have preconditions. Postconditions skal omvendt være mindst ligeså strikse. 14

15 En overridden metode må ikke kaste yderligere check exceptions. Subclasses kan kun tilgå private variable gennem get()-metoder, dog kan de tilgå protected variable (en slags intern public ) Nedarvning af classes betyder, at metoder og funktionalitet er tilgængelige med det samme, og principielt behøver man ikke skrive noget yderligere kode for at bruge sin nye subclass. Implementering (implements) af interfaces betyder derimod, at man selv skal supplere koden for hver af de metoder, som interfacet definerer. 3.4 Abstract classes Abstract classes er ikke instansiérbare - dvs. man kan ikke lave objekter af abstract classes. En class tagges som abstract med keywordet abstract. Fx: public abstract class SelectableShape implements SceneShape Eksempel: SelectableShape. Abstract class der implementerer SceneShape interfacet, og som definerer nogle af interfacets metoder, men ikke alle. De metoder som ikke er definerede skal derfor defineres i subclasses (fx CarShape, HouseShape). Abstract classes implementerer typisk noget af funktionaliteten i de interfaces de evt. implementerer, men ikke alt. Resten af metoderne er abstract. Fordele: Man kan lægge al ensartet funktionalitet for flere classes i én superclass, som implementerer et interface, som er nyttigt for disse classes. Ulemper: Classes kan kun extende én superclass, men implementere adskillige interfaces. Refactoring - at omskrive kode så det er bedre eller lettere at forstå. Fx: Extract superclass - Lav en superclass ud fra de fælles features to eller flere classes har. Refactoring adskiller sig fra design patterns idet refactoring handler om at omskrive allerede eksisterende kode, mens design patterns handler om at planlægge sit arbejde så man kan undgå at skulle benytte sig af refactoring. Template method - en metode som flyttes fra subclasses til en superclass, og som kalder primitive operations, som kan være forskellige, i subclasses. Design pattern En templatemethod() er en metode i en abstract class, som kalder abstract methods (dvs metoder som bliver defineret af subclasses som extender denne abstract class). Altså er en templatemethod() en metode, som kalder andre metoder, som ikke endnu er blevet defineret. 15

16 Eksempel: drawselection() i SelectableShape - drawselection() er defineret i SelectableShape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 16

17 3.5 Dispositionsforslag 1 Interfaces Hvad er et interface? Ingen instantiering, ingen implementation Eksempel: public class Hest implements Animal... Polymorfi og nedarvning Hvad er polymorfi? Formel/aktuel type Lisskovs substitutionsprincip Eksempel: public class Manager extends Employee... Abstrakte klasser En slags class-interface hybrid Ingen instantiering, delvis implementation Eksempel: public abstract class Carnivore implements Animal... Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 17

18 3.6 Dispositionsforslag 2 Interfaces Programmør behøver ikke kende egentlige klasser (jvf. Frameworks) Kan implementere mange interfaces modsat nedarvning Visibility modifiers (public, protected, private) private - Bruges som regel til hjælpemetoder public - Bruges til metoder der skal kunne kaldes af andre protected - Kan kun kaldes af subklasser og klassen selv Kan ikke instantieres (kan kun bruges som statisk type) Nedarvning arve metoder fra superklassen super keyword Kan kun nedarve fra én klasse Regler ved nedarvning is-a relationen (<subtype>is a <supertype>) Liskov substitution 2 (en subklasse kan altid indsættes i stedet for en superklasse) Eksempel der overholder Liskov substitution Både is-a og Liskov glæder (Crab extends Animal (fra dintprog) eller JonglerendeKlovn extends Klovn) Kun is-a gælder (Square extends Rectangle 3 ) Preconditions (maks lige så stærke) Postconditions (mindst lige så stærke) Centralisering af kode ved at flytte det op i supertype (referer til aflevering om BankAccount) Polymorfi Flere metoder med samme navn typesystemet sørger for korrekt kald dynamisk/statisk type Hvis man skal modellere cirkusartister har man Linedanser og KanonKonge. Programmøren ved ikke hvilken rækkefølge artisterne skal på scenen så et interface Artist benyttes. Interfacet har metoderne udfør_nummer()og buk().begge klasserne implementerer interfacet og programmøren kan nu håndtere forskellige artister som var de ens. Typesystemet i Java sørger for at metoden bliver kaldt på den rigtige klasse. Altså artist.udfør_nummer()er forskellig alt efter om artist er af typen Linedanser eller KanonKonge. Altså metoden der bliver udført afhænger af den dynamiske type. Det giver bedre muligheder for udvidelse Hvis der skal bruges en ny type artist kan denne blot tilføjes uden videre. Typesystemet sørger for at den korrekte metodeimplementation bliver kaldt. TEMPLATE METHOD pattern 2 Husk at Barbara Liskov er en kvinde 3 Da square er mere restriktiv end rectangle 18

19 Eks. Gå over vejen (menneske og hund) primitive metoder (kig() og gå()) Da hunden har 4 ben går den anderledes end mennesket Den kigger sig nok heller ikke så godt for 19

20 4 Design Patterns Design patterns er guidelines for hvordan man kan designe programmer og klasser. De kan betragtes som generelle løsninger til generelle problemer. Konceptet begrænser sig ikke til datalogi, og blev faktisk opfundet af en arkitekt. Design patterns kan sammenlignes med algoritmer som også er software mønstre, men algoritmer løser beregningsproblemer, mens design patterns løser designproblemer. 4.1 Observer Pattern Hvis et objekt (Subject) starter events (som fx mine data har ændret sig ), som andre objekter (Observers) er interesserede i at vide noget om, kan man bruge OBSERVER mønstret. Stort set alle GUI elementer (fx knapper, checkboxes, slidere) er Subjects i implementationer som følger OBSERVER mønstret. Subject har en samling observer objekter, som bliver tilknyttet med en attach() metode. Når en event sker, meddeler subjectet det til alle observerne. Eksempel: JButtons (Subject) har ActionListeners (Observers). Ofte bruges anonyme klasser i stedet for at lave ConreteObserver klasser: mybutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { // do something } }); 4.2 Template Method Pattern Hvis en algoritme eller metode er brugbar i flere klasser, og kan brydes ned i primitive operationer (som godt kan være defineret forskelligt i de forskellige klasser) kan man bruge TEM- PLATE METHOD mønstret. Metoden eller algoritmen, templatemethod(), flyttes ind i en abstract superclass, sammen med abstract metoder for hver af de primitive operationer, som templatemethod() kalder. Disse primitive operationer defineres IKKE i superclassen, men i subclasses (som extender den abstrakte superclass). Altså er en templatemethod() en metode som kalder andre metoder som ikke endnu er blevet defineret. 20

21 Eksempel: drawselection() i SelectableShape - drawselection() er defineret i Selectable- Shape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 4.3 Strategy Pattern Hvis en klasse kan udnytte forskellige variationer af en algoritme, kan man bruge STRAT- EGY mønstret. LayoutManagers i Java er designet omkring STRATEGY mønstret. Containers (Context, fx JPanel, JFrame) kan udnytte forskellige layout managers (ConcreteStrategy, fx BorderLayout, GridLayout) til at arrangere deres indhold. De forskellige variationer af algoritmen defineres i klasser som implementerer et Strategy-interface. Context-klassen kalder så den rigtige metode på det konkrete Strategy-objekt. Dvs. enhver klasse som implementerer Strategy-interfacet kan benyttes af Context-klassen, men Contextklassen er også afhængig af (dependency) Strategy-interfacet. 4.4 Composite Pattern Hvis man har behov for at kombinere en række primitive objekter i en bundle, som bliver opfattet af klienter som værende et enkelt primitivt objekt selv, kan man benytte COMPOSITE mønstret. Man lader en klasse (Composite) implementere det samme interface som det, de primitive objekter implementerer. Composite-klassen betragtes således af klienter på samme måde som de primitive objekter. Desuden aggregerer Composite-klassen også interfacet, hvilket betyder at den har en samling (fx ArrayList) af primitive objekter. 21

22 Metoderne fra interfacet defineres i Composite-klassen ved at kalde metoderne på hvert af de primitive objekter, som er indeholdt i klassen. De skal selvfølgelig kaldes på en bestemt måde - fx skal en Bundle-klasse som indeholder Item-objekter udregne alle Item-objekternes samlede pris, når getprice() kaldes på Bundle. 22

23 4.5 Dispositionsforslag 1 Design Patterns Hvad er design patterns? Universel kommunikation Komplet pattern: navn, kontekst, løsning og UML-diagram Observer Pattern UML-diagram Subject has-an Observer (implementerer interfacet) Event på Subject kald på Observer Eksempel: JButton og ActionListeners Visitor Pattern UML-diagram accept(), visitnode() og visitleaf() FileSystemNode-aflevering Sammenlign med Composite Pattern Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 23

24 4.6 Dispositionsforslag 2 Det vigtige i dette emne er at du vælger så få at du har tid til at gå i dybden med dem alle, men ikke det er også vigtigt at du kan fylde tiden ud. Hellere have forberedt et pattern for meget end et for lidt. For hvert pattern skal der være styr på UML diagrammet og hvilket problem det løser. Derudover ville det også være fint at kunne give et eksempel på brug. Composite mønstret realiserer at en samling af objekter kan håndteres som et enkelt objekt. (Eks. en dagligvare og en indkøbspose med varer) Adapter et objekt skal bruges af en klasse uden at der ændres på objektet. Objektet implementerer ikke det rigtige interface og skal adaptes til det rigtige interface. En adapter-klasse oprettes som implementerer det rigtige interface og bruger objektets metoder til at realisere de nye metoder Template Method Proxy Relater til frameworks og nævn prototype pattern Hvad: en klasse der kalder primitive metoder på subklasser af et interface og kombinerer disse til en kompleks metode. Hvornår: en algoritme bruges i flere klasser. Algoritmen kan brydes ned til mindre dele. Delalgoritmerne defineres i klasserne. En superklasse kalder de primitive algoritmer i en rækkefølge så det danner den komplekse algoritme. Algoritmen er nu samlet et sted. Hvad: en stand-in klasse for det oprindelige subjekt. Har samme metoder, dog med nogle modifikationer der gør den fordelagtig. Hvordan: en proxyklasse implementerer samme interface som det oprindelige subjekt. Proxyen kalder metoderne på subjektet. 24

25 5 Inheritance & Abstract Classes Nedarvning handler om at lave specialiserede udgaver af allerede eksisterende og mere generelle klasser. Eksempelvis Employee-Manager forholdet diskuteret i Horstmann kap. 6; alle Managers er Employees, men ikke alle Employees er Managers. Managers er specielle typer af Employees, som har ekstra features. 5.1 Superclass (generel) og subclass (specialiseret) is-a forhold: <subclass> is-a <superclass> Java-keyword: extends public class Manager extends Employee {... } En class som er erklæret final kan ikke extendes Alle classes extender Object Subclasses arver alle metoder og variable fra deres superclass Subclasses kan override deres superclass metoder, dog ikke hvis de er erklæret final Polymorfi bestemmer hvilken metode der kaldes vha. objektets aktuelle type. En Employee variabel kan fx indeholde et Manager objekt (Liskov s substitutionsprincip 4 ), og polymorfien sørger for at kalde Manager-objektets overridden metode - hvis en sådan eksisterer. Override-metoder skal have samme metodesignatur (samme return type, samme parametre), som superclassen s metode. Selvom en metode er overridden kan subclasses godt kalde deres superclass version af metoden med keywordet super. Preconditions til overridden metoder må ikke være mere strikse end superclassens preconditions. Hvis ingen preconditions findes i superclassen må subclassens overridden metode heller ikke have preconditions. Postconditions skal omvendt være mindst ligeså strikse. En overridden metode må ikke kaste yderligere check exceptions. Subclasses kan kun tilgå private variable gennem get() metoder, dog kan de tilgå protected variable (en slags intern public ) Nedarvning af classes betyder, at metoder og funktionalitet er tilgængelige med det samme, og principielt behøver man ikke skrive noget yderligere kode for at bruge sin nye subclass. Implementering (implements) af interfaces betyder derimod, at man selv skal supplere koden for hver af de metoder, som interfacet definerer. 5.2 Abstract classes Abstract classes er ikke instansiérbare - dvs. man kan ikke lave objekter af abstract classes. En class tagges som abstract med keywordet abstract. Fx: public abstract class SelectableShape implements SceneShape 4 Liskov s substitutionsprincip siger, at et object af en subclass kan benyttes nårsomhelst et objekt af dens superclass forventes. Eksempelvis kan et Manager objekt altid tildeles en Employee variabel, men ikke den anden vej rundt. Da Manager objekter altid er garanteret at have samme metoder og variable (og lidt til) som Employee objekter, er dette netop muligt. 25

26 Eksempel: SelectableShape. Abstract class der implementerer SceneShape interfacet, og som definerer nogle af interfacets metoder, men ikke alle. De metoder som ikke er definerede skal derfor defineres i subclasses (fx CarShape, HouseShape). Abstract classes implementerer typisk noget af funktionaliteten i de interfaces de evt. implementerer, men ikke alt. Resten af metoderne er abstract. Fordele: Man kan lægge al ensartet funktionalitet for flere classes i én superclass, som implementerer et interface, som er nyttigt for disse classes. Ulemper: Classes kan kun extende én superclass, men implementere adskillige interfaces. Refactoring - at omskrive kode så det er bedre eller lettere at forstå. Fx: Extract superclass - Lav en superclass ud fra de fælles features to eller flere classes har. Refactoring adskiller sig fra design patterns idet refactoring handler om at omskrive allerede eksisterende kode, mens design patterns handler om at planlægge sit arbejde så man kan undgå at skulle benytte sig af refactoring. Template method - en metode som flyttes fra subclasses til en superclass, og som kalder primitive operations, som kan være forskellige, i subclasses. Design pattern En templatemethod() er en metode i en abstract class, som kalder abstract methods (dvs metoder som bliver defineret af subclasses som extender denne abstract class). Altså er en templatemethod() en metode, som kalder andre metoder, som ikke endnu er blevet defineret. Eksempel: drawselection() i SelectableShape - drawselection() er defineret i SelectableShape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 26

27 Protected interfaces protected er en mellemting mellem public og private; kan ses som internt public for alle subclasses til en class, men eksternt private for alle andre classes. Metoder kan kun bruge protected metoder/fields fra objekter af samme class som de ligger i. Fx kan HouseShape ikke kalde add() på en CarShape, selvom de begge extender CompoundShape, som har en protected add() metode. Protected fields bør undgås af samme grund som public fields bør undgås. 5.3 Hvornår er nedarvning ikke en god ide? Nedarvning bruges til is-a forhold. is-a forhold betyder at en class er en specialiseret version af en anden class. Fx, CarShape is a SelectableShape Aggregering bruges til has-a forhold. has-a forhold betyder at en class har et field hvis type er en anden class. Fx, Circle has a Point - Circle classen har et Point objekt som sit centrum. Den er ikke et Point objekt i sig selv. Nedarvning bør ikke bruges, hvis resultatet bryder med Liskov s substitutionsprincip. Fx, Stack<T> extends Vector<T> er en dum idé, da en stack og en vektor ikke har noget med hinanden at gøre. Med en stack kan man kun push og pop elementer på og af, og i LIFO 5 orden. Med en vektor kan man fjerne elementer tilfældige steder i arrayet. 5 LIFO = Last In First Out 27

28 5.4 Dispositionsforslag 1 Nedarvning og polymorfi Hvad er polymorfi? Formel/aktuel type Lisskovs substitutionsprincip Eksempel: public class Manager extends Employee... Abstrakte klasser En slags class-interface hybrid Ingen instantiering, delvis implementation Eksempel: public abstract class Carnivore implements Animal... Refactoring Genbruge kode Fælles kode i abstrakte superklasser Mindre arbejde i underklasser Eksempel: Account-aflevering Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 28

29 5.5 Dispositionsforslag 2 Nedarvning arve metoder fra superklassen visibility modifiers (super keyword) Kan kun nedarve fra én klasse Regler ved nedarvning is-a relationen (<subtype>is a <supertype>) Liskov substitution 6 (en subklasse kan altid indsættes i stedet for en superklasse) Eksempel der overholder Liskov substitution Både is-a og Liskov glæder (Crab extends Animal (fra dintprog) eller JonglerendeKlovn extends Klovn) Kun is-a gælder (Square extends Rectangle 7 ) Preconditions (maks lige så stærke) Postconditions (mindst lige så stærke) Centralisering af kode ved at flytte det op i supertype (referer til aflevering om BankAccount) Polymorfi Flere metoder med samme navn typesystemet sørger for korrekt kald dynamisk/statisk type Eksempel på polymorfi Artist a = new Klovn(); Abstrakte klasser Flere klasser har ens metoder Centralisering af kode tvinge subklasser til at implementere metoder TEMPLATE METHOD pattern Eks. Gå over vejen (menneske og hund) primitive metoder (kig() og gå()) Da hunden har 4 ben går den anderledes end mennesket Den kigger sig nok heller ikke så godt for 6 Husk at Barbara Liskov er en kvinde 7 Da square er mere restriktiv end rectangle 29

30 6 Exceptions & Files Exceptions er en smart måde at håndtere programfejl på. Brug af exceptions betyder, at man kan undgå situationer hvor return-values for metodekald skal valideres på alle mulige måder, fx if (value == -1) eller if (value!= null). Klienter kan samtidig tvinges til at tage handling, hvis der sker fejl. 6.1 Defensive programming Gå ud fra, at programmet bliver afviklet i et fjendtligt miljø med egentlige fjender, men også inkompetente brugere. Check gyldighed af inputs, return-values, etc. 6.2 Hvis man ikke har exceptions? Return-values som fungerer som fejl -values (fx -1, null) Kræver mange if-else-statements, som gør, at det bliver mere uoverskueligt og kompliceret at separere fejlhåndteringskode fra andet kode. Ingen måde at tvinge klienter til at checke om returværdier er gyldige eller ej, så der er en uheldig risiko for, at programmet dermed fortsætter afvikling med ugyldige værdier, som ødelægger andre resultater - eller at programmet crasher. 6.3 Throwable hierakiet Unchecked exceptions (Throwable Exception RuntimeException) Compileren kræver ikke, at unchecked exceptions håndteres, men man kan stadig håndtere dem (try-catch-blok) hvis man vil, på samme måde som med checked exceptions. Bruges til situationer hvor et program kan fejle som resultat af inkompetente programmører på den ene eller anden måde, fx hvis en metode bliver bedt om at hente data fra plads -1 i et array. Dette er en logisk fejl, som sikkert kunne undgås vha. nogle checks. Fx NullPointerException, IllegalArgumentException Checked exceptions (Throwable Exception) Compileren kræver håndtering af checked exceptions (try-catch-blok) Bruges til situationer hvor et program kan fejle som resultat af noget, som programmøren ikke har kontrol over - fx hvis man forsøger at skrive en fil til en disk som er fuld. Fx IOException, FileNotFoundException 6.4 Exception handling For at kaste exceptions bruges throw. Fx throw new IOException() Metoder, som kaster checked exceptions skal i metode-signaturen indeholde throws (bemærk s et) efterfulgt af hvilke typer exceptions som kastes. Fx public void addfile(string filename) throws IOException Metoder som kun kaster unchecked exceptions behøver ingen throws i signaturen, men der er ingen regler imod det. 30

31 Metoder kan kaste exceptions videre (propagate an exception). For checked exceptions skal metoderne have throws i deres signatur, også selvom det ikke er metoden selv som kaster en exception (det kunne være et kald til en anden metode, som netop kaster exceptions). For unchecked exceptions kan throws udelades. Exceptions håndteres ved at beskytte kode, som kan kaste exceptions, med en try-blok, efterfulgt af en catch-blok, som fanger den type exceptions der kan blive kastet fra try-blokken. try { writetofile(file); } catch (IOException e) { System.out.println("Unable to save to " + file); } Catch efterfølges af en parentes indeholdende den type af exception som der ønskes håndteret i den efterfølgende blok. Man kan have flere catch-blokke efter en try-blok, så man kan specificere hvilken type fejl programmet har lavet. catch (Exception e) vil fange ALLE exceptions, da alle exceptions er subtyper til Exception (polymorfi). Det kræves, at en catch-blok, som følger en anden catch-blok, ikke fanger exceptions, som er supertyper til dem der fanges i ovenstående catch-blokke. Fx må catch (Exception e) ikke komme før catch (IOException). try-catch-blokke kan følges af en valgfri finally blok. finally-blokken udføres uanset om der kastes en exception eller ej. Den er ofte udeladt, men kan bruges til oprydningsarbejde. Den er ikke redundant da den også køres selvom der fx er et return-statement i try-blokken. Desuden køres den også selvom en kastet exception ikke bliver fanget af catch-blokken. 6.5 Error recovery and avoidance Man kan indkapsle try-catch-blokken i et loop, hvor man laver en slags retry ved at modificere elementer i catch-blokken. Fx hvis man forsøger at læse en fil som ikke eksisterer, kan man i catch-blokken ændre på filnavnet eller prøve at kigge i nærliggende mapper, inkrementere en attempts integer MAX_ATTEMPTS gange, og så lade try-blokken køre igen. Man kan forsøge at undgå exceptions og errors ved at lave relevante checks på return-values, før man blindt benytter dem. Typisk check if (value!= null) 6.6 File handling Exceptions er meget relevante for filhåndtering, da der er mange tilfælde hvor programmøren ingen kontrol har over det miljø filerne befinder sig i. Typiske filhåndteringsproblemer: Åbne ikke-eksisterende filer. Åbne filer som er i brug. 31

32 Skrive filer til en fuld harddisk. java.io bibliotek til filhåndtering To typer filer Tekstfiler: filer bestående af læselige bogstaver. Håndteres med readers/writers: FileReader, BufferedReader, FileWriter Binary filer: filer bestående af byte-sekvenser. Håndteres med streams: FileInput- Stream, FileOutputStream Filen åbnes, data læses/skrives, filen lukkes. Til skrivning af tekstfiler benyttes FileWriter. FileWriter writer = new FileWriter(file); writer.write(text); writer.close(); Til læsning af tekstfiler wrappes FileReader objekter ofte i BufferedReaders, da FileReader ikke kan læse hele linjer ad gangen. FileReader fr = new FileReader(file); BufferedReader reader = new BufferedReader(fr); reader.readline(); reader.close(); Omringes af try-catch-blok, hvori bl.a. IOExceptions fanges. Scanner Serialization Kan læse input fra terminalen Kan også læse input fra tekstfiler og finde betydningsfulde dele af inputtet vha. dens parsing metoder, fx nextint(). Hvis en klasse implementerer interfacet Serializable kan et objekt af klassen gemmes som en binær fil i én write operation (ObjectOutputStream) Objektet kan ligeledes indlæses igen (ObjectInputStream) Hvis dele af klassens tilstand ikke er Serializable (fx hvis man har en feltvariabel som er et HashMap) kan de markeres så de skippes af processen vha. Javas transient keyword. Ellers kastes en exception. 32

33 6.7 Dispositionsforslag 1 Exceptions Hvad er exceptions? Hvis man ikke havde exceptions? Checked vs. unchecked UML-diagram, Throwable-hierarkiet Regler for checked exceptions (throws, try-catch) Exception handling Defensive programming Exceptions kastes med throw new Exception() Avoidance, unchecked exceptions kan ofte undgås vha. checks Recovery, for-løkke med attempts -tæller for checked exceptions Filhåndtering Hvorfor er exceptions relevante for filer? Tekstfiler: FileReader, BufferedReader, FileWriter Andre filer: InputStream, OutputStream 33

34 6.8 Dispositionsforslag 2 hvad er exceptions og hvad bruges de til hvad ville man gøre uden exceptions 8 (sproget C har ingen exceptions) 2 typer exceptions (checked og unchecked) Tegn exceptions klassehierarki (Throwable, Exception, RuntimeException, Error) Egne exceptions (Hvilken klasse skal nedarves fra) Try / catch / finally (husk finally køres ALTID, og bruges ofte til cleanup) Throws keyword Fil håndtering Meget kan gå galt Eksempler (Filen eksisterer ikke, ingen adgang til filen) Relater evt. til aflevering om filhåndtering Defensive programming Minimerer antallet af fejl Tager højde for alt (især brugerinput) Brugeren er ond Programmør fejl Sørg for at programmet ikke crasher 8 I sproget C returnerer de fleste metoder en værdi der fortæller om kaldet gik godt eller skidt. For systemkald repræsenterer en negativ returværdi oftest at noget er gået galt. 34

35 7 The Java Type System and Object Model 7.1 Typer og værdier Alle typer i Java er én af følgende: Primitive typer: int short long byte char float double boolean Klassetyper, fx String, Rectangle Interfacetyper, fx Comparable, Shape Arraytyper, fx String[], int[], char[]. En arraytypes elementer kaldes arrayets component type. Null-typen, null Alle values i Java er én af følgende: En værdi til en primitiv type, fx 13, 5.0, k En reference til et objekt af en klasse, fx new String( Hest ) En reference til et array, fx new int[] 2, 3, 5, 7, 11, 13 null Man kan ikke have værdier til interface-typer, da de ikke kan instantieres. 7.2 Subtype-forhold Subtype-forholdet i Java følger Liskov s substitutionsprincip om, at subtyper kan benyttes hvor supertyper forventes. Vi betragter to typer, S og T. S er en subtype til typen T, hvis én af følgende regler passer: S og T er samme type S og T er begge klassetyper, og S er en direkte eller indirekte subclass til T S og T er begge interface-typer, og S er direkte eller indirekte subinterface til T S er en klassetype, T er en interface-type, og S eller en superclass til S implementerer T eller et subinterface til T S og T er arraytyper, og component-typen til S er en subtype til component-typen til T S er ikke en primitiv type, og T er Object S er en arraytype, og T er Cloneable eller Serializable S er null og T er ikke en primitiv type Ved subtype-forhold mellem to arraytyper kan man trække array brackets fra begge arrays indtil én eller begge typer ingen brackets har. Object[] og int[], træk brackets fra på begge arrays, Object og int, og da int er en primitiv type er den ikke en subtype til Object, og dermed er int[] ikke en subtype til Object[] og omvendt. int[] er dog en subtype til Object, så int[][] er en subtype til Object[]. Compiler checker kun formelle typer, hvilket vil sige, at selv om man fodrer en subtype til en supertype (Manager i Employee variabel, Liskov substitution), kan man kun kalde supertypens metoder, fordi compileren altid kun kigger på formelle typer. Typecasting betyder at man omdanner et objekts statiske/formelle type til en anden type, fx 35

36 Employee e = new Manager(); e.getbonus() // COMPILE ERROR! ((Manager)e).getBonus() // OK! Primitive typer kan også typecastes, men der er nogle bestemte termer i den forbindelse: Widening, når man fx caster en int til en double. (2 -> 2.0) Sker automatisk! Fx double x = 2 -> x = 2.0 Narrowing, når man fx caster en double til en int. (2.5 -> 2) Kræver typecast! Fx int y = (int) 5.2 -> y = Wrappers (aka. Snoop Dogg) De 8 primitive typer har tilhørende wrappers (klassetyper): Integer, Short, Long, Byte, Character, Float, Double, Boolean. De har altså samme navne som deres primitive modstykker, pånær Integer (int) og Character (char). Wrapper-classes kan wrappe primitive typer i objekter, hvor det er nødvendigt. Fx hvis man skal have en ArrayList med ints. ArrayList kan ikke have primitive typer. Auto-boxing er den automatiske konvertering mellem primitive typer og wrapper objekter. Dette gør at man ganske enkelt kan tilføje int-værdier til ArrayLists af Integers, uden at skulle konvertere manuelt først. 7.4 Enum Enumerated types er typer med et endeligt sæt værdier. Eksempler på enum typer er Suit med fire værdier: SPADE, CLUB, HEART, DIAMOND, eller Size, som fx kunne have værdierne: SMALL, MEDIUM, LARGE. Keywordet enum definerer en class med en private constructor (nye objekter kan ikke laves fra den) med nogle fields tagged som public static final. Det er forsvarligt at lade dem være public, idét klassen ingen metoder har, og dens fields er alle final. 7.5 Type inquiry Man kan teste om et objekt eller en expression er en reference til et objekt af en bestemt type, eller én af dens subtyper med instanceof operatoren. if (e instanceof Shape) Man kan finde et objekts klasse med getclass() metoden. Den returnerer et Class objekt. Dette objekt indeholder en masse information om det objekt, metoden blev kaldt på. Fx navnet på den klasse objektet tilhører, eller klassens eventuelle superclass. Med getname() kaldt på et Class objekt kan man få det præcise klassenavn for et objekt. Class objekter kan beskrive enhver type, også primitive typer. Vil man teste om et objekt tilhører en bestemt class, kan man kalde getclass() på objektet og sammenligne med den bestemte class således: if (e.getclass() == Rectangle.class) Type inquiry bør ikke bruges som en erstatning for polymorfi. 36

37 7.6 The Object class - mother of all classes Alle Java-classes er subclasses til Object. Hvis en class ikke extender nogle andre classes er den en direkte subclass til Object. Derfor er alle metoder i Object tilgængelige for alle objekter. De fire vigtigste (som også altid bør overrides i custom classes) er: tostring() som returnerer en String-repræsentation af objektet. Bruges automatisk af forskellige standard-metoder. Fx hvis man prøver at printe et objekt vha. System.out.println(). equals() som sammenligner et objekt med et andet. Man kan nemt sammenligne to ints med hinanden som (x == y), men bruger man == operatoren på objekter sammenlignes objekternes referencer. Det ønskes ofte at to objekter betragtes som værende ens, hvis dele eller hele tilstande af objekter er ens. Fx kan to Beer-objekter betragtes som ens hvis deres name og percent fields er ens. Hvis to lister indeholder de samme elementer i forskellige rækkefølger kan de også i nogle situationer betragtes som ens. Den perfekte equals metode starter ifølge Horstmann således: if (this == otherobject) return true; if (otherobject == null) return false; if (getclass()!= otherobject.getclass()) return false; Metoden skal være reflexive (x.equals(x)) og symmetrisk (x.equals(y) <-> y.equals(x)) hashcode() som returnerer en hash code for objektet. Hash codes skal være konsistente med equals metoden, så to objekter som equals hinanden genererer samme hash codes. clone() som returnerer en kopi/klon af objektet. Cloneable interface skal implementeres Der skælnes mellem deep og shallow copies af objekter vha. clone metoden. En shallow copy er en kopi, som ganske enkelt bare kopierer alle værdierne i originalens fields (orig.x =? -> clone.x = orig.x). Hvis disse værdier er objektreferencer (hvilket de er, hvis de ikke er primitive værdier), vil kopien nu dele objektreferencer med originalen, hvilket betyder at en ændren i kopiens værdier også ændrer på originalens værdier! En deep copy er en kopi som er magen til originalen, men har sine egne field-værdier (orig.x =? -> clone.x = new x). Ændringer i kopien ændrer således ikke på originalen. En sufficiently deep copy er en kopi som kun opretter nye objektreferencer til objekter som er mutérbare. String er immutérbare, så typiske name fields er ikke kritiske. 7.7 Serialization Man kan gemme objekter som binære filer, hvis klassen objekterne tilhører implementerer Serializable interfacet. 7.8 Generic Types Generics er typer som har en eller flere type-variable, som betegnes med bogstavet E, fx ArrayList<E> som altså instantieres med en ikke-primitiv type. Det kunne være ArrayList<Integer> eller ArrayList<String>. Metoderne i generic types arbejder med dette E, som altså ved instantiering er en egentlig type. 37

38 7.9 Dispositionsforslag 1 Typer Hvad er typer? Hvilke findes der? Primitive typer, reference-typer null-pointers Subtype-forhold Keywords: extends og implements Casting af reference-typer Casting af primitive typer, widening/narrowing Generics og Wrappers Generics omgår IntArrayList, StringArrayList, etc. Tillader at benytte en generisk klasse med vilkårlige typer Wrapper-klasser nødvendige for primitive typer The Object Class Metoder: tostring(), equals(), hashcode() Forhold mellem equals() og hashcode() Evt. clone() Cloning Deep vs. shallow Java API en, ArrayList Pointer-diagram 38

39 7.10 Dispositionsforslag 2 Typer Primitive typer wrappers og auto boxing widening / narrowing type casts Reference typer klasse / interface / array statisk / dynamisk type (skriv kode og forklar) null (special case da null ikke er en type) Object klassen Alle referencetyper nedarver fra Object Implementerer generelle metoder Equals (overvej at skrive kode 9 ) x = x x = y = y = x x = yy = z = x = z Clone (deep og shallow) - overvej at komme ind på immutable klasser Generics Wildcards / extends / super Eksempel på brug Collections.sort() Kodeeksempel på generisk klasse 9 Det tager lang tid at skrive koden og det er vigtigt at det er helt korrekt. Overvej om det er det værd, eller om du hellere vil have mere tid til at tale om de andre emner. 39

40 8 Frameworks & Collections Frameworks er en samling af klasser som alle arbejder sammen og er relevante for et bestemt emne. Fx er Swing et framework, og dets klasser benyttes alle til at lave GUI er med. Et andet framework er Applet, som bruges til at lave Java applets med, så de kan køres i web browsers. 8.1 Frameworks og libraries Frameworks adskiller sig fra normale program libraries på forskellige måder Inversion of control - I modsætning til almindelige libraries fungerer det meste af execution flowet for et framework i selve framework klasserne. Dvs. frameworkets metoder kan overrides, men det er frameworket som sørger for at kalde dem. Dette fænomen kaldes også Hollywood-princippet: Don t call us, we call you. Extensibility - Brugere kan benytte frameworkets default behaviour eller override og specialisere dets metoder. Niks pille - Frameworkets kode må generelt ikke ændres. Brugere er nødt til at extende og override for at specialisere funktionalitet. Frameworks er ikke design patterns, og der er ingen egentlige design regler for hvordan frameworks skal se ud - de består udelukkende af et sæt klasser, som udgør en slags generel service for en bestemt type program, og de benytter typisk mange forskellige design patterns. 8.2 Applets Applets er programmer som afvikles i web browsers. java.applet er et framework, som bruges til lige netop det formål. I de fleste selvstændige programmer er der en main metode, som er det første der bliver kørt når programmet starter. I Applet-frameworket er denne metode allerede defineret, og programmer som extender Applet, skal bare override nogle eller alle af følgende metoder: init - Kaldes én gang, lige når appletten loades. start - Kaldes når appletten startes (efter init) stop - Kaldes når appletten eller browseren lukkes destroy - Kaldes når browseren lukkes for at frigive resourcer paint - Kaldes når appletten skal repaintes (ofte). Framework karakteristika for applets: Applet-programmøren extender Applet frameworket (inheritance) Applet-klassen sørger for alle de trivielle ting, som at parse parametre og checke hvornår appletten er synlig og sådan. Applet-programmøren overrider bare metoder som ønskes specialiseret. Inversion of control gør, at programmøren ikke bekymres med hvornår og hvordan metoderne skal afvikles. Det sørger frameworket for. 40

41 8.3 Collections Collections er både en samling af almene datastrukturer og et framework for nye collection klasser. Frameworket indeholder nogle forskellige interfaces, fx: Collection - Det mest generelle collection interface Set - En usorteret collection some ikke tillader duplicates SortedSet - En sorteret collection som ikke tillader duplicates. Elementerne sorteres vha. Comparable eller Comparator List - En ordnet collection der kan indeholde duplikater Frameworket tilbyder desuden konkrete klasser som implementerer disse interfaces. Nogle af de vigtigste er: HashSet - Et set som bruger hashing/hash codes til at finde dets elementer ArrayList - En liste som internt er baseret på arrays. ArrayLists er gode, hvis man ønsker hurtig random access i listen, da dens lookups fungerer som i arrays. Til gengæld er ArrayList langsom til at tilføje og fjerne elementer, da der ved disse operationer laves en kopi af det nuværende array, plus/minus ét element. LinkedList - En liste som ikke er baseret på arrays. LinkedLists er gode hvis man ønsker hurtige add/remove metoder, men deres lookups er meget langsomme sammenlignet med ArrayLists, da LinkedLists altid gennemløbes fra start til det index man søger. AbstractCollection er en abstrakt klasse, som implementerer Collection interfacet, og definerer alle metoderne, undtagen iterator()og size().metoder som toarray()bruger netop iterator()og size(),hvilket vidner om Template Method designmønstret. AbstractCollection efterlader kun følgende to metoder til subclasses: int size() Iterator<E> iterator() De fleste konkrete collection classes som extender AbstractCollection overrider dog add()metoden, da AbstractCollection s version er en dummy udgave som bare kaster en UnsupportedOperationException, hvilket giver mening for collections som skal være immutable. 41

42 8.4 Dispositionsforslag 1 Frameworks Frameworks vs. libraries Inversion of Control java.lang.math er et library, ingen IoC Java Applets hører til et framework Applets Simpelt framework Metoderne init(), start(), etc. IoC Collections Alle niveauer af et framework Interfaces, fx List Abstrakte klasser, fx AbstractCollection Færdige klasser, fx ArrayList Sammenligning af forskellige collections, ArrayList vs TreeSet Template Method Pattern UML-diagram MultiSet-aflevering 42

43 8.5 Dispositionsforslag 2 Framework vs program library Hollywood princippet Don t call us, we call you hot spots / frozen spots Eks. RPG spil eller applets 10 Extend applet med metoderne (init(), start(), stop() og paint()) frameworket kalder selv disse metoder. Appletklassen er altså et hot spot. Prototyper (PROTOTYPE pattern) Frameworket skal kunne kalde brugerens klasser Laver nye objekter ved at klone en prototype Collections framework sort / shuffle / min / max Collection interface (hot spot) (generisk) set (ingen dupletter) vs. list (elementers rækkefølge er bibeholdt) Benyt muligvis muligheden for at tale om generiske klasser AbstractCollection<E> Opret nye collections ud fra denne klasse der implementerer de fleste metoder TEMPLATE METHOD pattern (vær klar på at give specifikt ekesmpel) 10 Det vigtige her er at du har styr på dit eksempel og føler dig sikker på at tale om det. 43

44 9 Multithreading Tråde er er programstykker som kan eksekveres parallelt med hinanden, dvs. på samme tid. På single-core systemer skifter operativsystemet konstant mellem trådene, hvilket giver illusionen af, at de kører parallelt. På multi-core systemer kan operativsystemet derimod virkelig afvikle tråde parallelt - én på hver core. 9.1 Fordele Gør det muligt at separere program-kode fra kontrol-kode, fx kan lange rekursive beregninger udføres i én tråd, mens main-tråden fortsat reagerer på inputs fra brugeren. Kan således forhindre at programmer fryser mens lange beregninger finder sted. 9.2 Ulemper Der kan opstå problemer, fx race conditions ved synkronisering hvis flere tråde deler data. Deadlocks hvis alle aktive tråde venter på at nogle andre tråde gør noget 9.3 Runnable interfacet En class som implementerer Runnable interfacet skal override metoden run(), hvorefter et Thread-objekt kan laves med et objekt af denne Runnable class. Herefter kaldes start() på Thread-objektet, og så afvikles koden i Runnable objektets run() metode. Runnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); UML diagram 9.4 Selfishness En tråd skal lade andre tråde komme til, ellers er den selfish. På nogle platforme kan en selfish tråd forhindre andre tråde i at blive afviklet, hvilket ødelægger formålet med tråde. Tråde kan sættes til at sove med sleep(). Når en tråd sættes til at sove betyder det, at andre tråde kan komme til. En tråds afviklingstid kaldes en time slice. main() metoden i ethvert Java program er sin egen tråd. Hvis man har startet flere tråde i sit program afsluttes det først når alle trådene er færdige, eller er blevet interrupted. 44

45 9.5 Tilstand Diagram Når der laves et nyt Thread objekt er den new. Når start()metoden kaldes bliver tråden runnable. Herfra er tråden klar til at blive kørt. Tråden kan blive blocked hvis der kaldes wait()eller sleep().dette sker som regel når tråden venter på en lås. Når tråden vækkes af enten notify()eller signal()bliver den igen runnable. Når run()metoden returnerer dør tråden. En tråd kan være blocked hvis den sover, venter på input/output, venter på en lock eller en condition. Når en tråd er blocked forbliver den blocked indtil den event den venter på sker. Fx, hvis en tråd sover bliver den først runnable igen når dens sovetid er gået. 9.6 interrupt() Tråde kan afbrydes/stoppes med interrupt() sleep() og wait() kaster en InterruptedException, hvis interupt() kaldes på en sovende tråd. Denne exception skal fanges, og man bør derfor omringe al koden i run() med en try-blok. Hvis tråden ikke er blocked vil interrupt() bare sætte trådens interrupted field til true. Dette field kan checkes med metoden isinterrupted(). I tilfælde af I/O eller andet beskidt arbejde bør tråde altid have noget oprydningskode efter try-blokken. 9.7 Race conditions Når flere tråde deler data, som kan korrupteres hvis trådene ikke afvikles i en bestemt rækkefølge. Hvis to tråde fx forsøger at lægge nyt indhold i en queue, og samtidig inkrementerer queuens tail, så kan race conditions gøre, at en tråd ikke når at inkrementere tailen før en ny tråd tager over. I så fald overskrives den første tråds data. Se evt. Horstmann s. 376 Locks kan bruges til at blokkere alle andre tråde, som forsøger at tilgå den samme data som den nuværende tråd, indtil denne er færdig med sin kode. Når den første tråd frigiver locken, bliver de andre tråde unblocked. 45

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

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

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

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning Datalogi OB, Efterår 2002 OH er, forelæsning 10/9-2002 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Eftermiddagens opgave:

Læs mere

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

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11 DM503 Forelæsning 11 Generics Pakker Exceptions Indhold Generics Nedarvning og Generics Generics Nedarvning og Generics Husk Box fra sidst Generics public class Box {! private T object;! public void

Læs mere

Objektorienteret design med arv og polymorfi:

Objektorienteret design med arv og polymorfi: Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Objektorienteret design med arv og polymorfi: Substitutionsprincippet Composite Design Pattern Finn Nordbjerg Side 1 Objektorienteret

Læs mere

Klasser og objekter. (Afsnit i manualen)

Klasser og objekter. (Afsnit i manualen) Klasser og objekter (Afsnit 4 + 5 i manualen) Grundbegreber Klasser og objekter beskrivelse oprettelse Attributter og metoder tilstand opførsel Indkapsling afskærmning datarepræsentationsuafhængighed Klasser

Læs mere

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

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4 dintprog Manual Revision: 1241 August 24, 2010 Indhold I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4 3 Grundbegreber om modellering 4 III Sprogkonstruktioner 5 4 Klasser

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

Forelæsning Uge 6 Mandag

Forelæsning Uge 6 Mandag Forelæsning Uge 6 Mandag Tingene i denne forelæsning er ikke eksamenspensum Forelæsningen afrunder kurset, og forklarer nogle af de begreber, som I har mødt under kurset uden at få detaljeret forklaring

Læs mere

Exceptions i Delphi. Try except

Exceptions i Delphi. Try except Exceptions i Delphi Exceptions er en teknik til at fange fejl under programafviklingen. Ikke programmeringsfejl, men fejl der opstår i forskellige situationer, f.eks. en fil der mangler en fil der er skrivebeskyttet,

Læs mere

Rekursion C#-version

Rekursion C#-version Note til Programmeringsteknologi Akademiuddannn i Informationsteknologi Rekursion C#-version Finn Nordbjerg 1 Rekursion Rekursionsbegrebet bygger på, at man beskriver noget ved "sig selv". Fx. kan tallet

Læs mere

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater Design by Contract Design and Programming by Contract Anne Haxthausen ah@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design by Contract er en teknik til at specificere

Læs mere

Begreber om Godt Software

Begreber om Godt Software Begreber om Godt Software Maintainability (vedligeholdelse): Softwarens evne til at blive ændret (funktionalitet, rettet, forbedrelser, miljø, krav). - Analyserbart: Evnen til at blive fejldiagnosticeret,

Læs mere

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22.

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22. Klasser og Objekter i Python Uge 46 Learning Python: kap 15-16, 19-22. Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. En kage form Klassens

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter

Læs mere

dintprog Manual Revision: 731 September 30, 2009 1 Introduktion 3 1.1 Notation... 3 I Begreber 4 2 Grundbegreber om programmering 4

dintprog Manual Revision: 731 September 30, 2009 1 Introduktion 3 1.1 Notation... 3 I Begreber 4 2 Grundbegreber om programmering 4 dintprog Manual Revision: 731 September 30, 2009 Indhold 1 Introduktion 3 1.1 Notation................................. 3 I Begreber 4 2 Grundbegreber om programmering 4 3 Grundbegreber om modellering

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

Programmering i C. Lektion 4. 5. december 2008

Programmering i C. Lektion 4. 5. december 2008 Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )

Læs mere

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

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal

Læs mere

4 Basal Objekt-orienteret Programmering I.

4 Basal Objekt-orienteret Programmering I. 4 Basal Objekt-orienteret Programmering I. Klasser i forhold til abstrakte datatyper og record-typer. Variable og operationer. Klasse-interfaces. Klasser og typer. Klasse-instantiering og initialisering.

Læs mere

Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i)

Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i) Eksamens spørgsmål i Java HTML - DataBase 3. Semester (i) 1: KLASSE METODE KONSTRUKTØR EKS. PÅ TYPE (VARIABLE) PUBLIC/PRIVATE OBJECT UD FRA KLASSE KALD METODE TILFØR PARAMETER TIL METODE RETURNERE VARIBEL.

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Sommer 1999 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 15% Opgave 2 15% Opgave 3 8% Opgave

Læs mere

Objektorienteret Programmering

Objektorienteret Programmering Objektorienteret Programmering Struktureret Systemudvikling Jan Bendtsen Automation and Control Indhold Lidt om programmeringssprog Klasser i Java Klasser i C++ Oversættelse og kørsel af kode Et eksempel:

Læs mere

Videregående Programmering for Diplom-E Noter

Videregående Programmering for Diplom-E Noter Videregående Programmering for Diplom-E Noter 1. Uddelegering Ét af de væsentlige principper i objektorienteret programmering er, at enhver klasse selv skal kunne "klare ærterne". Enhver klasse skal altså

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11 DM01 DM01 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 18/3-2003 Side 1 af 11 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DILEMMA:...4 2.1.1 METODER:...4

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

BRP 6.9.2006 Kursusintroduktion og Java-oversigt

BRP 6.9.2006 Kursusintroduktion og Java-oversigt BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:

Læs mere

Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 - forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 - forstå datastrukturer og algoritmer (teoretisk forståelse og intuition) Datalogi OB, Efterår 2002 OH er, forelæsning 3/9-2002 Datastrukturer og algoritmer Henning Christiansen henning@ruc.dk http://www.ruc.dk/~henning Formål: at kunne - forstå datastrukturer og algoritmer

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2015 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 3. marts, 2015 Dette projekt udleveres i to dele. Hver del har sin deadline, således

Læs mere

DM536. Rapport og debug

DM536. Rapport og debug DM536 Rapport og debug Kilder Vigtig.it (Felix Palludan Hargreaves) http://vigtig.it/dm502/howto_report.pdf http://vigtig.it/blog/teaching/#toc-relevant-tips Peter Schneider-Kamp http://imada.sdu.dk/~petersk/dm536/project2.pdf

Læs mere

SAX Simple API for XML.

SAX Simple API for XML. SAX Simple API for XML. En API (Application Programming Interface) et bibliotek eller et sæt af funktioner eller metoder. SAX er et sådant bibliotek af abstrakte metoder som f. eks. startdocument() eller

Læs mere

Programmering 2. dprog2 E2013. http://www.cs.au.dk/dprog2/

Programmering 2. dprog2 E2013. http://www.cs.au.dk/dprog2/ Programmering 2 dprog2 E2013 http://www.cs.au.dk/dprog2/ Læringsmål Deltagerne skal ved afslutningen af kurset kunne: forklare og anvende både basale og videregående elementer af et moderne programmeringssprog,

Læs mere

Assignment #5 Toolbox Contract

Assignment #5 Toolbox Contract Assignment #5 Toolbox Contract Created by: René Kragh Trine Randløv E mail address cph rk70@cphbusiness.dk 23 11 2014 1 Introduktion Dette dokument indeholder en vertikal kontrakt for et system som skal

Læs mere

Overblik. Class Loader. Java. Class Libraries. Bytecode. Verifier Java. Source (.java) Just in Time Compiler. Java

Overblik. Class Loader. Java. Class Libraries. Bytecode. Verifier Java. Source (.java) Just in Time Compiler. Java OOP1 Java intro. Klasser, objekter, interfaces, nedarvning, Association, Aggregation og Composition mvh. Try and catch exceptions. Package Intro. til jar filer. Overblik Compile-time Environment Run-time

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Objektorienterede metoder

Objektorienterede metoder Objektorienterede metoder Denne gang: Designmønstre Skabende designmønstre: Fabrikeringsmetode/Fabrik, Singleton, Abstrakt fabrik (Toolkit), Prototype, Objektpulje Singleton eksempel: Forskellige slags

Læs mere

Kontraktbaseret Design. Anker Mørk Thomsen

Kontraktbaseret Design. Anker Mørk Thomsen Kontraktbaseret Design Anker Mørk Thomsen 5. marts 2014 -2 Kontraktbaseret Design Anker Mørk Thomsen 1. udgave ISBN: 9788740491500 Forord Bogen er blevet til gennem undervisning i faget Kontraktbaseret

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Specialeforsvar: Fundamentet for et fleksibelt container bibliotek

Specialeforsvar: Fundamentet for et fleksibelt container bibliotek Specialeforsvar: Fundamentet for et fleksibelt container bibliotek Foundations of an adaptable container library Bo Simonsen Datalogisk Institut, Københavns Universitet Denne præsentation, afhandlingen,

Læs mere

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

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON Data load og udtræk 2. iteration: implmentation (test af backend) 1 PHP mysql Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON 2 Data udtræk PHP mysql: Processen 1. Forbind til MySQL server

Læs mere

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

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004 Genbrugelige komponenter og designmønstre i Java Jacob Nordfalk Ingeniørhøjskolen i København Nykøbing F itvisioncenter 24. februar 2004 Program Om Jacob Nordfalk introduktion (ikke-teknisk del) Komponentbaseret

Læs mere

Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111

Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 DM14 1. Obligatoriske opgave Systemkald Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 Side 1 af 5 Intro: Formålet med opgaven at et lave en system kald

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 9 Andre designmønstre Andre designmønstre: Uforanderlig, Fluevægt, Lagdelt Initialisering, Komposit/Rekursiv Komposition, Kommando/Ændring Fremlæggelse af programmering/status

Læs mere

DM502. Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/

DM502. Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/ DM502 Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/ 1 DM502 Bog, ugesedler og noter De første øvelser Let for nogen, svært for andre Kom til øvelserne! Lav opgaverne!

Læs mere

Projekt - Visual Basic for Applications N på stribe

Projekt - Visual Basic for Applications N på stribe Projekt - Visual Basic for Applications N på stribe Mikkel Kaas og Troels Henriksen - 03x 3. november 2005 1 Introduktion Spillet tager udgangspunkt i det gamle kendte 4 på stribe, dog med den ændring,

Læs mere

Dag 10 Flertrådet programmering

Dag 10 Flertrådet programmering Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,

Læs mere

DM01 DM01. 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 13/5-2003. Side 1 af 7

DM01 DM01. 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 13/5-2003. Side 1 af 7 DM01 DM01 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 13/5-2003 Side 1 af 7 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DNA2:...4 2.1.1 METODER:...4

Læs mere

Virkefeltsregler i Java

Virkefeltsregler i Java Virkefeltsregler i Java int i; int k; Sequence s; int j; What s in a name? Brian spillede blændende i søndags! Skolen ligger i Viby Ring til Kirsten og sig at... Et navn fortolkes i en kontekst og konteksten

Læs mere

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

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004 Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),

Læs mere

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract Sproget Six Til brug i rapportopgaven på kurset Oversættere Vinter 2006 Abstract Six er baseret på det sprog, der vises i figur 6.2 og 6.4 i Basics of Compiler Design. Den herværende tekst beskriver basissproget

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling

Læs mere

Real-time programming safety in Java and Ada

Real-time programming safety in Java and Ada Real-time programming safety in Java and Ada Bo Sandén Presenter: Thomas Bøgholm 25. oktober 2007 Forfatteren Artiklen Synkroniserings Begreber Bo Sandén Professor på Colorado Technical University Beskæftiger

Læs mere

Programmering 2. dprog2 E2012. http://www.cs.au.dk/dprog2/

Programmering 2. dprog2 E2012. http://www.cs.au.dk/dprog2/ Programmering 2 dprog2 E2012 http://www.cs.au.dk/dprog2/ Læringsmål Deltagerne skal ved afslutningen af kurset kunne: forklare og anvende både basale og videregående elementer af et moderne programmeringssprog,

Læs mere

BlogReader 1.0.0 Af Jonas F. Jensen.

BlogReader 1.0.0 Af Jonas F. Jensen. BlogReader 1.0.0 Af Jonas F. Jensen. Indholdsfortegnelse Forord.....3 Hvad er BlogReader?......4 RSS, XML og sematic web......4 Klasse struktur i UML......4 Overordnet opbygning......5 UML diagram over

Læs mere

UML til kravspecificering

UML til kravspecificering UML til kravspecificering UML mini-kompendium - til brug i forbindelse med modellering af kravspecifikationer. Copyright 2006 Teknologisk Institut, IT-Udvikling Aktivitetsdiagram 2/9 Aktion Aktionsnavn

Læs mere

Vejledning til listings-pakken

Vejledning til listings-pakken Vejledning til listings-pakken Morten Ovi latex@student.dtu.dk / 6. juli 2004 Indhold 1 Om listings-pakken 1 2 Indstilling af listings 2 3 listings-pakken i praksis 2 3.1 listings i teksten............................

Læs mere

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav.

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav. Miniprojekt2011 Projektbeskrivelse Der skal fremstilles en lille java application på PC, hvor brugeren kan foretage interaktioner med en simpel database på disken via et grafisk brugerinterface. Formålet

Læs mere

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

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations Tabelbegrebet Klassediagrammer (III) Tabeller og qualified associations originally by Michael R. Hansen modified/extended by Anne E. Haxthausen Informatics and Mathematical Modelling Technical University

Læs mere

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

Hvad er et distribueret objekt? Plan 12.3. Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Hvad er et

Læs mere

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen 191076 kok04

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen 191076 kok04 DM34-1. Obligatorisk opgave Dilemma spillet Jacob Aae Mikkelsen 191076 kok04 April 2005 Kapitel 1 Resumé Denne rapport dokumenterer udviklingsforløbet og afprøvningen af et spil Dilemma. Spillet går ud

Læs mere

Crash Course i Programmering. HumTek, RUC

Crash Course i Programmering. HumTek, RUC Crash Course i Programmering HumTek, RUC Kursus mål At give en basal introduktion til programmering i sproget Processing At give et overblik over sprogets potentiale At have det sjovt :-) Kursus form Meget

Læs mere

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud:

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud: Besvarelse af opgave til formuleret til øvelserne 10. september 2002 Datastrukturer og algoritmer Henning Christiansen 22/9-2002 Følgende er ikke en eksakt besvarelse af opgaven, idet den benytter hashtabeller

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

Design Systemkald. User-mode Linux, The Linux kernel/325-2004

Design Systemkald. User-mode Linux, The Linux kernel/325-2004 Tracing tråden afbryder systemkaldet via ptrace Systemkaldet til værten ændres til getpid Processens stak manipuleres til at kalde kernen Kernen returnerer til processen Design Systemkald Design Startup/shutdown

Læs mere

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

Poly. - Javapakke til behandling af polynomier

Poly. - Javapakke til behandling af polynomier Poly - Javapakke til behandling af polynomier z 3 x y x 2 3 x -3 Skrevet af Susanne Nykjær Knudsen, John Thystrup Jensen, Jens Lykke Brandt, Troels C. Damgaard, Jacob W. Winther og Mikkel Bundgaard Vejleder:

Læs mere

Dokumentation af programmering i Python 2.75

Dokumentation af programmering i Python 2.75 Dokumentation af programmering i Python 2.75 Af: Alexander Bergendorff Jeg vil i dette dokument, dokumentere det arbejde jeg har lavet i løbet opstarts forløbet i Programmering C. Jeg vil forsøge, så vidt

Læs mere

Induktive og rekursive definitioner

Induktive og rekursive definitioner Induktive og rekursive definitioner Denne note omhandler matematiske objekter, som formelt er opbygget fra et antal basale byggesten, kaldet basistilfælde eller blot basis, ved gentagen brug af et antal

Læs mere

Introduktion til ActionScript

Introduktion til ActionScript Introduktion til ActionScript Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling på

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Udvikling af DOTNET applikationer til MicroStation i C#

Udvikling af DOTNET applikationer til MicroStation i C# Udvikling af DOTNET applikationer til MicroStation i C# Praktiske tips for at komme i gang. Gunnar Jul Jensen, Cowi Hvorfor nu det? Mdl og Vba kan det hele Fordelene er : udviklingsmiljøet er eksternt

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Vinter 1998/99 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 16% Opgave 2 12% Opgave 3 10% Opgave

Læs mere

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen Programmering Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen Oversigt Undervisningen Hvad er programmering Hvordan er et program organiseret? Programmering og fysik Nobelprisen

Læs mere

JavaScript. nedarvning.

JavaScript. nedarvning. JavaScript er et sprog, der kan give en hjemmeside mere funktionalitet og gøre den interaktiv, så den reagerer på læsernes handlinger. CGI (Common Gateway Interface) har hidtil været de protokoller, man

Læs mere

Webserverprogrammering

Webserverprogrammering Webserverprogrammering WSP fortsat - dag 11 Behandling af XML (StAX) Syndikering og RSS med XML JAXB - XML Java-objekter Projekthjælp Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Læs mere

14.1 Internationale programmer

14.1 Internationale programmer 14.1 Internationale programmer Når et program skal anvendes af flere kulturer og sprog opstår behov for at programtekster, beløb og datoangivelser afhænger af landet og sproget, og man må i gang med at

Læs mere

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september 2008. (Tak til Jakob Bardram for nogle slides) Dagens begreber

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september 2008. (Tak til Jakob Bardram for nogle slides) Dagens begreber Klasser Grundlæggende Programmering med Projekt Peter Sestoft Tirsdag 2. september 2008 (Tak til Jakob Bardram for nogle slides) Dagens begreber Felt (field) Metode (method) Parameter (parameter) Sætning,

Læs mere

PUT og INPUT funktionerne

PUT og INPUT funktionerne PUT og INPUT funktionerne Af: Peter Kellberg Danmarks Statistik Sejrøgade 11 DK-2100 København Ø pke@dst.dk PUT og INPUT-funktionerne Denne artikel er foranlediget af en henvendelse til vores interne SAS

Læs mere

Projekt arbejde til kurset Advanced Models and Programs, SASP-AMP 2008 Poul Brønnum, IT Universitetet i København, Maj 2008. Indholdsfortegnelse

Projekt arbejde til kurset Advanced Models and Programs, SASP-AMP 2008 Poul Brønnum, IT Universitetet i København, Maj 2008. Indholdsfortegnelse Udvidelse af MicroC compileren til at kunne håndtere struct- og union typer samt switch-, break- og continue statement. Yderligere er ovenstående konstruktioner anvendt til at indføre malloc og free kald

Læs mere

Metaklasser i Smalltalk.

Metaklasser i Smalltalk. 8 Metaklasser i Smalltalk. Motivation Metodeopslag Simple metaklasser Mere udviklede metaklasser Klasse- og metaklassehierarkiet Instantiering og initialisering Skabelse af klasser og metoder Oversigt

Læs mere

Undervisningsbeskrivelse

Undervisningsbeskrivelse Undervisningsbeskrivelse Stamoplysninger til brug ved prøver til gymnasiale uddannelser Termin Skoleåret 2015/16 Institution Hansenberg Gymnasium Uddannelse Fag og niveau Lærer Hold htx Programmering,

Læs mere

Opgaver. Oktober 2009

Opgaver. Oktober 2009 Opgaver Oktober 2009 Dette er en samling af supplerende opgaver til kurset Programmering 2. I nogle opgaver henvises til filer med Java programmer/klasser. Dette eksempelmateriale kan nås via WWW: http://www.cs.au.dk/dprog2/eksempler/

Læs mere

SigmaT.

SigmaT. Java + Groovy Disposition Om SigmaT Eksempel på indlejring af Groovy Overvågning af PEM Ønske om dynamisk loaded Java uden at fifle med classloaderen Groovy til hjælp Opsamling hvad jeg ikke har fortalt

Læs mere

Rolf Fagerberg. Forår 2012

Rolf Fagerberg. Forår 2012 Forår 2012 Mål for i dag Dagens program: 1 2 3 4 5 6 Forudsætninger: DM502 og DM503 Timer: 50% forelæsninger, 50% øvelser Forudsætninger: DM502 og DM503 Eksamenform: Skriftlig eksamen: Timer: 50% forelæsninger,

Læs mere

02101: Indledende programmering. IMM, Danmarks Tekniske Universitet. Læg en studieplan. Dato: 7/12-2007. Gruppenummer: 20

02101: Indledende programmering. IMM, Danmarks Tekniske Universitet. Læg en studieplan. Dato: 7/12-2007. Gruppenummer: 20 Kursus 02101: Indledende programmering. Michael Holm & Mikael Andersen side 1 af 136 Kursus: Institut: 02101: Indledende programmering IMM, Danmarks Tekniske Universitet. Titel: Læg en studieplan Dato:

Læs mere

Online billede filtrering

Online billede filtrering Online billede filtrering Eksamensprojekt 2014 Andreas Lorentzen, klasse 3.4 Roskilde Tekniske Gymnasium Programmering C 09-05-2014 I dette projekt vil jeg demonstrerer en af de mange ting moderne browsere

Læs mere

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign 28 Algoritmedesign. Algoritmeskabelon for Del og Hersk. Eksempler på Del og Hersk algoritmer. Binær søgning i et ordnet array. Sortering ved fletning og Quicksort. Maksimal delsums problem. Tætteste par

Læs mere

Sproget Rascal (v. 2)

Sproget Rascal (v. 2) Sproget Rascal (v. 2) Til brug i K1 på kurset Oversættere Opdateret 29/11 2004 Abstract Rascal er et simpelt Pascal-lignende imperativt sprog. Dette dokument beskriver uformelt Rascals syntaks og semantik

Læs mere

Hashing og hashtabeller

Hashing og hashtabeller Datastrukturer & Algoritmer, Datalogi C Forelæsning 16/11-2004 Hashing og hashtabeller Teknik til at repræsentere mængder Konstant tid for finde og indsætte men ingen sortering af elementerne Specielt

Læs mere

Kursusarbejde 2 Grundlæggende Programmering

Kursusarbejde 2 Grundlæggende Programmering Kursusarbejde 2 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 31. oktober 2003 Indhold 1. Kode 2 1.1. hotel.h.................................................... 2 1.2. hotel.cc...................................................

Læs mere

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api Specifikation Abstrakt, objektorienteret operativsystem-api Indhold 1 Indledning... 3 1.1 Introduktion... 3 1.2 Formål... 3 1.3 Overordnede krav... 3 2 Ressourcer i OS-API et... 4 2.1 Tråde... 4 2.2 Timere...

Læs mere

Brugervejledning til Design Manager Version 1.02

Brugervejledning til Design Manager Version 1.02 Brugervejledning til Design Manager Version 1.02 Indholdsfortegnelse 1. Introduktion... 3 1.1 Det kan du med HostedShop Design Manager... 3 1.2 Feature list... 3 2. Design... 4 3. Filer og CSS... 4 3.1

Læs mere

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

Civilingeniøreksamen 49104 12. januar 2001. Skriftelig prøve den 12. januar 2001 Kursusnummer 49104 Skriftelig prøve den 12. januar 2001 Kursusnummer 49104 Kursusnavn: Programmering. Tilladte hjælpemidler: Alle skriftlige hjælpemidler Opgavesættet består af fire opgaver, der har følgende vægtning: Opgave

Læs mere

Tabeller (I) Tabeller

Tabeller (I) Tabeller Tabeller (I) Klassediagrammer (III) Tabeller og qualified associations Michael R. Hansen mrh@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark En tabel fra en mængde A til

Læs mere

Dynamisk programmering

Dynamisk programmering Dynamisk programmering Dynamisk programmering Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Har en hvis lighed med divide-and-conquer: Begge opbygger løsninger til større problemer

Læs mere

Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX

Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX IT -Eksamen Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX [Vælg en dato] Indhold Indledning... 2 Teori... 3 Hvorfor dette design... 4 Produktet... 4 Test og afprøvning... 9 Konklusion... 10 Indledning

Læs mere

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

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004 Københavns Universitet bacheloruddannelsen i datalogi side 1 af 6 DATALOGI 0GB Skriftlig eksamen tirsdag den 6. januar 2004 Dette opgavesæt består af 6 nummererede sider. Eksamensdeltagerne bør straks

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

Michael Jokil 11-05-2012

Michael Jokil 11-05-2012 HTX, RTG Det skrå kast Informationsteknologi B Michael Jokil 11-05-2012 Indholdsfortegnelse Indledning... 3 Teori... 3 Kravspecifikationer... 4 Design... 4 Funktionalitet... 4 Brugerflade... 4 Implementering...

Læs mere