DEV Community

loading...
Cover image for Code Smell 19 — Optional Arguments

Code Smell 19 — Optional Arguments

Maxi Contieri
Learn something new every day. - I am a senior software engineer working in industry, teaching and writing on software design, SOLID principles, DDD and TDD.
Originally published at maximilianocontieri.com Updated on ・2 min read

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

  1. Make arguments explicit.
  2. All function calls must have same arity.
  3. 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());
Enter fullscreen mode Exit fullscreen mode

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

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


The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.

Seymour Cray


This article is part of the CodeSmell Series.

Last update: 2021/06/30

Discussion (0)