Code Smell 235 - Console Side Effects

Maxi Contieri - Dec 24 '23 - - Dev Community

You compute and log in the same place

TL;DR: Avoid side effects

Problems

  • Coupling

  • Testability

  • Reusability

  • Function Composition

Solutions

  1. Decouple the code and avoid side-effects

  2. 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);
Enter fullscreen mode Exit fullscreen mode

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);
  });

});

Enter fullscreen mode Exit fullscreen mode

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.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .