Is it ok to have subclass which does not declare its own variables (instance variables) and inherits from super class or base class? It has methods and there are some common methods which it overides but do not have variables of its own.
Is it ok to have subclasses which defines behavior only or I am missing something? I want to divide in subclasses to separate logic of my classes. I have Medication
class and I want to subclass to DailyMedication
, WeeklyMedication
but I have all my instance variable in Medication
as I do not have any specific for these classes. I want to make subclasses to divide logic as I have too much if conditions in my code.
MedicationEntity
name
dose
weekdays //in case of daily and monthly this is null
monthdays //in case of weekly and daily this is null
frequencyType //Daily or weekly or monthly
etc
EDIT: I want to make subclasses because these all classes have diffrent logic.I have enum of frequency
(for Daily,Weekly etc) in my Medication
class and this makes worse as i have to put all the checks in my code for these frequency type as if frequency is that than do that and if daily than do that as now i want to remove these switch conditions.
1)Also please suggest any good idea as weekdays is null if frequency is daily or monthly.But i need to send null to server.So where i can put weekdays if i subclass as it is not null only in case of weekly frequency but as i have to send null to server in request for all other frequencies.Should i put weekdays
in subclass if yes than how i send null to server if frequency is daily as DailyMedication
have no information about weekdays
.
Best Answer
Having three separate classes might make sense if you know you're going to add some special members to some of these subclasses and you just haven't gotten around to it yet (but you're going to really soon, right?).
Normally, I'd agree with the senior developer: This seems like an unecessary complication. Could you create an enumeration called
Frequency
and use that to determine which type ofMedication
you're dealing with, something like this pseudo-code:I suppose if you really want to keep the different implementations completely separate, you could try to inject specific algorithms into the
Medication
instances. Maybe something like this:Doing this in Java, You'd have a Spring configuration that might look like this:
To answer your quesion about
weekdays
andmonthdays
, there are many ways to do this and it's not very clear from your question just whatweekdays
andmonthdays
are. Since you show them to be single variables, I'll assume they are just comma-separate strings.It sounds like you also have columns in some table named
weekdays
andmonthdays
which need to be set to null if there is no value. Since you already know the frequency of theMedication
(via itssomeProcess.getFreq
), you know which field to set to null. The implementors ofMedicationProcess
can be required to implementgetWhen
, which will return the comma-separated list of days/month-days. With these two pieces of information, you can easily update the correct columns.Having
Medication
have knowledge over what to do when specificMedicationFrequencies
are encountered does break the design pattern a little bit. It's not great, but it's a simple solution.If you don't like that, you could include the column name that should be updated for a specific instance of
Medication
. Only slightly better - I don't like mixing that sort of low-level data access into such classes, but I haven't seen the rest of your design, so maybe it's OK here...Another option would be to have the
MedicationProcess
do its own database insert/update. This is a little trickier and I can't really give any concrete examples of how to do this without knowing the details about your schema, though I think this would be the best solution, if you can implement it.There are other ways to implement the strategy pattern, depending on the tools and frameworks available to you.
Also, see: https://stackoverflow.com/questions/17721623/advantages-of-using-strategy-pattern-in-php The question is PHP-specific, but the answer is not.