Anti Pattern: Multiple Purposes for the same method
In a previous blog, we talked about the anti-pattern of partially filled objects. Another horrendous anti-pattern is defining a method that tries to be multi-purpose. This brings me to my next set of rules.
1. DO NOT Define a Method that does more than one well-defined task.
1a. Do not define a function that does completely opposite tasks in the same method
1b. Do not pass a boolean or any other parameter into a method that flags the method to behave completely differently than it was intended.
Let me give an example. Let's take the following method
void LoadProject (bool save)
{
// load the project into the project class
if (save == false)
GetProjectFromDatabase();
if (save == true)
{
SaveTheProject(_currentProject)
}
}
The fact that this project is doing two completely different tasks breaks the main rule #1. Since the method is accepting a boolean that changes the intended behavior of the method, this part of the definition breaks rule 1a and 1b.
You may think I'm making this up, but I just came across this in code, and I've even seen it before in some older standard libraries.
Correct Behavior
How should this method be refactored to defeat this scary anti-pattern? If we just think about rule #1, we can quickly come up with a solution. Simply divide the method into two well defined tasks and name them appropriately
void LoadProject()
{
GetProjectFromTheDatabase();
}
void SaveProject()
{
SaveTheProject(_currentProject);
}
Now it is very clear to other programmers looking at your code what each method is doing. Rule #1 is based on the basic CS concept of high cohesion