# Code Smell 289 - Shy Visitor

> TL;DR: Avoid combining the Visitor pattern with *instanceof* checks.

# Problems 😔

- Open/Closed principle violation
- Tight [Coupling](https://maximilianocontieri.com/coupling-the-one-and-only-software-design-problem)
- Maintainability
- Code duplication
- Poor readability
- Brittle design
- [IFs](https://maximilianocontieri.com/how-to-get-rid-of-annoying-ifs-forever)

# Solutions 😃

1. Implement the [Visitor pattern](https://en.wikipedia.org/wiki/Visitor_pattern) correctly.
2. Avoid *[instanceof](https://maximilianocontieri.com/code-smell-23-instance-type-checking)* checks.
3. Favor polymorphism.
4. Encapsulate behavior.

# Context 💬

When you use the *Visitor* pattern, you aim to **separate algorithms** from the objects they operate on.

Combining it with *instanceof* checks breaks this separation, leading to a **fragile and hard-to-maintain design**.

# Sample Code 📖

## Wrong 🚫

<!-- [Gist Url](https://gist.github.com/mcsee/a711d744ab165746e0da20f51fadf5fe) -->

```php
<?php

class SpaceObjectVisitor {
    public function visit(SpaceObject $object) {
        if ($object instanceof NeutronStar) {
            $this->visitNeutronStar($object);
        } elseif ($object instanceof Magnetar) {
            $this->visitMagnetar($object);
        } elseif ($object instanceof BlackHole) {
            $this->visitBlackHole($object);
        } 
        // Not closed for modification
    }

    private function visitNeutronStar(NeutronStar $star) {
        // Handle neutron star observation
    }

    private function visitMagnetar(Magnetar $magnetar) {
        // Handle magnetar observation
    }

    private function visitBlackHole(BlackHole $blackHole) {
        // Handle black hole observation
    }
}
```

## Right 👉

<!-- [Gist Url](https://gist.github.com/mcsee/360aace11de04e6cae87db8a8ed8cb7e) -->

```php
<?php

interface SpaceObject {
    public function accept(SpaceObjectVisitor $visitor): void;
}

class NeutronStar implements SpaceObject {
    public function accept(SpaceObjectVisitor $visitor): void {
        $visitor->visitNeutronStar($this);
    }
}

class Magnetar implements SpaceObject {
    public function accept(SpaceObjectVisitor $visitor): void {
        $visitor->visitMagnetar($this);
    }
}

class BlackHole implements SpaceObject {
    public function accept(SpaceObjectVisitor $visitor) {
        $visitor->visitBlackHole($this);
    }
}

class SpaceObjectVisitor {
    // Open for extension 
    // You can also convert it into an interface
    public function visitNeutronStar(NeutronStar $star): void {
        // Handle neutron star
    }

    public function visitMagnetar(Magnetar $magnetar): void {
        // Handle magnetar
    }

    public function visitBlackHole(BlackHole $blackHole): void {
        // Handle black hole
    }
}
```

# Detection 🔍

You can detect this smell by looking for *instanceof* checks within the Visitor pattern.

Automated tools can flag these checks, and code reviews can help identify them.

[X] Manual

# Tags 🏷️

- IFs

# Level 🔋

[X] Intermediate

# Why the Bijection Is Important 🗺️

When you model [real-world](https://maximilianocontieri.com/the-one-and-only-software-design-principle) objects, you should maintain a [one-to-one](https://maximilianocontieri.com/what-is-wrong-with-software) correspondence between the real-world entities and your code.

Breaking this correspondence using *instanceof* checks **(which do not exist on the model but the metamodel)** leads to a **mismatch** between the real world and your program.

# AI Generation 🤖

AI generators might create this smell if they are not properly guided.

# AI Detection 🥃

AI can help fix this smell by suggesting refactoring steps to remove *instanceof* checks and **use polymorphism** instead.

## Try Them! 🛠

*Remember: AI Assistants make lots of mistakes*

| Without Proper Instructions    | With Specific Instructions |
| -------- | ------- |
| [ChatGPT](https://chat.openai.com/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [ChatGPT](https://chat.openai.com/?q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) |
| [Claude](https://claude.ai/new?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [Claude](https://claude.ai/new?q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) |
| [Perplexity](https://perplexity.ai/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [Perplexity](https://perplexity.ai/?q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) |
| [Copilot](https://www.bing.com/chat?showconv=1&sendquery=1&q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [Copilot](https://www.bing.com/chat?showconv=1&sendquery=1&q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) |
| [Gemini](https://gemini.google.com/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [Gemini](https://gemini.google.com/?q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | 
| [DeepSeek](https://chat.deepseek.com/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [DeepSeek](https://chat.deepseek.com/?q=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | 
| [Meta AI](https://www.meta.ai/chat?question=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | [Meta AI](https://www.meta.ai/chat?question=remove+instanceOf+checks%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0Aclass+SpaceObjectVisitor+%7B%0D%0A++++public+function+visit%28SpaceObject+%24object%29+%7B%0D%0A++++++++if+%28%24object+instanceof+NeutronStar%29+%7B%0D%0A++++++++++++%24this-%3EvisitNeutronStar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+Magnetar%29+%7B%0D%0A++++++++++++%24this-%3EvisitMagnetar%28%24object%29%3B%0D%0A++++++++%7D+elseif+%28%24object+instanceof+BlackHole%29+%7B%0D%0A++++++++++++%24this-%3EvisitBlackHole%28%24object%29%3B%0D%0A++++++++%7D+%0D%0A++++++++%2F%2F+Not+closed+for+modification%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitNeutronStar%28NeutronStar+%24star%29+%7B%0D%0A++++++++%2F%2F+Handle+neutron+star+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitMagnetar%28Magnetar+%24magnetar%29+%7B%0D%0A++++++++%2F%2F+Handle+magnetar+observation%0D%0A++++%7D%0D%0A%0D%0A++++private+function+visitBlackHole%28BlackHole+%24blackHole%29+%7B%0D%0A++++++++%2F%2F+Handle+black+hole+observation%0D%0A++++%7D%0D%0A%7D%0D%0A%60%60%60) | 

# Conclusion ✔️

When you use the Visitor pattern, avoid combining it with *iskindOf* checks.

Using the *accept()* method, the visitor class doesn't need to **explicitly check** the object **type**.

Each object will call the appropriate visitor method honoring the [Open/Closed principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle).

Favor **polymorphism and encapsulation** to keep your code **clean** and maintainable.

# Relations 👩‍❤️‍💋‍👨

%[https://maximilianocontieri.com/code-smell-25-pattern-abusers]

%[https://maximilianocontieri.com/code-smell-23-instance-type-checking]

# More Information 📕

%[https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle]

%[https://maximilianocontieri.com/how-to-get-rid-of-annoying-ifs-forever]

# Disclaimer 📘

Code Smells are my [opinion](https://maximilianocontieri.com/i-wrote-more-than-90-articles-on-2021-here-is-what-i-learned).

# Credits 🙏

Photo by [Braňo](https://unsplash.com/@3dparadise) on [Unsplash](https://unsplash.com/photos/white-moon-in-black-background-K2MsWQc0M0k)

* * *

> The Visitor pattern is a way to add new operations to a set of objects without changing their classes.

_Erich Gamma_

%[https://maximilianocontieri.com/software-engineering-great-quotes]

* * *

This article is part of the CodeSmell Series.

%[https://maximilianocontieri.com/how-to-find-the-stinky-parts-of-your-code]
