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

How to Decouple a Legacy System
Maxi Contieri ⭐⭐⭐ ・ Mar 1 '21 ・ 7 min read
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 ・ 13 min read
This article is part of the CodeSmell Series.

How to Find the Stinky parts of your Code
Maxi Contieri ⭐⭐⭐ ・ May 21 '21 ・ 8 min read
Last update: 2021/06/30
Top comments (0)