DEV Community

loading...
Cover image for Code Smell 23 - Instance Type Checking

Code Smell 23 - Instance Type Checking

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

Do you check who are you talking to?

TL;DR: Trust your collaborators. Don't check who they are. Ask them to do instead.

Problems

Solutions

  1. Avoid kind, isKindOf, instance, getClass(), typeOf, etc..

  2. Don't use Reflection and Metaprogramming for Domain Objects.

  3. Replace IFs with polymorphism.

  4. Avoid checking for 'undefined'. Use complete objects, avoid nulls and setters, favor immutability and you will never have undefined and ifs.

Sample Code

Wrong

if (typeof(x) === 'undefined') {
    console.log('variable x is not defined');   
}

function isNumber(data) {
  return (typeof data === 'number');
}

function move(animal) {
  if (animal instanceof Rabbit) {
      animal.run()
  }
  if (animal instanceof Seagull) {
      animal.fly()
  } 
}

class Rabbit {
  run(){
    console.log("I'm running");
  }  
}

class Seagull {
  fly(){
    console.log("I'm flying");
  }  
}

let bunny = new Rabbit();
let livingstone = new Seagull();

move(bunny);
move(livingstone);
Enter fullscreen mode Exit fullscreen mode

Right

/*Avoid these methods
if (typeof(x) === 'undefined') {
    console.log('variable x is not defined');   
}

function isNumber(data) {
  return (typeof data === 'number');
}
*/

class Animal {
} 

class Rabbit extends Animal {
  move(){
    console.log("I'm running");
  }  
}

class Seagull extends Animal {
  move(){
    console.log("I'm flying");
  }  
}

let bunny = new Rabbit();
let livingstone = new Seagull();

bunny.move();
livingstone.move();
Enter fullscreen mode Exit fullscreen mode

Detection

Since type checking methods are well known it is very easy to set up a code policy checking the uses.

Tags

  • Metaprogramming

Conclusion

Testing for a class type couples the objects with accidental decisions and violates bijection since no such control exists on real world. It is a smell our models are not good enough.

Relations

More Info

Credits

Photo by Remy Gieling on Unsplash


This article is part of the CodeSmell Series.

Last update: 2021/07/06

Discussion (3)

Collapse
pedrohasantiago profile image
Pedro S

The sample in the "right" section is checking the types. The wrong and right samples are inverted, no?

Collapse
mcsee profile image
Maxi Contieri Author

hmm. not

Lines 1 to 9 are commented since they should not be done at all.
The rest is not checking any type as soon as I can see

Collapse
pedrohasantiago profile image
Pedro S

Oh, it is all good now. Weird, I could swear the snippets were inverted, sorry 🤔

Congrats on the series, the posts are great!