0%
Pular para o conteúdo principal
0%

2.4.3 Programação Orientada a Dados e Aditividade

A estratégia geral de verificar o tipo de um dado e chamar uma função apropriada é chamada dispatch sobre tipo. Esta é uma técnica poderosa para obter modularidade no design do sistema. Por outro lado, implementá-la conforme fizemos na seção 2.4.2 tem duas fraquezas significativas.

Problemas com Dispatch Explícito

  1. As funções genéricas devem conhecer todas as representações diferentes
  2. Mesmo que as representações individuais possam ser projetadas separadamente, devemos garantir que não haja dois procedimentos com o mesmo nome em todo o sistema

Programação Orientada a Dados

Uma abordagem melhor é usar uma técnica conhecida como programação orientada a dados. Esta é uma forma de projetar programas para trabalhar com uma tabela de operações e tipos que permite adicionar novas representações sem modificar o código existente.

A Tabela de Operações

Imagine uma tabela bidimensional onde:

  • As linhas correspondem a operações (real_part, imag_part, magnitude, angle)
  • As colunas correspondem a tipos (polar, rectangular)
  • Cada célula contém a função apropriada para aquela operação naquele tipo

Carregando playground de código...

Operações Genéricas via Dispatch

Agora os seletores genéricos são muito mais simples:

Carregando playground de código...

Message Passing (Passagem de Mensagens)

Uma alternativa à programação orientada a dados é decompor a tabela de forma diferente. Em vez de ter "operações inteligentes" que fazem dispatch com base no tipo de dados, podemos ter "dados inteligentes" que fazem dispatch com base no nome da operação:

Carregando playground de código...

Esta é a essência da programação com message passing. O objeto de dados é uma função que, quando chamada com um nome de operação, retorna o resultado apropriado.

Aditividade

Ambas as abordagens (programação orientada a dados e message passing) permitem design aditivo de sistemas—novos tipos de dados e operações podem ser adicionados sem modificar o código existente. Isso é crucial para construir sistemas grandes e modulares.

Exercícios

Exercício 2.73: Reescreva o programa de diferenciação simbólica (seção 2.3.2) para que o dispatch seja feito de forma orientada a dados.

Exercício 2.74: Implemente um sistema genérico para acessar registros de pessoal de uma empresa com divisões independentes.

Exercício 2.75: Implemente o construtor make_from_mag_ang em estilo message-passing.

Exercício 2.76: Compare as três estratégias de organização (dispatch explícito, data-directed, message-passing) para adicionar novos tipos e novas operações.

📝 Encontrou algo errado nesta página?

Sua ajuda é muito importante para melhorar a qualidade da tradução!

🐛 Encontrou um erro?

Se você encontrou:

  • Erro de tradução (palavra incorreta, termo técnico errado)
  • Erro de ortografia ou gramática
  • Link quebrado
  • Código de exemplo que não funciona
  • Problema de formatação

Reporte um bug →

❓ Tem uma dúvida?

Se você tem:

  • Dúvida sobre o conteúdo desta seção
  • Pergunta sobre um conceito do SICP
  • Dificuldade em entender algum exemplo
  • Questão sobre a tradução de algum termo

Inicie uma discussão →

💡 Tem uma sugestão de melhoria?

Se você quer sugerir:

  • Melhoria na explicação
  • Exemplo adicional
  • Recurso visual (diagrama, ilustração)
  • Qualquer outra ideia

Sugira uma melhoria →

🌍 Quer discutir a tradução?

Se você quer debater:

  • Escolha de tradução de algum termo
  • Consistência de terminologia
  • Nuances do português

Discussão de tradução →

Obrigado por ajudar a melhorar o SICP.js PT-BR! ✨