Disguised as a friendly shortcut is another coupling smell.
TL;DR: Optional Arguments generate a hidden coupling in the name of smaller code.
Problems
Coupling
Unexpected results
Side effects
Ripple Effect
In languages with optional arguments but limited to basic types, we need to set a flag and add an accidental IF (another smell).
Solutions
- Make arguments explicit.
- All function calls must have same arity.
- Use Named Parameters if your language supports them.
Sample Code
Wrong
<?
final class Poll {
function _construct(array $questions, bool $annonymousAllowed = false, $validationPolicy = 'Normal') {
if ($validationPolicy == 'Normal') {
$validationPolicy = new NormalValidationPolicy();
}
//...
}
}
//Valid
new Poll([]);
new Poll([], true);
new Poll([], true , new NormalValidationPolicy());
new Poll([], , new StrictValidationPolicy());
Right
<?
final class Poll {
function _construct(array $questions, AnonnyomousStrategy $annonymousStrategy, ValidationPolicy $validationPolicy) {
//...
}
}
//invalid
new Poll([]);
new Poll([], new NoAnonnyomousValidStrategy());
new Poll([], , new StrictValidationPolicy());
//Valid
new Poll([], new NoAnonnyomousValidStrategy(), new StrictValidationPolicy());
Detection
Detection is easy if language supports optional arguments.
Tags
Optional
Laziness
Conclusion
Be explicit. Favor readability over shorter (and more coupled) function call.
More info
The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.
Seymour Cray
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.
How to Find the Stinky parts of your Code
Maxi Contieri ・ May 21 '21
Last update: 2021/06/30
Top comments (0)