You assign a value to a variable and use it, but never change it
TL;DR: Be declarative on mutability.
Problems
Readability
Honor the Bijection mutability.
Potential performance and memory issues.
Solutions
- Change the variable to a constant and be clear on its scope
Context
We are always learning from the domain.
Sometimes we guess that a value can change with the MAPPER.
Later on, we learn it won't change.
Therefore we need to promote it to a constant.
This will also avoid Magic Constants
Sample Code
Wrong
<?php
function configureUser() {
$password = '123456';
// Setting a password on a variable is another vulnerability
// And Code Smell
$user = new User($password);
// Notice Variable doesn't change
}
Right
<?php
define("USER_PASSWORD", '123456')
function configureUser() {
$user = new User(USER_PASSWORD);
}
// or
function configureUser() {
$user = new User(userPassword());
}
function userPassword() : string {
return '123456';
}
// Case is oversimplification as usual
Detection
[X] Automatic
Many linters check if the variable has just one assignment.
We can also perform mutation testing and try to modify the variable to see if tests break.
Tags
- Mutability
Conclusion
We must challenge ourselves and refactor when the variable scope is clear and we learn more about its properties and mutability.
Relations
Code Smell 127 - Mutable Constants
Maxi Contieri ・ Apr 5 '22
Code Smell 02 - Constants and Magic Numbers
Maxi Contieri ・ Oct 21 '20
Refactorings
Refactoring 003 - Extract Constant
Maxi Contieri ・ Jan 2 '22
More Info
Disclaimer
Code Smells are just my opinion.
Credits
Photo by Noah Buscher on Unsplash
A complex system that works is invariably found to have evolved from a simple system that worked.
John Gall
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.