A reutilização de código é uma boa idéia. Não é ótimo .
Eu tenho uma perspectiva extraída de cerca de 30 anos de engenharia de software, tentando "reutilizar".
Comecei a investigar a "reutilização de código" como um tópico de pesquisa nos anos 80, depois de descobrir que havia reutilizado o design de um SO que construí no início dos anos 70, para outro SO que construí no final dos anos 70.
A boa parte da reutilização de código é a capacidade de, às vezes, reutilizar código preexistente honesto com Deus. Mas o mundo está cheio de código; como pode encontrar o que você quer? Aqui está o que eu chamo de maldição de reutilização :
Eu sou o Papai Noel (ok Open Source) e tenho um pacote de 1 bilhão de componentes de software. Você pode ter qualquer um deles.
Boa sorte para escolher.
Para resolver bem o problema de reutilização:
- o reutilizador precisa especificar de alguma forma o que ele precisa (funcional, desempenho, idioma de destino, suposições do ambiente, ...)
- deve haver uma biblioteca de código "reutilizável" que tenha sido indexada de várias maneiras por esses critérios em potencial
- algum mecanismo deve existir para selecionar os elementos candidatos (em um bilhão de elementos, você não pode olhar para todos eles pessoalmente)
- é necessário que haja uma maneira de caracterizar a que distância da especificação os candidatos escolhidos estão
- algum processo regular deve existir para permitir que o reutilizador modifique o código reutilizável escolhido (aqui está a maior contribuição do OOP: você pode editar um componente / objeto existente substituindo seus slots. OOP não fornece nenhuma outra ajuda).
- tudo isso deve ser claramente mais barato do que simplesmente recodificá-lo
Principalmente o que foi descoberto ao longo dos anos é que, para que o código seja reutilizável, ele deve ser projetado para esse fim ou contém muitas suposições implícitas. As bibliotecas de reutilização de código mais bem-sucedidas foram realmente muito pequenas. Indiscutivelmente, bibliotecas e estruturas são códigos "reutilizáveis" e são extremamente bem-sucedidos; Java e C # são bem-sucedidos não porque são boas linguagens de computador, mas porque têm enormes bibliotecas bem projetadas, implementadas e documentadas disponíveis. Mas as pessoas não olham o código fonte nas bibliotecas; eles simplesmente chamam uma API bem documentada (projetada para ser geralmente utilizável).
O que a reutilização de código não fez (OOP também) é fornecer ordens de melhoria de magnitude em nossa capacidade de codificar sistemas.
Eu acho que a principal falha é que qualquer tipo de reutilização de código é fundamentalmente limitado porque o código tem muitas suposições embutidas . Se você reduz o código, minimiza as suposições, mas o custo para construir do zero não é muito grande e os ganhos de reutilização não são eficazes. Se você criar enormes pedaços de código, eles serão praticamente inúteis em um novo contexto. Como Gulliver, eles estão amarrados à praia por um milhão de cordas minúsculas, e você simplesmente não pode se dar ao luxo de cortar todas elas.
O que devemos trabalhar é a reutilização do conhecimento para construir código . Se pudermos fazer isso, podemos aplicar esse conhecimento para construir o código necessário, manipulando o conjunto atual de suposições.
Para fazer isso, ainda é necessário o mesmo recurso de especificação para caracterizar componentes de software (você ainda precisa dizer o que deseja!). Mas você aplica esse conhecimento de "construção" às especificações para gerar o código desejado.
Como comunidade, ainda não somos muito bons nisso. Mas as pessoas fazem isso o tempo todo; por que não podemos automatizar isso? Há muita pesquisa, e isso mostra que isso pode ser feito em muitas circunstâncias.
Uma parte importante do mecanismo necessário para isso são as ferramentas mecânicas para aceitar "descrições de componentes" (esses são apenas documentos formais e podem ser analisados como linguagens de programação) e aplicar transformações de programa a eles.
Os compiladores já fazem isso: -} E eles são realmente bons na classe de problemas que enfrentam.
Modelos UML com geração de código são uma tentativa de fazer isso. Não é uma tentativa muito boa; praticamente o que se diz na maioria dos modelos UML é "Eu tenho dados parecidos com este". Muito difícil gerar um programa real se a funcionalidade for deixada de fora.
Estou tentando criar sistemas práticos de transformação de programas, uma ferramenta chamada DMS . Fiquei bastante distraído com a aplicação de transformações de programa, não tanto para abstrair especificações para gerar código, mas para codificar legado para limpá-lo. (Estes são o mesmo problema no resumo!). (Construir essas ferramentas leva muito tempo; eu faço isso há 15 anos e nesse meio tempo você tem que comer).
Mas o DMS tem as duas propriedades principais que descrevi acima: a capacidade de processar especificações formais arbitrárias e a capacidade de capturar o "conhecimento de geração de código" à medida que se transforma e aplicá-las sob demanda. E notavelmente, nós geramos em alguns casos especiais, algum código bastante interessante a partir das especificações; O DMS é amplamente construído usando-se para gerar sua implementação. Isso alcançou para nós pelo menos parte da promessa de reutilização (conhecimento): ganhos de produtividade extremamente significativos. Eu tenho uma equipe de cerca de 7 pessoas técnicas; nós escrevemos provavelmente 1-2 MSLOC de "especificações" para DMS, mas temos cerca de 10MSLOC de código gerado.
Resumo: a reutilização do conhecimento de geração é a vitória, não a reutilização de código .