Code Smell 235 - Console Side Effects
TL;DR: Avoid side effects. Always.
Problems
Coupling
Testability
Reusability
Function Composition
Solutions
Decouple the code and avoid side-effects
Inject the output destination
Context
Outputting to the console within an internal function generates coupling and side effects
Sample Code
Wrong
function drawChristmasTree(height) {
let tree = '';
let currentFloor = 1;
while (currentFloor <= height) {
tree += ' '.repeat(height - currentFloor) + '๐'.repeat(currentFloor) + '\n';
currentFloor++;
}
// This function has side effects
// You cannot test it
console.log(tree);
}
drawChristmasTree(7);
Right
function createChristmasTree(height) {
let tree = '';
let currentFloor = 1;
while (currentFloor <= height) {
tree += ' '.repeat(height - currentFloor) + '๐'.repeat(currentFloor) + '\n';
currentFloor++;
}
return tree;
}
// The side effects are OUTSIDE the function
console.log(createChristmasTree(7));
// You can also test it
const createChristmasTree = createChristmasTree(7);
describe('createChristmasTree', () => {
it('should create a Christmas tree of the specified height', () => {
const expectedTree =
' ๐\n' +
' ๐๐\n' +
' ๐๐๐\n' +
' ๐๐๐๐\n' +
' ๐๐๐๐๐\n' +
' ๐๐๐๐๐๐\n' +
'๐๐๐๐๐๐๐\n';
const result = createChristmasTree(7);
expect(result).toEqual(expectedTree);
});
});
Detection
[X] Automatic
Several linters warn for this usage
Tags
- Globals
Conclusion
Instead of logging directly within internal functions, a more modular and flexible approach is to have functions return values or throw exceptions when errors occur.
The calling code can then decide how to handle and log these results based on the application's logging strategy.
Relations
Disclaimer
Code Smells are my opinion.
Credits
Image generated by Midjourney
Memory is like an orgasm. It's a lot better if you don't have to fake it.
Seymour Cray
This article is part of the CodeSmell Series.
Subscribe to my newsletter
Read articles from Maxi Contieri directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Maxi Contieri
Maxi Contieri
Iโm a senior software engineer loving clean code, and declarative designs. S.O.L.I.D. and agile methodologies fan.