# .css-df1pn7{display:block;width:16rem;}

Photo by Markus Spiske on Unsplash

# Code Smell 160 - Invalid Id = 9999

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

Maxi Contieri
·Aug 30, 2022·

Subscribe to my newsletter and never miss my upcoming articles

• Problems
• Solutions
• Context
• Sample Code
• Detection
• Tags
• Conclusion
• Relations
• Disclaimer
• Credits

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()
{
return INVALID_VALUE;
}

// returns EXIT_FAILURE (1)
``````

## 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()
{
return false;
}

// returns EXIT_FAILURE (1)
``````

# Detection

[X] Semi-Automatic

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

• Null

# Conclusion

We should use numbers to relate to the external identifiers.

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

# Disclaimer

Code Smells are just my opinion.

# Credits

Photo by Markus Spiske on Unsplash

Bugs lurk in corners and congregate at boundaries.

Boris Beizer