Skip to content

Coupling & Cohesion

Definition

Coupling and Cohesion Definition


Types of Coupling (Worst to Best)

Coupling Types


Types of Cohesion (Worst to Best)

Cohesion Types


Code Examples

// HIGH COUPLING - Tight dependencies
class OrderService {
    // Direct dependency on concrete class
    private MySQLDatabase database = new MySQLDatabase();
    // Depends on internal implementation details
    private PaymentGateway gateway = PaymentGateway.getInstance();

    public void createOrder(Order order) {
        // Directly accessing another class's internals
        if (InventoryManager.stock.get(order.productId) > 0) {
            database.query("INSERT INTO orders...");  // SQL coupling
            gateway.chargeCard(order.user.creditCard.number);  // Deep access
        }
    }
}

// LOW COUPLING - Loose dependencies
class OrderService {
    // Depend on interfaces, not implementations
    private final OrderRepository orderRepo;
    private final InventoryService inventory;
    private final PaymentService payment;

    // Dependencies injected
    public OrderService(OrderRepository orderRepo,
                       InventoryService inventory,
                       PaymentService payment) {
        this.orderRepo = orderRepo;
        this.inventory = inventory;
        this.payment = payment;
    }

    public void createOrder(Order order) {
        // Communicate via well-defined interfaces
        if (inventory.isAvailable(order.getProductId())) {
            orderRepo.save(order);
            payment.charge(order.getPaymentDetails());
        }
    }
}

Cohesion Examples

// LOW COHESION - Unrelated responsibilities
class UserManager {
    public User createUser(String name) { ... }
    public void sendEmail(String to, String body) { ... }
    public Report generateSalesReport() { ... }
    public void backupDatabase() { ... }
    public double calculateTax(double amount) { ... }
}

// HIGH COHESION - Single, focused responsibility
class UserService {
    public User create(CreateUserRequest request) { ... }
    public User findById(UserId id) { ... }
    public User update(UserId id, UpdateUserRequest request) { ... }
    public void delete(UserId id) { ... }
    public List<User> findByRole(Role role) { ... }
}

class EmailService {
    public void send(Email email) { ... }
    public void sendBulk(List<Email> emails) { ... }
    public EmailStatus checkStatus(EmailId id) { ... }
}

class TaxCalculator {
    public Money calculate(Money amount, TaxRate rate) { ... }
    public Money calculateWithExemptions(Money amount, List<Exemption> exemptions) { ... }
}

Microservices Coupling

Microservices Coupling


Reducing Coupling Techniques

Coupling Reduction Techniques


Tips & Tricks

Coupling and Cohesion Tips