© 1999-2009, Flemming Koch Jensen
Alle rettigheder forbeholdt
Komposition

Vejledende løsninger
Generel vejledning
Opgaver

 

 

1

I denne opgave skal vi se på den rent tekniske side af komposition. På hvordan man opbygger et objektsystem og anvender det.

  Vi skal lave et objektsystem med følgende udseende:
Figur 1:
Objektsystem med Handle Pattern
  En instans af Regner skal beregne en funktion, der er givet ved følgende polynomium:
 
  Det der adskiller forskellige instanser af Regner fra hinanden er værdien af k. Denne værdi skal derfor gives med til Regner's set-konstruktor. Ud over konstruktoren skal Regner naturligvis også have metoden f der beregner funktionen.
  RegnerHandle skal, som alle andre handles, have de samme metoder i sit interface som det objekt den repræsenterer. RegnerHandle skal derfor have metoden f i sit interface.
  Ud over metoderne fra Regner, skal RegnerHandle også have en set-metode til at bestemme hvilket objekt den repræsentere. Dette gør det muligt dynamisk at ændre hvilket objekt RegnerHandle repræsentere.
  RegnerHandle skal have en set-konstruktor, der intialiserer RegnerHandle til at repræsenterer en Regner.
  Klienten laves, i opgaver, normalt som en testanvendelse i main (og er dermed ikke et objekt). Man opdeler main i to dele; hvor den første opbygger objektsystemet og den anden del anvender det. Med kommentarer gør man det klart, hvilke dele der er hvad.
 

Implementer Regner og RegnerHandle.

Opbyg et objektsystem med en instans af RegnerHandle og en instans af Regner.

Anvend objektsystemet til et kald af f, fra "klienten" (dvs. main).

Udskift instansen af Regner med en anden, der bruger en anden værdi for k, og lad igen "klienten" kalde f.

 

2 [Ikast Handelsskole: Datanom - Programkonstruktion I, 7/1-00: Opgave nr. 2]
 

En boghandel ønsker at registrere dens bøger i en database, der skal laves i Java. I forbindelse med dette program skal der laves en klasse til repræsentation af en bog.

  Man ønsker for hver bog at registrere dens titel, forfatterens navn og dens pris. Man ønsker også at registrere, hvor mange eksemplarer man har af den pågældende bog.
2.1 Lav en klasse Bog, der kan repræsentere alle ovennævnte oplysninger om en bog. Du skal lave en set-konstruktor og en copy-konstruktor.
2.2 Lav til testformål en toString-metode.
2.3 Lav en set-metode til bogens pris.
2.4 Lav to metoder: addAntal og subAntal, der kan bruges til at ændre det registrerede antal eksemplarer. addAntal tager en parameter, der angiver hvor mange bøger det registrerede antal eksemplarer skal forøges med, og tilsvarende tager subAntal en parameter der angiver hvor meget det skal formindskes med. Din implementation af subAntal skal ikke tillade at antallet af registrerede eksemplarer bliver negativt.
  Der ønskes en testanvendelse med følgende to bøger:
 

"Java: how to program" af Deitel & Deitel, der koster 497,- kr. Vi har otte eksemplarer af bogen

"Beginning Java 2" af Ivor Horton, der koster 495,- kr. Vi har tre eksemplarer af bogen

 

1. Efter de to bøger er instantieret sælger vi to af Deitels bøger, og det skal derfor registreres, at vi nu har to mindre på lager.

2. Dernæst nedsætter vi prisen på Hortons bog, så den i stedet koster 395,- kr.

3. I forventning om at dette vil øge salget af Hortons bog, køber vi yderligere tre eksemplarer af hans bog hjem på lager. Det skal derfor registreres, at vi nu har tre flere af den pågældende bog.

2.5

Lav testanvendelsen beskrevet ovenfor.

 

I forbindelse med anvendelsen af klassen Bog i det endelige program, finder man det hensigtsmæssigt at anvende Handle Pattern. Med Handle Pattern vil man opbygge følgende objektsystem:

Figur 2:
Objektsystem med Handle Pattern
  Som sædvanlig vil vi ikke lave klienten som et objekt, men blot lade den være en testanvendelse i main.
2.6 Lav klassen BogHandle. Klassen skal have en set-konstruktor, der sætter referencen til instansen af Bog. Den skal også have en metode setObject, der tager en reference til en instans af Bog og sætter denne Bog til at være dens objekt. Der ønskes en testanvendelse med de samme to bøger som i den første testanvendelse ovenfor. Anvend de priser og antal eksemplarer, der er udgangspunktet i nævnte testanvendelse.
 

1. Lav en instans af Bog, der repræsenterer Hortons bog, og lav en instans af BogHandle, der refererer til den

2. Anvend handle til at øge antallet af registrerede eksemplarer af Hortons bog med otte styk

3. Lav en instans af Bog, der repræsenterer Deitels bog, og lad den allerede eksisterende instans af BogHandle referere til den, i stedet for Hortons bog.

4. Anvend handle til at sætte prisen på Deitels bog til 299,- kr.

2.7 Lav den beskrevne testanvendelse.
   
3

Vi skal her opbygge et objektsystem, der løser en opgave ved at opdele datakernen i flere objekter.

Objektsystemet skal have følgende udseende:
Figur 3:
Repræsentation af linie vha. to punkter
Idéen er at lave et objekt, der kan repræsentere en linie. En linie er som bekendt givet ved to punkter, der er de to endepunkter. Derfor er det mere præcist linie-stykker, vi vil repræsentere.
Punkt skal repræsentere et punkt (x, y) i koordinatsystemet. Punkt skal have get-metoder til x og y, mens de kun kan tildeles værdier af en set-konstruktor.
Linie skal have referencer til de to Punkt-objekter. Den skal have en set-konstruktor der tager to punkter som parametre. Den skal også have en metode length, der returnerer længden af liniestykket mellem de to punkter.
Formlen for længden af liniestykket AB; hvor A = (a1, a2) og B = (b1, b2) er givet ved:
Til beregningen kan man anvende Math.sqrt. Du kan bruge punkterne (3, 0) og (0, 4) til test. Længden skal være 5 (den velkendte 3-4-5 trekant). Brug højest 10 minutter på denne del af opgaven - det er ikke nogen matematikopgave!

Implementer Punkt og Linie.

Opbyg et objektsystem med en instans af Linie og to instanser af Punkt.

Anvend objektsystemet med et kald af length, fra klienten.

   
4*

Vi skal her opbygge et objektsystem, der løser en opgave ved at opdele datakernen i flere objekter.

Objektsystemet skal have følgende udseende:
Figur 4:
Repræsentation af bil vha. motor og gearkasse
  Idéen er at lave et Bil-objekt der repræsenterer en bil på en meget simpel måde. Det eneste der i denne forbindelse interesserer os ved en bil, er dens hastighed som funktion af motorens omdrejningshastighed og hvilket gear gearkassen er i.
  Motor-objektet holder styr på motorens omdrejningshastighed, som vi vil benævne RPM (Rounds Per Minute: Omdrejninger pr. minut). GearKasse-objektet holder styr på hvilket gear bilen er i.
  Klassen Motor skal have to metoder: up og down, der henholdvis øger og sænker omdrejningshastigheden med et vist antal RPM. Konstruktoren til Motor skal tage to parametre: Motorens maksimale RPM og i hvor store skridt RPM vil ændre sig ved kald af up henholdsvis down. Motor må ikke være i stand til at overskride den maksimale RPM. Klassen skal have en get-metode til RPM.
  Klassen GearKasse skal have to metoder: up og down, der henholdvis gearer op or ned. Konstruktoren til GearKasse skal tage en parameter, der angiver det højest mulige gear. Det lavest mulige gear er altid 1. GearKasse'n må ikke kunne sættes i et ikke tilladt gear. Klassen skal have en get-metode der fortæller hvilket gear Gearkasse'n er i.
  Klassen Bil skal have en konstruktor der tager tre parametre: Det maksimale RPM for motoren, den ændring af RPM som én påvirkning af motor i enten opadgående eller nedadgående retning skal bevirke, samt det maksimale gear for gearkassen. Konstruktoren instantierer selv motor og gearkasse.
  Klassen Bil skal have to metoder: speedUp og speedDown, der henholdsvis øger og sænker motorens omdrejningshastighed. Klassen Bil skal også have to metoder: gearUp og gearDown, der henholdvis gearer op og ned.
  Klassen Bil skal have yderligere en metode: getSpeed, der returner bilens hastighed, baseret på dens aktuelle RPM og gear. Anvend følgende formel til at beregnes denne hastighed.
  Det skal bemærkes at formlen ikke baserer sig på rigtig fysik, men giver dog et nogenlunde realistisk resultat (formlen er ren spekulativ fra forfatterens side).
 

Implementer samtlige klasser og lav en test-anvendelse.

   
5

Implementer service-metoderne først og sidst, der i kapitlet anvendes i metoden intersection i klassen Periode.

   
6 I eksemplet med klassen Periode er equals og compareTo implementeret med en relativ kompliceret form for sammenligning, der skal understrege/demonstrere at disse metoder delegerer kaldene videre til instancen af Tidspunkt. Man kunne lave en mere simpel form for sammenligning; hvor man udelukkende så på varigheden af en Periode. To Periode'r er ens hvis de har samme varighed, uanset på hvilket tidspunkt de ligger, og en Periode er større end en anden; hvis den har en længere varighed.
  Implementer de to metoder equals og compareTo i klassen Periode så de anvender denne mere simple form for sammenligning.