jQuery in Action, 3rd edition
The moose likes OO, Patterns, UML and Refactoring and the fly likes question about refactoring conditional logic Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Engineering » OO, Patterns, UML and Refactoring
Bookmark "question about refactoring conditional logic" Watch "question about refactoring conditional logic" New topic

question about refactoring conditional logic

Adam Sandler

Joined: Oct 06, 2008
Posts: 4

I'm having a hard time with implementing the notion of getting rid of some "if then else" hell.

Given the following code sample:

if (i = 1)
else if (i = 2)
else if (i = 3)
else (i = 4)

I looked in Fowler's "Refactoring"... but replace conditional with polymorphism doesn't seem to apply -- these aren't classes, they're method calls. I looked at http://polygoncell.blogspot.com/2008/07/as-many-people-already-met-there-are.html and all they did was replace the if block with switch. That doesn't really eliminate the conditional now does it? I also read somewhere else that I could use a map. The dilemma is my conditional calls methods, not make assignments... so something like this really doesn't work:

HashMap commandMap = new HashMap();
commandMap.put(1, method(1));
commandMap.put(2, method(2));
commandMap.put(3, method(3));
commandMap.put(4, method(4));

So while I'm NOT asking the forum to do my work for me, I am an applied learner... and given a couple of the sources I've cited in my post, I don't quite get getting rid of this conditional logic yet. What is the best way to get rid of this smell? Thanks!

Ilja Preuss

Joined: Jul 11, 2001
Posts: 14112
When the method name can be constructed from the parameter you use to distinguish them - as in your example code - one possibility is to use reflection.

Possibly your example code is just too much abstracted from your real code, though, and you can't apply that technique. In that case, can you show us your real code?

The soul is dyed the color of its thoughts. Think only on those things that are in line with your principles and can bear the light of day. The content of your character is your choice. Day by day, what you do is who you become. Your integrity is your destiny - it is the light that guides your way. - Heraclitus
Thomas V�lk

Joined: Jul 26, 2005
Posts: 7
If you can use an enum type instead of your number you would have the possibility to use constant-specific method implementations.

An example from the book "Effective Java":

I agree. Here's the link: http://aspose.com/file-tools
subject: question about refactoring conditional logic
jQuery in Action, 3rd edition