Code Smell 59 - Basic / Do Functions
Maxi Contieri
Posted on January 27, 2021
sort, doSort, basicSort, doBasicSort, primitiveSort, superBasicPrimitiveSort, who does the real work?
TL;DR: Shortcuts for mini wrappers shout for better solutions.
Problems
Readability
Bad Naming
Low Cohesion
Single Responsibility Principle
Solutions
Use good object wrappers
Use dynamic decorators
Sample Code
Wrong
<?
final class Calculator {
private $cachedResults;
function computeSomething() {
if (isset($this->cachedResults)) {
return $this->cachedResults;
}
$this->cachedResults = $this->logAndComputeSomething();
}
private function logAndComputeSomething() {
$this->logProcessStart();
$result = $this->basicComputeSomething();
$this->logProcessEnd();
return $result;
}
private function basicComputeSomething() {
/// Do Real work here
}
}
Right
<?
final class Calculator {
function computeSomething() {
// Do Real work here since I am Compute!
}
}
//Clean and cohesive class, single responsibility
final class CalculatorDecoratorCache {
private $cachedResults;
private $decorated;
function computeSomething() {
if (isset($this->cachedResults)) {
return $this->cachedResults;
}
$this->cachedResults = $this->decorated->computeSomething();
}
}
final class CalculatorDecoratorLogger {
private $decorated;
function computeSomething() {
$this->logProcessStart();
$result = $this->decorated->computeSomething();
$this->logProcessEnd();
return $result;
}
}
Detection
We can instruct our static linters to find wrapping methods if they follow conventions like doXXX(), basicXX() etc.
Tags
- Declarativiness
Conclusion
We came across this kind of methods some time in our developer life, We smelled something was not OK with them. Now is the time to change them!
More info
What exactly is a name - Part II Rehab
Maxi Contieri ・ May 23 '21
%[https://en.wikipedia.org/wiki/Wrapper_function]
%[https://en.wikipedia.org/wiki/Decorator_pattern]
Credits
Photo by Roger Bradshaw on Unsplash
The primary disadvantage of Wrap Method is that it can lead to poor names. In the previous example, we renamed the pay method dispatchPay() just because we needed a different name for code in the original method.
_ Michael Feathers_
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.
Posted on January 27, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.