DEV Community

Cover image for Princípios SOLID, KISS, DRY e YAGNI Aplicados no Desenvolvimento com React
Jhonata Vinicius Da Silva Araujo
Jhonata Vinicius Da Silva Araujo

Posted on

Princípios SOLID, KISS, DRY e YAGNI Aplicados no Desenvolvimento com React

O desenvolvimento de software é uma atividade complexa que exige organização, manutenção e escalabilidade. Para atender a esses requisitos, muitos princípios e conceitos foram formulados ao longo dos anos.

Neste artigo, vamos explorar como os princípios SOLID, KISS, DRY e YAGNI podem ser aplicados de maneira eficaz ao desenvolver aplicações utilizando React.

Princípios SOLID:

Os princípios SOLID são um conjunto de diretrizes que visam criar código mais legível, flexível e fácil de manter. Vamos abordar cada um deles e sua aplicação em projetos React:

S (Single Responsibility Principle): Componentes React devem ter uma única responsabilidade. Isso facilita a manutenção e reutilização, uma vez que cada componente possui um propósito bem definido.

Exemplo:

// Componente com uma única responsabilidade: renderizar um botão
function Botao({ texto, onClick }) {
  return <button onClick={onClick}>{texto}</button>;
}
Enter fullscreen mode Exit fullscreen mode

O (Open/Closed Principle): Componentes React devem estar abertos para extensão, mas fechados para modificação.

Exemplo:

// Componente aberto para extensão
function Botao({ onClick, cor, children , ...rest }) {
  return <button {...rest} onClick={onClick}>{children}</button>;
}
Enter fullscreen mode Exit fullscreen mode

L (Liskov Substitution Principle): Componentes React filhos devem poder ser substituídos por seus componentes pai sem afetar a integridade do sistema.

Exemplo:

// Interfaces segregadas para diferentes tipos de botões
interface BotaoPadraoProps {
  texto: string;
  onClick: () => void;
}

interface BotaoDestaqueProps {
  texto: string;
  onClick: () => void;
  cor: string;
}

function BotaoPadrao({ texto, onClick }: BotaoPadraoProps) {
  return <button onClick={onClick}>{texto}</button>;
}

function BotaoDestaque({ texto, onClick, cor }: BotaoDestaqueProps) {
  return <button style={{ backgroundColor: cor }} onClick={onClick}>{texto}</button>;
}
Enter fullscreen mode Exit fullscreen mode

I (Interface Segregation Principle): É recomendável criar componentes React que implementem interfaces específicas, focando no que é necessário para cada contexto.

Exemplo:

// Interface para um botão comum
interface BotaoComumProps {
  texto: string;
  onClick: () => void;
}

// Interface para um botão destacado
interface BotaoDestacadoProps {
  texto: string;
  onClick: () => void;
  cor: string;
}

// Componente de Botão Comum
function BotaoComum({ texto, onClick }: BotaoComumProps) {
  return <button onClick={onClick}>{texto}</button>;
}

// Componente de Botão Destacado
function BotaoDestacado({ texto, onClick, cor }: BotaoDestacadoProps) {
  return <button style={{ backgroundColor: cor }} onClick={onClick}>{texto}</button>;
}
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, utilizamos interfaces segregadas para cada tipo de botão, garantindo que cada componente implemente apenas o que é necessário para seu contexto específico.

D (Dependency Inversion Principle): Componentes React devem depender de abstrações, não de implementações concretas. A injeção de dependência é uma prática comum para atingir esse princípio.

// Interface do serviço de API
interface ApiService {
  buscarDados(): Promise<any>;
}

// Implementação concreta do serviço de API
class ApiServiceImpl implements ApiService {
  async buscarDados() {
    // Lógica para buscar dados da API
  }
}

// Componente que utiliza o serviço de API
function ComponenteQueUtilizaApi({ apiService }: { apiService: ApiService }) {
  const [dados, setDados] = useState<any>(null);

  useEffect(() => {
    apiService.buscarDados().then((response) => {
      setDados(response);
    });
  }, [apiService]);

  return <div>{dados ? /* Renderiza os dados */ : 'Carregando...'}</div>;
}

Enter fullscreen mode Exit fullscreen mode

Neste exemplo, o componente ComponenteQueUtilizaApi depende de uma abstração ( ApiService ) em vez de depender diretamente da implementação concreta do serviço de API. Isso permite maior flexibilidade, facilitando a substituição do serviço de API por uma implementação diferente, se necessário, sem alterar o componente principal.

Princípio KISS (Keep It Simple, Stupid):

O princípio KISS enfatiza a simplicidade e a clareza no design e desenvolvimento de software. Aplicado ao React, isso significa:

Separação de Responsabilidades: Mantenha a lógica de negócios separada da lógica de apresentação. Divida seu aplicativo em componentes menores e reutilizáveis.

Evite a Complexidade Desnecessária: Não introduza funcionalidades complexas antes de serem realmente necessárias. Comece com uma abordagem simples e adicione complexidade à medida que os requisitos evoluem.

Exemplo de Separação de Responsabilidades:

// Componente de lógica de negócios
function Calculadora({ numeros, operacao }) {
  const resultado = operacao === 'soma' ? numeros.reduce((a, b) => a + b, 0) : 0;
  return <div>Resultado: {resultado}</div>;
}

// Componente de apresentação
function App() {
  const numeros = [2, 3, 5];
  const operacao = 'soma';
  return (
    <div>
      <Calculadora numeros={numeros} operacao={operacao} />
    </div>
  );
}

Enter fullscreen mode Exit fullscreen mode

Exemplo de Evitar Complexidade Desnecessária:

// Inicialmente, uma abordagem simples para exibir um texto
function Mensagem() {
  return <div>Olá, mundo!</div>;
}

// À medida que os requisitos evoluem, adiciona-se a complexidade
function Mensagem() {
  const horaAtual = new Date().getHours();
  const saudacao = horaAtual < 12 ? 'Bom dia' : 'Boa tarde';
  return <div>{saudacao}, mundo!</div>;
}
Enter fullscreen mode Exit fullscreen mode

Princípio DRY (Don't Repeat Yourself):

O princípio DRY promove a reutilização de código e a eliminação de duplicações. No contexto do React:

Componentização: Crie componentes reutilizáveis para evitar duplicações de código. Isso facilita a manutenção e melhora a consistência em todo o aplicativo.

Lógica Compartilhada: Centralize a lógica compartilhada, como funções utilitárias, em módulos separados para evitar repetição.

Exemplo de Componentização e Lógica Compartilhada:

// Componentes reutilizáveis para exibição de mensagens
function Mensagem({ texto }) {
  return <div>{texto}</div>;
}

function DestaqueMensagem({ texto }) {
  return <div style={{ backgroundColor: 'yellow' }}>{texto}</div>;
}
Enter fullscreen mode Exit fullscreen mode

Princípio YAGNI (You Ain't Gonna Need It):

O princípio YAGNI sugere que você não deve implementar funcionalidades que ainda não são necessárias. No desenvolvimento React:

Comece com o Essencial: Não antecipe necessidades futuras complexas. Comece com o mínimo viável e adicione funcionalidades à medida que os requisitos forem claros.

Evite Overengineering: Não adicione recursos complexos que não são essenciais para a funcionalidade atual do aplicativo.

Exemplo de Começar com o Essencial:

// Começa com um componente simples para exibir informações básicas
function PerfilUsuario({ nome }) {
  return <div>Olá, {nome}!</div>;
}
Enter fullscreen mode Exit fullscreen mode

Exemplo de Evitar Overengineering:

// Evita adicionar recursos complexos antes de serem necessários
function PerfilUsuario({ nome, mostrarDetalhes }) {
  return (
    <div>
      <div>Olá, {nome}!</div>
      {mostrarDetalhes && (
        <div>
          <p>Email: usuario@example.com</p>
          <p>Telefone: (123) 456-7890</p>
          {/* Outros detalhes */}
        </div>
      )}
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Em conclusão, aplicar os princípios SOLID, KISS, DRY e YAGNI no desenvolvimento React resulta em um código mais limpo, modular, flexível e fácil de manter.

Esses princípios incentivam a criação de componentes bem estruturados, promovem a reutilização de código e evitam a introdução de complexidade desnecessária.

Ao internalizar esses princípios e aplicá-los consistentemente, os desenvolvedores podem criar aplicações de alta qualidade que atendam aos requisitos atuais e futuros de maneira eficaz.

Referências:

https://www.freecodecamp.org/portuguese/news/os-principios-solid-da-programacao-orientada-a-objetos-explicados-em-bom-portugues/

https://acervolima.com/7-principios-de-programacao-comuns-que-todo-desenvolvedor-deve-seguir/

Top comments (0)