Identifica i metodi su OOP

4

Sto lottando per definire i metodi in OOP. Attualmente mi sto esercitando in questo scenario: "Un ospedale ha iniziato lo sviluppo di un nuovo sistema per conservare i registri delle analisi effettuati dai pazienti e dal medico che li ha richiesti."

Ho definito quattro classi: paziente, dottore, analisi e ospedale.

  • Paziente: rappresenta la persona che va all'ospedale. Può sapere quale analisi ha eseguito.
  • Medico: rappresenta un professionista della medicina. Può sapere quale analisi ha richiesto.
  • Analisi: rappresenta uno studio richiesto da un medico specifico per uno specifico paziente.
  • Ospedale: tiene traccia di medici, pazienti e analisi.

Questo è il diagramma della classe uml

Oranonmisentoamioagioconquestodiagrammaperché:

  1. Sequalsiasimetodohaaccessoaunpaziente,potrebbeeseguirejoe.addAnalysis(a)mal'analisi"a" non viene mai aggiunta all'ospedale. Ciò genererebbe incoerenza.
  2. Come sopra ma con dottore invece di paziente

Quindi nel mio secondo tentativo, ho rimosso i metodi addAnalysis() e getAllAnalysis() da Patient & %codice%. Ora Doctor ha

  • Hospital
  • getPatientAnalysis(p: Patient): Analysis[0..*]

Ma in questo caso non sarei in grado di chiedere direttamente a un paziente la loro lista di analisi. Lo stesso vale per i medici.

Quindi la domanda è: il mio secondo tentativo è migliore? Se è così, allora cosa succede con "i pazienti sanno quali studi hanno fatto"?

    
posta Gonzalo Fernandez 15.01.2018 - 13:31
fonte

2 risposte

7

I am struggling to define methods in OOP

Sicuro. Cosa dovrebbe fare questo? Questa è un'enorme pila di nomi inattivi. Hai bisogno di alcuni verbi. Questi potrebbero anche essere solo tabelle di database.

Questo è un design prematuro. Devi prima sviluppare i tuoi requisiti in modo da capire le tue esigenze. Per dimostrare che ne trarrò qualcosa per te.

hospital.bill(patient);
patient.printIDLabel(labelMaker3rdFloor);
doctor.prescribe(patient, medication);

L'ho detto con lo pseudo codice ma sei libero di usare l'intero costrutto della frase dei requisiti. "Come medico, devo essere in grado di aggiornare l'analisi del paziente con le prescrizioni dei farmaci."

Il tuo design dovrebbe concentrarsi sull'abilitazione di questi requisiti. Non prendere una lista di nomi e ossessionare su come sono costruiti. Questo non è lo stesso della progettazione di tabelle per un database. Il codice deve fare qualcosa con i dati. Non sei il primo a lottare con questo. Vedi Corrispondenza dell'impedenza relazionale dell'oggetto

    
risposta data 15.01.2018 - 21:10
fonte
-1

Mi sembra che tu stia combinando diverse responsabilità:

  • Uno sta creando un'analisi,
  • un altro sta memorizzando l'analisi e
  • l'ultimo è la navigazione tra pazienti, medici, analisi e ospedali

I dottori probabilmente sono quelli che creano le analisi. L'ospedale ha probabilmente i sistemi IT che memorizzano le analisi.

Da questo, i medici potrebbero fornire la creazione di analisi, mentre gli ospedali forniscono l'aggiunta di un'analisi al sistema di record.

Per quanto riguarda la navigazione, vogliamo essere in grado di passare dal paziente alla sua analisi, dal paziente al medico, dai medici alle loro analisi, dall'ospedale alle loro analisi, dall'ospedale ai loro pazienti, dall'ospedale alle i loro medici, dall'analisi al paziente, al medico e all'ospedale.

La modellazione può essere dettagliata utilizzando la tecnologia degli oggetti o utilizzando la tecnologia relazionale. Personalmente preferisco pensare prima al modello relazionale, cioè pensare alle tabelle e alle loro relazioni prima di diagrammare il diagramma delle classi con le loro relazioni interpersonali.

La ragione principale è che il modello relazionale offre una visione di livello superiore delle relazioni e la navigazione (bidirezionale) non dipende da 1: N o N: M. (Un'altra ragione è che il modello relazionale rappresenta la nostra persistenza a lungo termine, piuttosto che i comportamenti a breve termine del codice. E ancora un altro motivo è che il modello relazionale incoraggia la normalizzazione.)

Mentre usiamo la tecnologia degli oggetti tendiamo a pensare di più in termini di riferimenti unidirezionali. Tuttavia, in teoria, non importa quale sia la tecnologia da schematizzare.

La cosa principale da realizzare è che con relazioni unidirezionali dovremo probabilmente creare riferimenti in entrambe le direzioni per ottenere la navigazione bidirezionale (a meno che non ricorrere a complesse ricerche). Ciò significa che le informazioni vengono duplicate, ma è proprio così che è la tecnologia degli oggetti. (Questo è un altro motivo per cui preferisco il modello relazionale perché la normalizzazione tende ad eliminare / ridurre la duplicazione.)

Quindi, usando una tecnologia degli oggetti, avremo riferimenti e collezioni che supportano la navigazione che vogliamo, anche se alcuni degli oggetti (come le analisi) sono condivisi tra più raccolte. Pertanto, mentre la navigazione potrebbe dover essere supportata ovunque, è importante identificare le entità responsabili per la creazione di informazioni, apportare modifiche e memorizzare le informazioni e tenerle separate dalla navigazione generale.

    
risposta data 15.01.2018 - 18:23
fonte

Leggi altre domande sui tag