Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Vi vil også legge ut skjelettet som ble skissert for hver deloppgave på eksamen når vi kommer så langt.

Expand
titleDel 1 - Første første trinn av Doctor, Patient og TreatmentUnit-klassene (20%)


Expand
titleSkjelett til del 1

/** Jobber med å få inn farger her

 * A doctor has the capacity to treat one patient at a time.

 */

public class Doctor {

 

       // Internal variables go here:

      

 

       /**

        * @return the patient this doctor is treating, or null if s/he isn't currently treating any patient.

        */

       public Patient getPatient() { // 1a

             ...

       }

 

       /**

        * @return true if this doctor is currently treating a patient, otherwise false.

        */

       public boolean isAvailable() { // 1a

             ...

       }

 

       /**

        * Sets the patient that this doctor is treating, use null to indicate s/he isn't currently treating any patient.

        * @param patient

        */

       public void setPatient(final Patient patient) { // 1a

             ...

       }

}

 

/**

 * A class for managing a set of doctors and the patients they're treating.

 * When doctors or patients arrive, it is made sure that patients are treated as soon as possible.

 */

public class TreatmentUnit {

 

       // Internal variables go here: // 1b

      

       /**

        * Adds a doctor and makes sure s/he starts treating a patient, if one is waiting.

        * @param doctor

        */

       public void addDoctor(final Doctor doctor) {  // 1b

             ...

 

       }

 

       /**

        * @return the currently available doctors

        */

       public Collection<Doctor> getAvailableDoctors() {  // 1b

             ...

       }

 

       /**

        * Adds a patient to this treatment unit, and makes sure treatment starts if any doctor is available.

        * Otherwise the patient is queued for treatment when a doctor becomes available.

        * @param patient

        */

       public void addPatient(final Patient patient) {  // 1b

             ...

       }

 

       /**

        * @param pred the predicate that the doctor must satisfy

        * @return some doctor satisfying the predicate

        */

       public Doctor getDoctor(final Predicate<Doctor> pred) {  // 1b

             ...

       }

 

       /**

        * Find the doctor, if any, that treats the provided patient.

        * @param patient

        * @return the doctor treating the provided patient, or null, of the patient isn't currently being treated

        */

       public Doctor getDoctor(final Patient patient) {  // 1b

             ...

       }

 

       /**

        * Find all patients that are not currently being treated

        * @return the patients not currently being treated

        */

       public Collection<Patient> getWaitingPatients() {  // 1b

             final Collection<Patient> result = new ArrayList<>();

             ...

       }

 

       /**

        * Finds a waiting patient and sets him/her as the provided doctor's patient.

        * @param doctor the doctor for which a patient to treat should be found.

        * @return true if a patient for the provided doctor was found, false otherwise.

        */

       private boolean startTreatment(final Doctor doctor) {   // 1c

             ...

       }

 

       /**

        * Finds an available doctor for the provided patient, and sets that doctor to treat the patient.

        * @param patient the patient for which a treating doctor should be found.

        * @return true if a doctor for the provided patient was found, false otherwise.

        */

       private boolean startTreatment(final Patient patient) {   // 1c

             ...

       }

 

       /**

        * Removes the link between doctor and patient, after treatment is finished.

        * Since the patient is fully treated, s/he is removed from this treatment unit.

        * Also ensure the doctor starts treating another patient.

        * @param doctor the doctor that has finished treating his/her patient.

        */

       public void treatmentFinished(final Doctor doctor) {  // 1c

             ...

}

 

 

 

/**

 * A class describing patients. For now it is empty

 */

public class Patient {

       // empty, in part 1 the patient is dead. As in no methods, no nothing.

}

 


 
Oppgave a)

 Skriv ferdig Doctor-klassen i henhold til skjelettet, altså nødvendige innkapslingsmetoder og isAvailable. Patient er så langt en tom klasse, du trenger ikke implementere denne.

Expand
titleLF

 

Oppgave b)

Skriv følgende deler av klassen TreatmentUnit, basert på beskrivelsen i skjelettet:

  • Avgjør og implementer den interne representasjonen av pasienter og doktorer.
  • addDoctor, addPatient, getAvailableDoctors, og getWaitingPatients.
  • getDoctor: Denne finnes i to versjoner, med og uten bruk av Predikat. Du skal skrive begge disse versjonene.

Vær obs på at enkelte av disse metodene bør kalle startTreatment fra 1c.

Expand
titleLF
 
Oppgave c) - TreatmentUnit: Koble pasient og doktor

 Hver gang en ny pasient eller lege er lagt til, eller en lege har avsluttet en behandling, bør TreatmentUnit forsøke å koble en ledig lege og en pasient som skal behandles. Implementer de to startTreatment-metodene og treatmentFinished (sistnevnte brukes ikke i denne underoppgaven, men senere).

Expand
titleLF
 



Expand
titleDel 2 - Andre andre trinn av Doctor og Patient, samt testing. (30%)
Oppgave 2a) - Patient

Implementer følgende deler av Patient-klassen i henhold til skjelettet:

  • Bestem selv hvilke felt, konstruktører og metoder du trenger for håndtering av(helse)tilstander (conditions).
  • Begrunn valget av løsningen, spesielt hvilke typer du har valgt å bruke.
  • requiresTreatment: returnerer om pasienten trenger behandling.
  • Legg i tillegg inn støtte som lar andre klasser iterere over pasientens tilstander, på enklest mulig måte.
  • VIKTIG: Merk at koden du skriver i oppgave 2b og den oppgitte testkoden i oppgave 2d skalpasse til dine valg.
Expand
titleLF

 

Oppgave 2b) - Doctor

Implementer følgende deler av Doctor-klassen i henhold til skjelettet:

  • Avgjør intern lagring av tilstander legen kan behandle. Du trenger ikke argumentere for valget.
  • Konstruktør: Tenk spesielt på innkapsling av data for å hindre endring fra utenfor klassen. Velg selv parameterliste.
  • canTreat: For en gitt pasient skal metoden returnere andelen av dennes tilstander som doktoren kan behandle. Hvis Jens har fem tilstander, og Dr. Who kan behandle tre av dem, så skal metoden returne tallet 0.6.
  • treat: For en gitt pasient fjernes de tilstandene som doktoren kan behandle.
Expand
titleLF
 
Oppgave 2c - TreatmentUnit

Nå som pasienter har ulike tilstander, og doktorer kan behandle slike tilstander, må dette taes hensyn til i klassen TreatmentUnit. En doktor kan ikke behandle pasienter den ikke har kompetanse til å behandle, og en pasient må være i systemet helt til alle tilstander er behandlet.

  • Implementer endring i TreatmentUnit i relevante metoder. Du trenger ikke kopiere inn metoder som ikke endrer seg fra del 1, du skal heller ikke endre svar i del 1.
Expand
titleLF
 

Oppgave 2d - Testing

Du har fått utdelt et skjelett med halvferdige testmetoder (TreatmentUnitTest). Gjør testmetodene fullstendige i henhold til kommentarene. Du vil finne dokumentasjon av testing i vedlegget nederst på siden.

Expand
titleLF
 
Oppgave 2e) - Sekvensdiagram

Tegn sekvensdiagram av det som skjer mellom start sequence diagram- og end sequence diagram-kommentarene i testklassen i skjelettkoden. Diagrammet skal inkludere testen selv, akuttmottaket, pasienten og doktoren som (i den delen av testen) deltar i behandlingen. Du skal ikke ha med kode du legger til selv (f.eks. kall til assert-metoder), som svar på 2 d).

Det skulle være omtrent 8-10 kall til metoder i denne delen.

Expand
titleLF
 


...