Compreender o código firmemente acoplado

Concluído

O código fortemente acoplado ocorre quando os componentes são excessivamente dependentes dos detalhes de implementação uns dos outros. A dependência pode tornar seu código mais difícil de manter, menos flexível e mais propenso a bugs. Uma solução comum é usar interfaces para separar componentes e melhorar a modularidade.

Na tua função como programador de software, encontras os desafios de código fortemente acoplado onde há uma dependência direta. Você aplica o Princípio Aberto/Fechado para abordar o desacoplamento de seu código para criar um sistema mais fácil de manter.

Código firmemente acoplado

Código fortemente acoplado refere-se a uma situação em que um componente depende fortemente dos detalhes internos de outro. Isso cria um sistema rígido que é difícil de modificar ou estender sem quebrar a funcionalidade existente.

Exemplo de dependência direta

Considere uma Library classe que interage diretamente com uma BorrowableBook classe. A Library classe depende da implementação específica de BorrowableBook para realizar operações de empréstimo.

public class BorrowableBook
{
    public string Title { get; set; }
    public bool IsAvailable { get; private set; } = true;

    public BorrowableBook(string title)
    {
        Title = title;
    }

    public void Borrow()
    {
        if (IsAvailable)
        {
            IsAvailable = false;
            Console.WriteLine($"You have borrowed \"{Title}\".");
        }
        else
        {
            Console.WriteLine($"\"{Title}\" is already borrowed.");
        }
    }
}

public class Library
{
    private BorrowableBook _book;

    public Library(BorrowableBook book)
    {
        _book = book;
    }

    public void BorrowBook()
    {
        if (_book.IsAvailable)
        {
            _book.Borrow();
        }
        else
        {
            Console.WriteLine("The book is not available.");
        }
    }
}

Neste código, a Library classe depende diretamente da BorrowableBook classe. Embora a dependência funcione para um único tipo de item emprestável, ela introduz duas questões principais:

  • Dependência direta: A classe Library está fortemente acoplada ao tipo BorrowableBook. Se você quiser adicionar novos itens emprestáveis (por exemplo, DVDs, revistas), será necessário modificar a Library classe.
  • Extensibilidade limitada: O design atual dificulta a extensão da funcionalidade sem alterar o código existente.

Este acoplamento apertado viola o Princípio Aberto/Fechado (OCP), que afirma que o software deve estar aberto para extensão, mas fechado para modificação. Em outras palavras, você deve ser capaz de adicionar novos recursos sem alterar o código existente.

Ao reduzir as dependências, você pode:

  • Melhorar a capacidade de manutenção: Alterações em uma parte do sistema são menos prováveis de afetar outras.
  • Aumente a flexibilidade: novos recursos podem ser adicionados sem modificar o código existente.
  • Simplifique os testes: os componentes podem ser testados de forma independente.

Para resolver o problema, você precisa refatorar o código usando interfaces para torná-lo mais modular e flexível.