DEV Community

Cover image for Code Smell 160 - Invalid Id = 9999
Maxi Contieri
Maxi Contieri

Posted on • Originally published at maximilianocontieri.com

2

Code Smell 160 - Invalid Id = 9999

Maxint is a very good number for an invalid ID. We will never reach it.

TL;DR: Don't couple real IDs with invalid ones. In fact: Avoid IDs.

Problems

  • Bijection violation

  • You might reach the invalid ID sooner than your think

  • Don't use nulls for invalid IDs either

  • Coupling flags from caller to functions

Solutions

  1. Model special cases with special objects.

  2. Avoid 9999, -1, and 0 since they are valid domain objects and implementation coupling.

  3. Introduce Null Object

Context

In the early days of computing, data types were strict.

Then we invented The billion-dollar mistake.

Then we grew up and model special scenarios with polymorphic special values.

Sample Code

Wrong

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define INVALID_VALUE 999

int main(void)
{    
    int id = get_value();
    if (id==INVALID_VALUE)
    { 
        return EXIT_FAILURE;  
        // id is a flag and also a valid domain value        
    }
    return id;
}

int get_value() 
{
  // something bad happened
  return INVALID_VALUE;
}

// returns EXIT_FAILURE (1)
Enter fullscreen mode Exit fullscreen mode

Right

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
// No INVALID_VALUE defined

int main(void)
{    
    int id;
    id = get_value();
    if (!id) 
    { 
        return EXIT_FAILURE;
        // Sadly, C Programming Language has no exceptions
    }  
    return id;
}  

get_value() 
{
  // something bad happened
  return false;
}

// returns EXIT_FAILURE (1)
Enter fullscreen mode Exit fullscreen mode

Detection

[X] Semi-Automatic

We can check for special constants and special values on the code.

Tags

  • Null

Conclusion

We should use numbers to relate to the external identifiers.

If no external identifier exists, then it is not a number.

Relations

More Info

Disclaimer

Code Smells are just my opinion.

Credits

Photo by Markus Spiske on Unsplash


Bugs lurk in corners and congregate at boundaries.

Boris Beizer


This article is part of the CodeSmell Series.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay