Avere tre classi separate potrebbe avere senso se conosci aggiungerai alcuni membri speciali ad alcune di queste sottoclassi e non hai ancora trovato ancora > em> (ma lo farai davvero presto, vero?).
Normalmente, sono d'accordo con lo sviluppatore senior: sembra una complicazione inutile. Potresti creare un'enumerazione chiamata Frequency
e usarla per determinare quale tipo di Medication
hai a che fare, qualcosa come questo pseudo-codice:
Enum MedicationFrequency{MONTHLY, DAILY, WEEKLY, HOURLY}
class Medication
{
private MedicationFrequency frequency;
...
}
Suppongo che se si vuole veramente tenere separate le diverse implementazioni, si potrebbe provare ad iniettare algoritmi specifici nelle istanze Medication
. Forse qualcosa del genere:
Interface MedicationProcess
{
public void doSomething();
public String getWhen();
public MedicationFrequency getFreq();
}
class WeeklyMedProcess implements MedicationProcess
{
String weekdays;
public MedicationFrequency getFreqy() { return MedicationFrequency.WEEKLY;}
public String getWhen() { return weekdays; }
//...
}
class DailyMedProcess implements MedicationProcess
{
public MedicationFrequency getFreqy() { return MedicationFrequency.DAILY;}
//...
}
class MonthlyMedProcessimplements MedicationProcess
{
String monthdays;
public MedicationFrequency getFreqy() { return MedicationFrequency.MONTHLY;}
public String getWhen() { return monthdays; }
//...
}
class Medication
{
private MedicationProcess someProcess;
private String updateColumnName;
public void setUpdateColumnName(String s)
{
this.updateColumnName= s;
}
public void setProcess(MedicationProcess p)
{
this.someProcess = p;
}
public doMedicationThing()
{
this.someProcess.doSomething();
}
}
Facendo questo in Java, avresti una configurazione Spring che potrebbe assomigliare a questa:
<bean id="dailyMedProc" class="DailyMedProcess/>
<bean id="weeklyMedProc" class="WeeklyMedProcess/>
<bean id="medication1" class="Medication">
<property name="process" ref="dailyMedProc/>
<property name="updateColumnName" value="weekdays"/>
</bean>
<bean id="medication" class="Medication">
<property name="process" ref="weeklyMedProc/>
<property name="updateColumnName" value="monthdays"/>
</bean>
Per rispondere alla tua domanda su weekdays
e monthdays
, ci sono molti modi per farlo e dalla tua domanda non è chiaro quale sia weekdays
e monthdays
. Dato che li mostri come variabili singole, presumo che siano solo stringhe separate da virgole.
Sembra che tu abbia anche colonne in alcune tabelle denominate weekdays
e monthdays
che devono essere impostate su null se non c'è alcun valore. Dato che conosci già la frequenza del Medication
(tramite il suo someProcess.getFreq
), sai quale campo impostare su null. Gli implementatori di MedicationProcess
possono essere richiesti per implementare getWhen
, che restituirà l'elenco separato da virgola di giorni / mesi-giorni. Con queste due informazioni, puoi facilmente aggiornare le colonne corrette.
Avere Medication
ha una conoscenza su cosa fare quando si incontra uno specifico MedicationFrequencies
interrompe un po 'il modello di progettazione. Non è grandioso, ma è una soluzione semplice.
Se non ti piace, potresti includere il nome della colonna che dovrebbe essere aggiornato per un'istanza specifica di Medication
. Solo leggermente migliore - Non mi piace mescolare questo tipo di accesso ai dati di basso livello in tali classi, ma non ho visto il resto del tuo progetto, quindi forse è OK qui ...
Un'altra opzione potrebbe essere il fatto che MedicationProcess
faccia il proprio inserimento / aggiornamento del database. Questo è un po 'più complicato e non posso davvero dare esempi concreti di come farlo senza conoscere i dettagli del tuo schema, anche se penso che questa sarebbe la soluzione migliore, se puoi implementarla.
Esistono altri modi per implementare il modello di strategia , a seconda degli strumenti e dei framework a tua disposizione.
Vedi anche: link La domanda è specifica per PHP , ma la risposta non lo è.