For the complete documentation index, see llms.txt. This page is also available as Markdown.

Types of Code Smells

About

Code smells can be categorized based on the kind of problem they indicate whether it's structural, behavioral, or related to object-oriented misuse. Understanding these categories helps in identifying and addressing them systematically.

Here are the most common types of code smells -

1. Bloaters

These are code elements that have grown too large or too complex, making them hard to understand and maintain.

  • Long Method: A method that does too much or spans too many lines.

  • Large Class: A class that tries to handle too many responsibilities.

  • Long Parameter List: Methods with too many parameters, reducing clarity.

  • Primitive Obsession: Overuse of primitive types instead of small domain-specific objects.

  • Data Clumps: Groupings of variables that often appear together but are not encapsulated.

2. Object-Oriented Abusers

These smells arise from violations of object-oriented principles such as encapsulation or inheritance.

  • Switch Statements: Overuse of conditional logic instead of polymorphism.

  • Temporary Field: Fields that are only sometimes used by an object.

  • Refused Bequest: Subclass uses only some of the inherited methods or fields.

  • Alternative Classes with Different Interfaces: Two classes that do similar things but have different method names.

3. Change Preventers

These smells make code hard to change or extend due to tight coupling or scattering.

  • Divergent Change: One class needs to change for many different reasons.

  • Shotgun Surgery: A single change requires edits in many different classes.

  • Parallel Inheritance Hierarchies: Whenever you create a subclass in one hierarchy, you must create a corresponding subclass in another.

4. Dispensables

These are unnecessary or redundant code elements that clutter the codebase.

  • Duplicate Code: Same logic appearing in multiple places.

  • Dead Code: Code that is never executed or used.

  • Speculative Generality: Code written for anticipated future use that never materializes.

  • Lazy Class: Classes that are not doing enough to justify their existence.

  • Comments: Overuse of comments in place of readable, self-explanatory code.

5. Couplers

These smells indicate excessive dependencies between classes, violating the principle of low coupling.

  • Feature Envy: A method that uses more features of another class than its own.

  • Inappropriate Intimacy: Classes that are too familiar with each other's internals.

  • Message Chains: A client asks one object for another and so on — a chain of method calls.

  • Middle Man: A class that delegates most of its functionality elsewhere.

6. Concurrency Smells

These arise when multi-threaded code is poorly structured:

  • Shared Mutable State: Multiple threads accessing/modifying the same data unsafely.

  • Excessive Locking: Unnecessary or broad synchronization that harms performance.

  • Deadlocks: Circular dependencies in locks leading to blocked threads.

7. Architecture Smells

These occur at a higher level than individual classes or methods.

  • Cyclic Dependencies: Modules or packages depend on each other circularly.

  • God Object / God Class: A class that knows too much or does too much.

  • Unstable Dependencies: High-level modules depend on low-level ones that change frequently.

Last updated