The inevitable cons of overloading methods

Day 1

You see a simple method that draws a triangle. Currently, it takes in
a specific size:

drawTriangle(float size);

You’ve been told that in the past, we only needed one kind of
triangle. Now we need to be able to choose the color. No biggie, we
have the power to overload methods in our language! We’ll simply add
an extra parameter, and have the method overload:

drawTriangle(float size) { drawTriangle(size, WHITE) }

drawTriangle(float size, Color color);

Day 14

Now we have a new problem. We need a triangle that changes from one
color to another, a gradient. You think to yourself: I can either
overload the method, or I can make a new method. Which is better?

I can create a new method, but it seems like this still fits in the
‘drawTriangle’ category. It’s fine. Let’s add it:

drawTriangle(float size) { drawTriangle(size, WHITE) }

drawTriangle(float size, Color color);

drawTriangle(float size, Color firstColor, Color secondColor);

Future developers will understand for sure.

Day 35

So I’ve overridden this method a few more times. I’ve had to add
rotation speed, and a size increase rate. Sometimes I need both, so
I’ve added a few more methods to handle the combinations I need. I’ve
also added method to pass all the options just in case.

Darn! The method signatures will collide if I add the size increase
rate, because it clashes with rotationSpeed. I guess I’ll have to add
an extra method like color to keep the signatures different. I could
use the full method, but that’s a lot of time.

drawTriangle(float size);

drawTriangle(float size, float rotationSpeed);

drawTriangle(float size, Color color);

drawTriangle(float size, Color color, float increaseRate);

drawTriangle(float size, float rotationSpeed, float increaseRate);

drawTriangle(float size, Color firstColor, Color secondColor);

drawTriangle(float size, float rotationSpeed, Color firstColor, Color secondColor, float increaseRate);

It’s okay, I can keep track of these. It’s tricker than I want, but nothing I can’t handle.

Day 145

Okay… It’s my first day on the job. The old developer who maintained
this left three months ago. I’ve been asked to creating a new triangle
drawing application. Luckily this library can already draw these
rectangles. Let me take a look…

Woah. There’s nine methods for drawing a triangle? Which should I use?
Which one is he using in this case? Does this mean every time I see
this method, I’m going to either already be familiar with the specific
overrided version of that method, or dig through the code until I
understand? This is going to be a long day…

Summary

Overriding methods works great for those cases where you can keep the
variations to a minimum. When you need arbitrary combinations of
various properties, you’re better off either building a new method
that more accurately describes what you’re trying to do, or use
getters and setters later on to configure your piece to what you want.

  • the gradient triangle should have had a separate method, to help alleviate any confusion as to what the second color does.
  • rotationSpeed could have been set elsewhere as well. no need to add into the constructor unless every triangle should have it set explicitely.

Author: toumorokoshi

Love to code, love emacs!