O que é projeto orientado a dados? – terminologia modelagem estilo-de-codificação

Pergunta:


Me deparei com o termo data-oriented design, vi algumas coisas e me surpreendi um pouco porque o que pude ver por cima é diferente do que eu poderia imaginar, já que esses termos normalmente remetem à maneiras de estruturar projetos de forma convoluta e prolixa para atender algum “requisito mágico” que nada tem a ver com o negócio. Eu achei até que já tinha visto isso, mas não era o que eu imaginava.

Na verdade o que eu estava pensando é data-driven design. Essas coisas que terminam com DD em geral pregam formas de projetos cheio de regras para alcançar algum objetivo onde não existem métricas que indicam sucesso. Esse chega ser até complicado chamar de DDD porque já tem outro DDD (já está faltando letras).

Então o que é o projeto orientado a dados?

Por que devemos adotá-lo e em que casos?

Qual a relação que ele tem com orientação a objetos?

Por ser dados é algo a ser usado em banco de dados? Pode ser usado em outro contexto?

Tem como comprovar sua eficácia? (métricas)

Pode dar um exemplo bem curtinho de código onde é diferente?

É um paradigma? (Coloquei a tag por não ter certeza)

Autor da pergunta Maniero

Maniero

Qual a relação que ele tem com orientação a objetos?

De fato é fácil confundir com o projeto dirigido a dados que é algo ligado à orientação a objeto, ao contrário do projeto orientado a dados em questão aqui, que se opõe à OO.

É um paradigma?

Na verdade é um estilo ou abordagem de programação, pelo menos oficialmente não é um paradigma, se fosse seria bem secundário.

Então o que é o projeto orientado a dados?

Ele procura organizar os dados da forma que melhor faz sentido para a aplicação aproveitar melhor o hardware, independente do código ficar mais organizado ou não.

Ele é oposto de outros estilos que procuram uma forma de escrever “melhor” os códigos, ele realmente coloca o dado em primeiro lugar poder manipulá-lo eficientemente é prioridade, mesmo que eventualmente o código fique estranho.

O seu objetivo é organizar os campos em estruturas de dados para melhor aproveitar a memória, o cache, o transporte e o processamento. Em geral ele diminui a ociosidade da máquina evitando o Von Neumann bottlenecking que impede o processador de exercer o seu potencial por causa da forma que os dados que estão estruturados.

Por que devemos adotá-lo e em que casos?

Então é claro que é mais útil em aplicações que exigem o máximo de desempenho, e jogos é um exemplo frequentemente citado como DOD.

Por ser dados é algo a ser usado em banco de dados? Pode ser usado em outro contexto?

Também é adotado em bancos de dados onde a organização dos dados ajuda no desempenho das consultas. Muitas vezes modelamos usando o data-oriented design sem nem percebermos, pelo menos em bancos de dados relacionais.

De fato as aplicações que usam esta abordagem costumam privilegiar um conjunto de listas ou tabelas de dados simples (SoA) do que listas de objetos completos (AoS), assim os dados relacionados ficam juntos e o acesso é otimizado.

A normalização de banco de dados costuma fazer um pouco isto em alguns casos.

Tem como comprovar sua eficácia?

Existem métricas fáceis já que estamos falando de desempenho. É possível medir usando os dois modelos, OOP e DOD, o segundo ninguém pode questionar que houve ganho, tem números claros e incontestáveis. Se o ganho é necessário é outra estória. O ganho em fazer OOP sempre pode ser questionado, nunca conseguiram publicar um estudo conclusivo do ganho.

Pode dar um exemplo bem curtinho de código onde é diferente?

No SO tem exemplos de como é em OOP:

class Ball {
    Point  position;
    Color  color;
    double radius;
    void draw();
};

vector<Ball> balls;

E como é em DOD:

class Balls {
    vector<Point>  position;
    vector<Color>  color;
    vector<double> radius;
    void draw();
};

Coloquei no GitHub para referência futura.

Mais informações

Mike Acton é o principal proponente e descobri o assunto como algo mais ou menos formalizado em palestra dele.

Existem textos que detonam OOP (outro). Claro que no contexto específico, mas é bom pra abrir o olho do que pode estar te prejudicando, mesmo que não precise.

Ele mostra como é prejudicial um simples polimorfismo que parece inofensivo, já que é apenas uma indireção simples de ponteiro, mas que prejudica a localidade e chega causar uma lentidão de mais de uma ordem de magnitude, o que é um absurdo, só porque a informação não está no cache. Ele chega propor, na medida do possível que o polimorfismo seja gerado dentro das funções e não dentro dos objetos, ou que tudo seja resolvido em tempo de compilação.

O estilo abomina o uso de exceções, herança múltipla, abstrações, entre outras técnicas típicas de aplicações enterprise.

Obviamente que isto se aplica melhor em C++. Outras linguagens praticamente tornam o DOD inútil porque elas jã possuem seus próprios gargalos. C ou Assembly estão em um nível inferior de abstração.

Há um site com praticamente um livro sobre o assunto.

Palestra do Scott Myers sobre cache.

Muita gente deve ter se decepcionado porque queriam ver aquelas arquiteturas cheias de padrões que tornam o código enorme e confuso para atingir um objetivo que muitas vezes nem é necessário.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *