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

1

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/

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay