Versions Compared

Key

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

...

Kildekode legges inn etterhvert, når sensur er underveis vil vi også legge inn ofte forekommende feil og misforståelser.

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 trinn av Doctor, Patient og TreatmentUnit-klassene (20%)


Expand
titleSkjelett til del 1

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

/**

 * 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        public Patient getPatient() { // 1a        

              ....    

       }


           /**

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

        */

    public        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        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        public void addDoctor(final Doctor doctor) {  // 1b        

              ...    


       }


           /**

           * @return the currently available doctors  

        */

    public        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        public void addPatient(final Patient patient) {  // 1b        

              ...    

       }


           /**

           * @param pred the predicate that the doctor must satisfy  

        * @return some doctor satisfying the predicate  

        */

    public        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        public Doctor getDoctor(final Patient patient) {  // 1b        

              ...    

       }


           /**

           * Find all patients that are not currently being treated.  

        * @return the patients not currently being treated.  

        */

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

 final               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        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        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        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)

 


Oppgave a)

 Skriv  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
 


...

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
    titleDel 2 - andre trinn av Doctor og Patient, samt testing. (30%)
    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
     
    Expand
    titleDel 3 - arv (20%)

    Fokus i del 3 er organisering av objektorientert kode med arv. Oppgaven kan derfor løses ved hjelp av pseudokode.

    Systemet skal støtte tre ulike logikker for å knytte doktor til pasient:

    • Pasienter knyttes til den første (men ikke nødvendigvis beste) doktoren som kan behandle en eller flere tilstander hos pasienten. (TreatmentUnit)
    • Pasientene kan ha tilstander med varierende kritikalitet, som gjør at de prioriteres foran resten av køen når en doktor er ledig. Gjør nødvendige antakelser om en getPriority-metode som brukes til prioritering. Per, som har en mer alvorlig skade enn Jens, vil altså behandles raskere selv om han kommer inn senere. (Såfremt ikke Jens allerede har startet behandling.) (PriorityTreatmentUnit)
    • Pågående pasientbehandling (selv om den er prioritert som over) skal kunne avbrytes og doktoren skal starte behandling av en ny pasient. Dette skal skje dersom det kommer inn en ny pasient, og dennes prioritet er høyere enn hos den som er til behandling. Du kan også her forutsette at det finnes en getPriority-metode i Patient. Anta at Jens er under behandling hos doktor Who. Ida kommer til behandling, har en tilstand med høyere prioritet enn Jens, og kan kun behandles av Who. Jens sin behandling blir derfor satt på vent, og den samme doktoren begynner behandling av Ida. (EmergencyPriorityTreatmentUnit)

    I denne deloppgaven skal du beskrive eller implementere støtte for disse egenskapene ved å bruke arv. Du finner ikke noe nytt skjelett til denne oppgaven, men du vil finne skjelettet fra del 2 for oppslag.

    Vi ønsker å ende opp med tre klasser, TreatmentUnit, PriorityTreatmentUnit og EmergencyPriorityTreatmentUnit, som implementerer hver sin logikk i lista over. Forskjellen dem i mellom skal være hvordan de implementerer startTreatment-metodene. De skal være knyttet sammen med arv for å gjøre det enkelt for andre klasser å bytte mellom dem og for å gi god gjenbruk, men detaljene i hvordan arvingsmekanismen brukes skal være opp til deg. Det er lov å innføre ekstra klasser og metoder i arvingshierarkiet, hvis det gjør løsningen bedre.

    Forklar med tekst og kode hvordan du vil 1) strukturere arvingshierarkiet og 2) hvilke metoder som deklareres/implementeres hvor. Skriv også kode for metodene. Siden fokuset her er mer på objektorientert organisering av kode, vil det også gis poeng for pseudokode.

    Expand
    titleLF

     

     

    Expand
    titleDel 4 - delegering (15%)

    Mens du i del 3 brukte arv, skal du i denne delen bruke delegering for å oppnå det samme. I henhold til delegeringsteknikken definerer vi et grensesnitt, DoctorAllocator. I tillegg lager du (minst) tre hjelpeklasser tilsvarende de tre logikkene beskrevet i del 3, som implementerer grensesnittet. Forklar hvordan koden i vedlagte TreatmentUnit-skjelett skal gjøres fullstendig slik at startTreatment-metoden bruker delegering riktig. Forklar også med tekst og/eller kode hvordan du vil utforme hjelpeklassene som implementerer DoctorAllocator.

    Da målet er å vise kunnskap om delegering kan dere bruke pseudokode i denne oppgaven. Det er greit å referere (pseudo)koden i del 3, hvis det er til hjelp.

    Expand
    titleLF

     

    Vi gjentar fra del 3 hvordan vi ønsker å knytte doktor til pasient, men dette skal nå gjøres ved å implementere DoctorAllocator i stedet for å bruke arv:

    • Pasienter knyttes til den første (og ikke nødvendigvis beste) doktoren som kan behandle en eller flere tilstander hos pasienten. 
    • Pasientene kan ha tilstander med varierende kritikalitet, som gjør at de prioriteres foran resten av køen når en doktor er ledig. Du kan forutsette at det finnes en getPriority-metode i Patient, og at denne prioriteten settes ved innlegging av pasientdata. Per, som har en mer alvorlig skade enn Jens, vil altså behandles raskere selv om han kommer inn senere. (Såfremt Jens ikke allerede har startet behandlingen.)
    • Pågående pasientbehandling (selv om den er prioritert) skal kunne avbrytes og doktoren skal starte behandling av en ny pasient. Dette skal skje dersom det kommer inn en ny pasient, og dennes prioritet er høyere enn hos pågående. Du kan også her forutsette at den finnes en getPriority-metode i Patient. Anta at Jens er under behandling hos doktor Who. Ida kommer har en tilstand med høyere prioritet enn Jens, og kan kun behandles av Who. Jens sin behandling blir derfor satt på vent, og den samme doktoren begynne behandling av Ida. 

     

    Alle pasienter har på forhånd blitt diagnostisert med en eller flere (helse)tilstander (conditions) som må behandles. Tilsvarende har alle doktorer et sett med tilstander som de er kompetente til å behandle. 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.

    Expand
    titleSkjelett del 2

    /**

     * A patient has a set of (health) conditions (of type String) that needs to be treated.

     * Supports iterating over the patient's conditions.

     */

    public class Patient {


           // Add fields, constructors, and methods here: // 2a

            // Support iteration // 2a

         /**

        * Indicates if this patient has conditions that needs to be treated.

        * @return true if this patient has conditions that needs to be treated,

        * false otherwise.

        */

           public boolean requiresTreatment() { // 2a

          ...

       }

    }


    /**

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

     * The doctor as a list of competencies (of type String) that

     * indicates what conditions s/he can treat.

     */

    public class Doctor {


           // Internal variables go here // 2b


           /**

        * Initialise this doctor with a set of competencies.

        * @param competencies

        */

           public Doctor(...) { // 2b

         ...

       }

          

           /**

         * Indicates to what extent this doctor can treat the provided patient.

         * The value is the number of the patient's conditions this doctor

         * can treat divided by the number of conditions the patient has.

         * Conditions and competences are matched using simple String comparison.

         * @param patient

         * @return the ratio of the patient's conditions that this

         * doctor can treat.

         */

           public double canTreat(final Patient patient) { // 2b

           ...

       }


           /**

        * "Treats" the patient by removing all the patient's conditions

        * that this doctor can treat.

        */

           public void treat() { // 2b

            ...

       }


           /**

        * @return the patient this doctor is treating, or null if s/he

        * isn't currently treating any patient.

        */

           public Patient getPatient() {

                 // Implementation hidden

       }


           /**

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

        * false.

        */

           public boolean isAvailable() {

                 // Implementation hidden

       }


           /**

        * 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) {

                  // Implementation hidden

       }

    }



    /**

     * 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 declaration hidden

          

           /**

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

        * is waiting.

        * @param doctor

        */

           public void addDoctor(final Doctor doctor) {

                 // Possible changes

       }


           /**

        * @return the currently available doctors

        */

           public Collection<Doctor> getAvailableDoctors() {

                 // Possible changes

          }


           /**

        * 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) {

               // Possible changes

       }


           /**

        * @param pred the predicate that the doctor must satisfy

        * @return some doctor satisfying the predicate

        */

           public Doctor getDoctor(final Predicate<Doctor> pred) {

              // Possible changes

       }


           /**

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

        * @param patient

        * @return the doctor treating the provided patient, or null if the

        * patient isn't currently being treated.

        */

           public Doctor getDoctor(final Patient patient) {

              // Possible changes

       }


           /**

        * Find all patients that are not currently being treated

        * @return the patients not currently being treated

        */

           public Collection<Patient> getWaitingPatients() {

                 // Possible changes

       }


           /**

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

        * Will only accept a patient that has some condition that the doctor actually

        * can treat.

        * @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) {

                 // Possible changes

       }


           /**

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

        * doctor to treat the patient.

        * Will only accept a doctor that actually can treat some condition for the

        * provided 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) {

                 // Possible changes

       }


           /**

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

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

        * otherwise another round of treatment is initiated.

        * 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) {

                 // Possible changes

       }

    }


    /**

     * Used to test TreatmentUnit

     */

    public class TreatmentUnitTest {


           private TreatmentUnit treatmentUnit;


           @Before

           public void setUp() {

                 ...

       }



           @Test

           public void testAddDoctorsPatient() {

              final Doctor doctor1 = new Doctor(...); // new doctor can treat "flu"

              final Doctor doctor2 = new Doctor(); // new doctor can treat "noseblead" and "pneumonia"

           treatmentUnit.addDoctor(doctor1);

           treatmentUnit.addDoctor(doctor2);

              // Test that both doctors are available.

           ...

                

               final Patient patient = new Patient();

            patient.addConditions(...); // patient has conditions "flu" and "noseblead"

               // 2e) start sequence diagram  

            treatmentUnit.addPatient(patient);

               // Test that only one of the doctors are available:

            ...

            Doctor patientDoctor = treatmentUnit.getDoctor(patient);

            patientDoctor.treat();

            treatmentUnit.treatmentFinished(patientDoctor);

         // 2e) end sequence diagram

               // Test that the previous doctor is available and that a

         // new doctor has been assigned to the patient.

             ...

                

             patientDoctor = treatmentUnit.getDoctor(patient);

             patientDoctor.treat();

              treatmentUnit.treatmentFinished(patientDoctor);

                 // Test that both doctors are available:

                 ...

       }

    }


     

    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
     



    Expand
    titleDel 3 - arv (20%)

    Fokus i del 3 er organisering av objektorientert kode med arv. Oppgaven kan derfor løses ved hjelp av pseudokode.


    Systemet skal støtte tre ulike logikker for å knytte doktor til pasient:

    • Pasienter knyttes til den første (men ikke nødvendigvis beste) doktoren som kan behandle en eller flere tilstander hos pasienten. (TreatmentUnit)
    • Pasientene kan ha tilstander med varierende kritikalitet, som gjør at de prioriteres foran resten av køen når en doktor er ledig. Gjør nødvendige antakelser om en getPriority-metode som brukes til prioritering. Per, som har en mer alvorlig skade enn Jens, vil altså behandles raskere selv om han kommer inn senere. (Såfremt ikke Jens allerede har startet behandling.) (PriorityTreatmentUnit)
    • Pågående pasientbehandling (selv om den er prioritert som over) skal kunne avbrytes og doktoren skal starte behandling av en ny pasient. Dette skal skje dersom det kommer inn en ny pasient, og dennes prioritet er høyere enn hos den som er til behandling. Du kan også her forutsette at det finnes en getPriority-metode i Patient. Anta at Jens er under behandling hos doktor Who. Ida kommer til behandling, har en tilstand med høyere prioritet enn Jens, og kan kun behandles av Who. Jens sin behandling blir derfor satt på vent, og den samme doktoren begynner behandling av Ida. (EmergencyPriorityTreatmentUnit)

    I denne deloppgaven skal du beskrive eller implementere støtte for disse egenskapene ved å bruke arv. Du finner ikke noe nytt skjelett til denne oppgaven, men du vil finne skjelettet fra del 2 for oppslag.

    Vi ønsker å ende opp med tre klasser, TreatmentUnit, PriorityTreatmentUnit og EmergencyPriorityTreatmentUnit, som implementerer hver sin logikk i lista over. Forskjellen dem i mellom skal være hvordan de implementerer startTreatment-metodene. De skal være knyttet sammen med arv for å gjøre det enkelt for andre klasser å bytte mellom dem og for å gi god gjenbruk, men detaljene i hvordan arvingsmekanismen brukes skal være opp til deg. Det er lov å innføre ekstra klasser og metoder i arvingshierarkiet, hvis det gjør løsningen bedre.

    Forklar med tekst og kode hvordan du vil 1) strukturere arvingshierarkiet og 2) hvilke metoder som deklareres/implementeres hvor. Skriv også kode for metodene. Siden fokuset her er mer på objektorientert organisering av kode, vil det også gis poeng for pseudokode.


    Expand
    titleSkjelett til del 2 gjentatt for oversikt over metoder

    /**
     * A patient has a set of conditions (of type String) that needs to be treated.
     */
    public class Patient {

        
        /**
         * Indicates if this patient has conditions that needs to be treated.
         * @return true if this patient has conditions that needs to be treated, 
         * false otherwise.
         */
        public boolean requiresTreatment() { // 2a
            // Implementation hidden
        }

    }


    /**
     * A doctor has the capacity to treat one patient at a time.
     * The doctor as a list of competencies (of type String) that
     * indicates what conditions s/he can treat.
     */
    public class Doctor {

        /**

         * Initialise this doctor with a set of competencies.
         * @param competencies
         */
        public Doctor(...) { // 2b
            // Implementation hidden
        }
        
        /**
         * Indicates to what extent this doctor can treat the provided patient.
         * The value is the number of the patient's conditions this doctor can
         * treat divided by the number of conditions the patient has.
         * Conditions and competences are matched using simple String comparison.
         * @param patient
         * @return the ratio of the patient's conditions that this doctor 
         * can treat.
         */
        public double canTreat(final Patient patient) { // 2b
            // Implementation hidden
        }

        /**
         * "Treats" the patient by removing all the patient's conditions 
         * that this doctor can treat.
         */
        public void treat() { // 2b
            // Implementation hidden
        }

        /**
         * @return the patient this doctor is treating, or null if s/he 
         * isn't currently treating any patient.
         */
        public Patient getPatient() {
            // Implementation hidden
        }

        /**
         * @return true if this doctor is currently treating a patient, 
         * otherwise false.
         */
        public boolean isAvailable() {
            // Implementation hidden
        }

        /**
         * 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) {
            // Implementation hidden
        }
    }

    /**
     * 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 declaration hidden
        
        /**
         * Adds a doctor and makes sure s/he starts treating a patient, if one 
         * is waiting.
         * @param doctor
         */
        public void addDoctor(final Doctor doctor) {
            // Possible changes
        }

        /**
         * @return the currently available doctors
         */
        public Collection<Doctor> getAvailableDoctors() {
            // Possible changes
        }

        /**
         * 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) {
            // Possible changes
        }

        /**
         * @param pred the predicate that the doctor must satisfy
         * @return some doctor satisfying the predicate
         */
        public Doctor getDoctor(final Predicate<Doctor> pred) {
            // Possible changes
        }

        /**
         * Find the doctor, if any, that treats the provided patient.
         * @param patient
         * @return the doctor treating the provided patient, or null if the 
         * patient isn't currently being treated.
         */
        public Doctor getDoctor(final Patient patient) {
            // Possible changes
        }

        /**
         * Find all patients that are not currently being treated
         * @return the patients not currently being treated
         */
        public Collection<Patient> getWaitingPatients() {
            // Possible changes
        }

        /**
         * Finds a waiting patient and sets him/her as the provided doctor's patient.
         * Will only accept a patient that has some condition that the doctor actually 
         * can treat.
         * @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) {
            // Implementation hidden
        }

        /**
         * Finds an available doctor for the provided patient, and sets that doctor to 
         * treat the patient.
         * Will only accept a doctor that actually can treat some condition for the 
         * provided 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) {
            // Implementation hidden
        }

        /**
         * Removes the link between doctor and patient, after treatment is finished.
         * If the patient is fully treated, s/he is removed from this treatment unit,
         * otherwise another round of treatment is initiated.
         * 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) {
            // Implementation hidden
        }
    }

     


    Expand
    titleLF

     


     

    Expand
    titleDel 4 - delegering (15%)

    Mens du i del 3 brukte arv, skal du i denne delen bruke delegering for å oppnå det samme. I henhold til delegeringsteknikken definerer vi et grensesnitt, DoctorAllocator. I tillegg lager du (minst) tre hjelpeklasser tilsvarende de tre logikkene beskrevet i del 3, som implementerer grensesnittet. Forklar hvordan koden i vedlagte TreatmentUnit-skjelett skal gjøres fullstendig slik at startTreatment-metoden bruker delegering riktig. Forklar også med tekst og/eller kode hvordan du vil utforme hjelpeklassene som implementerer DoctorAllocator.

    Da målet er å vise kunnskap om delegering kan dere bruke pseudokode i denne oppgaven. Det er greit å referere (pseudo)koden i del 3, hvis det er til hjelp.


    Expand
    titleSkjelett til del 4

     

    public interface DoctorAllocator {


           /**

        * Finds the patient in the TreatmentUnit that the provided doctor

        * should start treating.

        * Note: The method should be free of side effects, i.e. should not modify any object.

        * @param doctor

        * @param treatmentUnit

        * @return the patient that the doctor should treat, or null.

        */

           public Patient allocatePatient(Doctor doctor, TreatmentUnit treatmentUnit);

           

           /**

        * Finds the doctor in the TreatmentUnit that the provided patient

        * should be treated by.

        * Note: The method should be free of side effects, i.e. should not modify any object.

        * @param patient

        * @param treatmentUnit

        * @return The doctor that should treat the provided patient, or

        * null if none was found.

        */

           public Doctor allocateDoctor(Patient patient, TreatmentUnit treatmentUnit);

    }


    /**

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

     * When doctors or patients arrive, or a doctor finishes a treatment,

     * it is made sure that patients are treated as soon as possible.

     */

    public class TreatmentUnit {


           // Implementation of local variables hidden


           public void addDoctor(final Doctor doctor) {

                 // Implementation hidden

       }


           public Collection<Doctor> getAllDoctors() {

                 // Implementation hidden

       }


           public Collection<Doctor> getAvailableDoctors() {

                 // Implementation hidden

       }


           public void addPatient(final Patient patient) {

                 // Implementation hidden

       }


           public Doctor getDoctor(final Predicate<Doctor> pred) {

                 // Implementation hidden

       }


           public Doctor getDoctor(final Patient patient) {

                 // Implementation hidden

       }


           public Collection<Patient> getAllPatients() {

                 // Implementation hidden

       }


           public Collection<Patient> getWaitingPatients() {

                 // Implementation hidden

       }


      ... declarations related to the use of DoctorAllocator ... // Part 4


           protected boolean startTreatment(final Doctor doctor) { // Part 4

                 final Patient patient = ... use of DoctorAllocator here ... 

              ... more code here ...

       }


           protected boolean startTreatment(final Patient patient) { // Part 4

                 final Doctor doctor = ... use of DoctorAllocator here ...

                 ... more code here ...

       }


           public void treatmentFinished(final Doctor doctor) {

                 // Implementation hidden

       }

    }



    Expand
    titleLF

     


    Vi gjentar fra del 3 hvordan vi ønsker å knytte doktor til pasient, men dette skal nå gjøres ved å implementere DoctorAllocator i stedet for å bruke arv:

    • Pasienter knyttes til den første (og ikke nødvendigvis beste) doktoren som kan behandle en eller flere tilstander hos pasienten. 
    • Pasientene kan ha tilstander med varierende kritikalitet, som gjør at de prioriteres foran resten av køen når en doktor er ledig. Du kan forutsette at det finnes en getPriority-metode i Patient, og at denne prioriteten settes ved innlegging av pasientdata. Per, som har en mer alvorlig skade enn Jens, vil altså behandles raskere selv om han kommer inn senere. (Såfremt Jens ikke allerede har startet behandlingen.)
    • Pågående pasientbehandling (selv om den er prioritert) skal kunne avbrytes og doktoren skal starte behandling av en ny pasient. Dette skal skje dersom det kommer inn en ny pasient, og dennes prioritet er høyere enn hos pågående. Du kan også her forutsette at den finnes en getPriority-metode i Patient. Anta at Jens er under behandling hos doktor Who. Ida kommer har en tilstand med høyere prioritet enn Jens, og kan kun behandles av Who. Jens sin behandling blir derfor satt på vent, og den samme doktoren begynne behandling av Ida. 

     

    Expand
    titleDel 5 – observatør-observatør-teknikken og JavaFX (15%)

    På venterommet skal det være et informasjonspanel, som forteller ventende pasienter om hvilken doktor de skal gå til, når det er deres tur. Panelet implementeres med JavaFX, og tanken er at kontroller-objektet (av typen TreatmentUnitController ) skal lytte på et TreatmentUnit-objekt og få beskjed når koblingen mellom doktor og pasient etableres, slik at panelet kan vise en tekst av typen «Pasient X skal gå til Doctor Y» (du kan forvente at Patient og Doktor har en toString() som gir navn, dette trenger du ikke implementere i tidligere oppgaver).

    I denne delen kan du bygge videre på koden fra del 2. Du trenger altså ikke ha løst del 3 eller 4.

    Expand
    titleSkjelett til del 5

     // TreatmentUnit.fxml:

    <?xml version="1.0" encoding="UTF-8"?>


    <?import javafx.scene.layout.VBox?>

    <?import javafx.scene.control.Label?>

    <?import javafx.scene.layout.HBox?>

    <?import javafx.scene.text.Font?>


    <HBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="ord2019.part5.TreatmentUnitController">

                <Label fx:id="patientMessage" text="&lt;Her kommer meldinger til pasienter&gt;">

                </Label>

    </HBox>



    // TreatmentUnitController.java:

    public class TreatmentUnitController {


                TreatmentUnit treatmentUnit;

               

                public TreatmentUnitController() {

                            treatmentUnit = // assume treatmentUnit is set automatically.

                            ... 5 b) other initialization ...

                }


                ... 5 b) declarations and methods here...

    }

    Expand
    titleDel 5 – observatør-observatør-teknikken og JavaFX (15%)

    På venterommet skal det være et informasjonspanel, som forteller ventende pasienter om hvilken doktor de skal gå til, når det er deres tur. Panelet implementeres med JavaFX, og tanken er at kontroller-objektet (av typen TreatmentUnitController ) skal lytte på et TreatmentUnit-objekt og få beskjed når koblingen mellom doktor og pasient etableres, slik at panelet kan vise en tekst av typen «Pasient X skal gå til Doctor Y» (du kan forvente at Patient og Doktor har en toString() som gir navn, dette trenger du ikke implementere i tidligere oppgaver).

    I denne delen kan du bygge videre på koden fra del 2. Du trenger altså ikke ha løst del 3 eller 4.

    Oppgave 5a) – Lyttergrensesnitt

    Definer et egnet lyttergrensesnitt og forklar med tekst og kode hvordan TreatmentUnit må endres for å kunne fungere som observert i et observatør-observert-forhold.

    Expand
    titleLF

     


    Oppgave 5b) – Controller

    Fyll ut kodeskjelettet for kontrollerklassen TreatmentUnitController, slik at det fungerer med den vedlagte FXML-koden og fyller rollen som observatør av TreatmentUnit. Som indikert i kodeskjelettet, så kan du anta at treatmentUnit-variablen i kontrollerklassen settes «automagisk» i konstruktøren.

    Expand
    titleLF

     


    ...