Objeto Vs. Estrutura de Dados - Clean Code

← ← ←   29/08/2022 16:16:55 | Postado por: Danilo Maia Florenzano


Vejo muito no Linkedin posts sobre “dicas de Clean Code”, e apesar de muito úteis, sempre trazem o mesmo conteúdo: como nomear funções e variáveis, evitar comentários e um pouco sobre o princípio de responsabilidade única.

É verdade que esses são os assuntos dos primeiros capítulos do livro do Uncle Bob, mas ele vai bem além desses aspectos. E eu vou tentar trazer sobre o início do 6° capítulo, que trata sobre o título deste artigo e que me interessou muito.

Mas afinal, qual a diferença entre data objetos e estruturas de dados? E a resposta que o livro traz é: Os objetos usam abstrações para esconder seus dados, e expõem as funções que operam em tais dados. As estruturas de dados expõem seus dados e não possuem funções significativas.

Essa explicação por si só já é muito boa na minha opinião. Mas vamos ver exemplos em C#:

public class Quadrado
  {
      public double Lado { get; set; }
  }
  
  public class Circulo
  {
      public double Raio { get; set; }
  }
  
  public class Geometria
  {
      public const double Pi = 3.141592;
  
      public double Area(Object forma)
      {
          if (forma is Quadrado)
          {
              Quadrado s = (Quadrado)forma;
              return s.Lado * s.Lado;
          }
          
          Circulo c = (Circulo)forma;
          return Pi * c.Raio * c.Raio;
      }
  }

No exemplo acima, as classes Quadrado e Circulo são simples estruturas de dados e todos os métodos estão na classe Geometria. E o paradigma usado no exemplo foi o procedural. Ok, e como seria essa solução orientada a objeto?

public class Quadrado : Forma
  {
    private double Lado { get; set; }
  
    public double Area()
    {
      return Lado * Lado;
    }
  }
  
  public class Circulo : Forma
  {
    private double Raio { get; set; }
    public const Pi = 3.141592;
  
    public double Area()
    {
      return Pi * Raio * Raio;
    }
  }

Já nesse segundo exemplo, tanto Quadrado quanto Circulo são objetos, pois escondem seus dados e expõem seus métodos.

E dado esses exemplos, qual a principal diferença entre eles, e principalmente, qual a relação disso tudo com o Clean Code?

A principal diferença no paradigma procedural, usando estruturas de dados (primeiro exemplo), ao adicionar um novo método na classe Geometria, as classes Quadrado e Circulo (e qualquer outra classe de forma geométrica que tivéssemos) não precisariam sofrer qualquer alteração. Muito bom, certo? Com certeza. Mas por outro lado se adicionássemos uma nova classe de forma geométrica, precisaríamos alterar todos os métodos da classe Geometria.

Agora no código orientado a objeto (segundo exemplo) o oposto acontece. Por conta do polimorfismo do método Area() , a adição de novas classes de forma geométrica se torna bem fácil. Porém, para se adicionássemos um novo método, todas as classes de forma geométrica precisariam ser alteradas.

Concluindo, o que o Clean Code diz sobre tudo isso? Quando formos desenvolver um sistema, às vezes, desejaremos facilidade para adicionar novos tipos de dados, e, então usaremos objetos. Outras vezes, desejaremos facilidade para adicionar novos métodos, e, então usaremos estruturas de dados. Portanto cabe ao bom desenvolvedor, sem preconceito entre POO e procedural, identificar qual a melhor abordagem para se usar no dado momento.

Importante: O capítulo abordado, Objetos e Estruturas de Dados, traz também sobre A lei de Demeter, Train Wreks, Estruturas Híbridas, Estruturas Ocultas, DTOs e Active Records, que complementam o que foi abordado neste texto.

Exemplos e texto adaptados e interpretados do livro Clean Code, de Robert C. Martin.