Versions Compared

Key

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

...

Expand
titleOverordnet oppgavebeskrivelse

Eksamensinformasjon

Dersom du mener at opplysninger mangler i en oppgaveformulering, gjør kort rede for de antagelser og forutsetninger som du finner nødvendig. Hvis du i en del er bedt om å implementere klasser og metoder og du ikke klarer det (helt eller delvis), så kan du likevel bruke dem i senere deler. Du trenger aldri å gå tilbake og endre kode basert på kunnskap du får senere, det som står i en oppgavetekst eller vedlegg relatert til deloppgaven er nok. Eventuelle endringer som må gjøres i en metode du tidligere har kodet skal altså kun gjøres i den nåværende oppgaven

Les derimot igjennom hele eksamen så du får en oversikt. Det kan hende at det er bedre for akkurat deg å gjøre ferdig del 5 før du gjør ferdig del 4.

En oversikt over klasser og metoder for alle oppgavene oppgitt til venstre for oppgaveteksten. Denne teksten inneholder krav til de ulike delene, som du må ta hensyn til når du løser oppgavene. I tillegg til metodene som er oppgitt, står du fritt til å definere ekstra metoder for å gjøre løsningen ryddigere. 


Hjelpemidler

Du har tilgang til den fullstendige dokumentasjonen av java, samt enklere dokumentasjon av blant annet testing. Du vil finne begge disse vedleggene i bunnen av oppgavesettet. Disse vil åpne seg i en ny fane som du kan ha liggende under hele eksamen.

Oppgavene

Oppgavens tema er behandling av pasienter på et akuttmottak (TreatmentUnit), som håndterer koblingen mellom et sett med pasienter (Patient) og legene (Doctor) som behandler dem. Pasientene er allerede diagnostisert med et sett ulike tilstander. De behandles av leger, men hver lege kan bare behandle et sett med tilstander. Noen pasienter kan ha grunn til å bli prioritert i behandlingskøen, og en lege kan måtte avbryte en pågående behandling for å ta denne pasienten. Legene på mottaket behandler ulike tilstander, så pasienter kan måtte behandles av flere leger før de er friske og kan skrives ut. Når en lege kan ta imot en pasient skal et informasjonspanel vise hvilken pasient som skal gå til hvilken lege.

Skjelettet til klassene og metodene endrer seg mellom deloppgavene. Deloppgavene skisserer et system som gradvis utvides:

  • Del 1 er første trinn i systemet, og inneholder enklere logikk enn beskrevet ovenfor.
  • Del 2 er mer ferdig, og danner basis for resten av deloppgavene.
  • Del 3 løser prioritering av pasienter ved hjelp av arv.
  • Del 4 løser prioritering av pasienter ved hjelp av delegering. Merk at deloppgavene 3 og 4 altså løser det samme problemet på ulike måter.
  • Del 5 bruker lytting for å vise informasjon i et panel laget ved hjelp av FXML.

 


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

Denne første versjonen av systemet består av tre klasser. Patient er en tom klasse. Doctor-klassen har en assosiasjon til en Patient. TreatmentUnit holder rede på hvilke pasienter og doktorer som finnes, og styrer avvikling av behandlingskøen. Pasienter som har blitt behandlet av en lege fjernes fra systemet. Pasientene har altså ingen (helse)tilstander her.

Expand
titleSkjelett til del 1

/*Er klar over mellomrom mellom linjene, men det kommer av kopiering fra Inspera (for å få farger...)*/

/**

 * 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

              ...

}

 


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
 


...