programação genérica, com que frequência é usada na indústria

11

Faço programação em um ambiente acadêmico no momento, para poder usar o que quiser. Estou usando a biblioteca de gráficos de aumento para algumas coisas e estou me perguntando se vale a pena investir esforço na compreensão mais profunda da GP.

Estou curioso - a programação genérica (GP) é muito usada na indústria? Meu palpite é que a maioria dos programadores se sente muito mais à vontade com o OOP ou está usando linguagens que não enfatizam ou suportam o GP, de modo que, além de chamar estruturas / funções de dados STL em C ++, minha impressão é que o GP não é usado com tanta frequência na prática. Mas, estando fora da indústria no momento, seria bom ouvir de profissionais sobre isso.

(enquanto escrevo isso, vejo que a programação genérica nem sequer é uma tag válida!)

bd1
fonte
A distribuição de tags no StackOverflow é provavelmente muito mais útil como evidência estatística do que a aqui. Veja stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Respostas:

7

Estou curioso - a programação genérica (GP) é muito usada na indústria?

É realmente muito dependente do contexto da equipe e do projeto.

Por exemplo, em videogames, geralmente o código é o "mais simples" possível (e às vezes muito simples), mas em grandes arquiteturas. Isso ocorre porque os desenvolvedores de jogos têm muitos problemas para corrigir e não querem se preocupar com a meta programação (que é uma linguagem muito abstrata e difícil de entender dentro do C ++).

Ao mesmo tempo, o uso básico de modelos é comum, mesmo nessas lojas, e você pode ver algumas otimizações baseadas em modelos em algumas funções muito específicas de alguns mecanismos.

Mas no game dev, a maioria das pessoas evita qualquer metaprogramação.

Agora, por outro lado, algumas aplicações de processamento realmente complexas ou pesadas, que não são comuns, requerem algum tipo de metaprogramação pesada devido aos requisitos de desempenho e flexibilidade (em tempo de compilação) que não são comuns. Estou trabalhando em um agora.

Não é comum, mas existe, e alguns domínios de nicho (em alguns contextos científicos ou integrados de processamento de números) exigem que as pessoas saibam muito sobre metaprogramação ou que desejam aprender.

No meio, a maioria das pessoas usa apenas a metaprogramação como "cliente", não como "designer". A maioria dos códigos de metaprogramação está agrupada em bibliotecas porque as bibliotecas são ferramentas para código e o que é melhor do que uma biblioteca que pode se adaptar aos tipos personalizados com os quais você trabalha até agora?

O Boost (http://boost.org) é um conjunto de bibliotecas, algumas sendo feitas com muita magia negra de metaprogramação e são usadas em muitas lojas de C ++ como "STL ++", uma extensão da STL (e é). Nem todas as lojas o usam por vários motivos, como a compatibilidade do compilador (algumas bibliotecas de impulso podem fazer com que o compilador implore perdão por toda vez que ele machucou seu sentimento ...) e com mais frequência porque alguns desenvolvedores não gostam de não entender como uma ferramenta funciona por dentro (tente entender o Boost.Spirit ...)

Quaisquer que sejam as empresas em que você trabalhará, algumas usarão esse paradigma, outras menos ou nada, ou mesmo as proibirão.

Não há consenso, porque ninguém tem as mesmas necessidades, contexto ou equipe.

Mas ainda assim, obviamente, é usado. Talvez pergunte quem usa o impulso em sua lista de e-mails para obter mais exemplos do mundo real?

Klaim
fonte
1
+1 para cliente x designer. Na minha experiência, poucos desenvolvedores o suficiente entendem sua implementação que não faz sentido criar novo código genérico em um aplicativo, a menos que faça uma grande melhoria na capacidade de manutenção. As bibliotecas projetadas para ampla reutilização se enquadram nessa condição com muito mais frequência do que aplicativos individuais.
Karl Bielefeldt
Obrigado pela resposta detalhada. Sou fã do Boost e estou pensando em explorar o BGL, que requer substancialmente mais conhecimento sobre GP do que outras bibliotecas do Boost, o que me levou a perguntar isso. Seu comentário sobre o mundo do desenvolvimento de jogos é bastante intrigante. Estou impressionado com os feitos de desenvolvimento dos jogos modernos e é interessante ouvir que eles provavelmente estão isolados das metodologias de programação mais recentes, e não na vanguarda deles.
BD1
Bem, os desenvolvedores de jogos estão gerenciando uma alta ordem de complexidade apenas com a arquitetura de conceitos de jogos. A adição de meta instruções apenas complexifica tudo, de modo que deve ser realmente bem justificado. A outra coisa é que muitos desenvolvedores de jogos funcionam em consoles que são hardware muito específico, com compiladores muito específicos que não permitem que tudo o que o boost tente fazer (por exemplo, nenhuma exceção ou herança múltipla ou não funcionando corretamente no documento de o compilador (história verdadeira)). Então, existem boas razões.
Klaim
5

Estou curioso - a programação genérica (GP) é muito usada na indústria?

A programação genérica, academicamente chamada de polimorfismo paramétrico , é frequentemente usada nos campos. Na minha empresa, nós o usamos principalmente para criar editores independentes de tipo de dados, independentemente de seu tipo. Você não precisa dele com tanta frequência quanto os outros recursos, mas é definitivamente um recurso que eu não gostaria de perder. Você o usa quando um comportamento se encaixa em um grande número de tipos. É um sinal claro de que você precisa de genéricos quando se encontra escrevendo o mesmo código várias vezes para tipos diferentes.

Meu palpite é que a maioria dos programadores se sente muito mais à vontade com o OOP ou está usando linguagens que não enfatizam ou suportam o GP, de modo que, além de chamar estruturas / funções de dados STL em C ++, minha impressão é que o GP não é usado com tanta frequência na prática.

Pelo menos pela minha experiência, seu ponto de vista está errado. OOP e programação genérica não são mutuamente exclusivos. De fato, você deve usar os efeitos de sinergia de combiná-los. Como afirmei antes, a razão pela qual você não vê isso aparecer com tanta frequência quanto as outras técnicas é porque você não precisa com tanta frequência. Mas é um recurso forte e ajuda muito a manter seu código SECO . Quais idiomas realmente não enfatizam o suporte do GP na programação de alto nível? Três dos cinco idiomas do Top 5 da Tiobe oferecem suporte a modelos / genéricos. E o PHP é digitado dinamicamente, para realmente não precisar deles. E daí?

Falcão
fonte
ponto de vista, não quis dizer que OOP e GP sejam uma opção de escolha. No entanto, muitos dos projetos que vi parecem estritamente OOP em Java. Acho que versões mais recentes do Java suportam GP, mas que fração dos programadores Java realmente usa essa funcionalidade? Como eu disse, não estou trabalhando na indústria e minha perspectiva pode estar distorcida, e foi por isso que fiz a pergunta.
bd1 25/07
@ bd1: aplicativos mais antigos que foram escritos antes de Java suportam genéricos, ou antes de um conjunto de ferramentas específico suportado nessa versão do Java não ter genéricos, e os desenvolvedores podem continuar a evitar genéricos nesse projeto em particular, para manter o código consistente. Eu já vi isso, e isso varia de acordo com o projeto e os desenvolvedores. Todos os projetos que eu vi que foram iniciados após a disseminação do suporte a genéricos Java tendem a usá-los frequentemente, quando apropriado.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: os genéricos em Java são completamente diferentes dos modelos C ++. Os genéricos Java são 100% de açúcar sintático puro e não suportam metaprogramação.
Kevin cline
"OOP e programação genérica não são mutuamente exclusivas.": De fato, ambas são formas de polimorfismo, respectivamente polimorfismo ad-hoc e paramétrico. Portanto, são duas ferramentas diferentes para diferentes tipos de polimorfismo.
Giorgio
4

Modelos C ++ são amplamente utilizados para coisas diferentes de contêineres - pelo menos no domínio do meu problema (finanças quantitativas). Atrevo-me a dizer que às vezes é usado com muita frequência, para propósitos em que funções virtuais simples e antigas seriam suficientes (e não aumentariam tanto o tempo de compilação).

As pessoas o usam para evitar duplicação de código e obter polimorfismo em tempo de compilação (sem despacho virtual).

quant_dev
fonte