Re: enums, using methods as initializers
mekane wrote:
Daniel Pitts wrote:
mekane wrote:
That is very specifically a Bad Idea!
f.extract should NOT have a switch statement, but instead should be
polymorphic.
What difference does it make? Anything other than I might forget to
add another case?
Is this more than just an implementation detail?
Yes, it is far more than an implementation detail, it is a design
principal.
Switch statements should be avoided. I know this is going to sound
snobby, but polymorphic behavior is far superior for this situation.
Not only is it likely to have better performance, it is easier to
refactor into a more useful idiom. Say someone wants to add a custom
field extractor, its easy to change these enums into a regular class,
and have the extract be a method in an interface. That way, the
client can say "extract this field with this approach."
I see. That makes sense, and I would agree that polymorphism is much
more elegant. But isn't the point of an enum to say "here are all the
possible values of this type, that's it". So a better design decision
here would be to use something other than enums in the first place.
Especially if you can't say for sure that the fields will never change.
To me, an enum and a switch work nicely together, especially when the
alternative is to write different versions of a big, complicated method
in the definition of an enum.
I'm not trying to argue, I'm just expressing an opinion.
Would you never use a switch?
I very much try to avoid switch (or if/elseif/elesif,etc..) as much as
feasible.
Switch is a remnant of procedural programming languages. Often times it
was used to create polymorphic behavior based on a "type" token. Well,
now you have a "type" that can do that polymorphic behavior for you.
I'm not saying there are NEVER times when you can use switch statements,
I'm just saying that by the time I need one switch statement, I probably
need two, and at that point its time to use polymorphism and create an
abstract method for each of my switch statements. As a mater of fact, I
would *love* a tool that could take an switch(enum) and convert it to
enum.method().
Hear that JetBrains? Make it happen :-)
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>