DEV Community

Cover image for Code Smell 255 - Parallel Hierarchies
Maxi Contieri
Maxi Contieri

Posted on • Originally published at maximilianocontieri.com

6

Code Smell 255 - Parallel Hierarchies

Double Trouble: The Curse of Redundant Structures

TL;DR: Parallel hierarchies lead to duplication and tight coupling.

Problems

  • Increased complexity

  • DRY / Code Duplication

  • Maintenance Nightmare

  • Coupling

  • Ripple Effect

  • Potential for inconsistencies across different hierarchies

Solutions

  1. Merge hierarchies

  2. Use composition

  3. Extract Common Functionality

Refactorings

Context

Parallel hierarchies occur when you must make a counterpart every time you create a domain class.

The counterpart might be persistence, UI, Controller, tests, Serialization, etc

This leads to duplicate structures and tight coupling.

Changes in the domain model require changes in the parallel classes, making the system more brittle and harder to manage.

Sample Code

Wrong

// Domain classes
abstract class Transaction {
    private String id;
    private double amount;
}

class BankTransaction extends Transaction {
    private String bankName;
}

class CreditCardTransaction extends Transaction {
    private String cardNumber;
}

// Persistence classes
abstract class TransactionDAO {
    private String id;
    private double amount;
}

class BankTransactionDAO extends TransactionDAO {
    private String bankName;
}

class CreditCardTransactionDAO extends TransactionDAO {
    private String cardNumber;
}
Enter fullscreen mode Exit fullscreen mode

Right

public class TransactionService {
    private EntityManager entityManager;

    public TransactionService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public void saveTransaction(Transaction transaction) {
        entityManager.getTransaction().begin();
        entityManager.persist(transaction);
        entityManager.getTransaction().commit();
    }

    public Transaction loadTransaction(
        Long id, Class<? extends Transaction> transactionClass) {
        return entityManager.find(transactionClass, id);
    }
}
Enter fullscreen mode Exit fullscreen mode

Detection

[X] Semi-Automatic

You can detect this smell by traversing the hierarchies

Exceptions

  • Some frameworks force you to extend your domain using this technique

Tags

  • Hierarchies

Level

[X] Intermediate

AI Generation

AI generators often create this smell by mirroring domain models in persistence layers without understanding the implications, leading to unnecessary duplication.

AI Detection

AI Assistants can fix this smell with instructions to consolidate hierarchies and use composition, reducing duplication and improving maintainability.

ChatGPT offered a solution using 'Instanceof' which is an even worse code smell

Conclusion

Parallel hierarchies create unnecessary complexity and make the codebase harder to maintain.

They bring deep hierarchies which is a symptom of subclassification for code reuse

You can merge the hierarchies and use composition to simplify the design and improve the system's robustness.

You can use Metaprogramming to manage the persistence or the unit tests.

Metaprogramming is also a code smell when you use it for domain problems, but persistence and testing are orthogonal domains.

Relations

More Info

Disclaimer

Code Smells are my opinion.

Credits

Foto de ArtisanalPhoto en Unsplash


Inheritance is surely a good answer but who knows the questions?

Michel Gauthier


This article is part of the CodeSmell Series.

AWS Q Developer image

What is MCP? No, Really!

See MCP in action and explore how MCP decouples agents from servers, allowing for seamless integration with cloud-based resources and remote functionality.

Watch the demo

Top comments (0)

Build gen AI apps that run anywhere with MongoDB Atlas

Build gen AI apps that run anywhere with MongoDB Atlas

MongoDB Atlas bundles vector search and a flexible document model so developers can build, scale, and run gen AI apps without juggling multiple databases. From LLM to semantic search, Atlas streamlines AI architecture. Start free today.

Start Free

👋 Kindness is contagious

Dive into this thoughtful piece, beloved in the supportive DEV Community. Coders of every background are invited to share and elevate our collective know-how.

A sincere "thank you" can brighten someone's day—leave your appreciation below!

On DEV, sharing knowledge smooths our journey and tightens our community bonds. Enjoyed this? A quick thank you to the author is hugely appreciated.

Okay