Magic functions that can receive a lot of different (and not polymorphic arguments)
TL;DR: Create a clear contract. Expect just one protocol.
Problems
Fail Fast principle violation
Error prune
Readability
Bad Cohesion
Solutions
Take just one "kind" of input
Arguments should adhere to a single protocol.
Sample Code
Wrong
<?
function parseArguments($arguments) {
$arguments = $arguments ?: null;
//Always the billion-dollar mistake
if (is_empty($arguments)) {
$this->arguments = http_build_query($_REQUEST);
//Global coupling and side effects
} elseif (is_array($arguments)) {
$this->arguments = http_build_query($arguments);
} elseif (!$arguments) { //null unmasked
$this->arguments = null;
} else {
$this->arguments = (string)$arguments;
}
}
Right
<?
function parseArguments(array $arguments) {
$this->arguments = $arguments;
//much cleaner, isn't it ?
}
Detection
We can detect this kind of method when they do different things, asking for the argument kind.
Tags
- If Polluter
Conclusion
Magic castings and flexibility have a price. They put the rubbish under the rug and violate the fail fast principle.
Relations
Credits
Photo by Hennie Stander on Unsplash
Referential transparency is a very desirable property: it implies that functions consistently yield the same results given the same input, irrespective of where and when they are invoked.
Edward Garson
This article is part of the CodeSmell Series.