Existe uma ferramenta de refatoração C ++ em funcionamento? [fechadas]


161

Alguém conhece uma ferramenta de refatoração completa para C ++ que funciona de maneira confiável com grandes bases de código (cerca de 100.000 linhas)?

Eu tentei o que posso encontrar repetidamente nos últimos anos: SlickEdit, Eclipse CDT. Todos eles não eram de todo utilizáveis.

Resumo : Levei um tempo e avaliei o "Visual Assist X" e o "Refactor for C ++". Ambos têm alguns recursos impressionantes, mas ambos também estão longe de serem perfeitos. Extrair um grande bloco de código geralmente não é satisfatório sem modificações manuais - e, portanto, não compensa.

O "Visual Assist X" possui recursos interessantes, como preenchimento automático muito mais completo, etc.

Na minha opinião, portanto, a resposta é: "Não, não há ferramenta de refatoração pronta para produção para C ++"

ATUALIZAÇÃO março 2015 Quanto à resposta do hdoghmens hoje, tentei o Resharper for C ++. Seu link https://www.jetbrains.com/resharper/ não diz nada sobre C ++. Mas eu encontrei o Resharper C ++ que foi anunciado há mais de um ano aqui:

https://www.jetbrains.com/resharper/features/cpp.html

Eu tentei com o VC2010 usando uma base de código de 20MB.

Teste 1: método de extração: resulta em uma exceção do resharper. Nenhum código fonte foi alterado.

Teste 2: Método de extração com fonte diferente: funciona bem

Teste 3: Alterar assinatura da função extraída: resulta em código C ++ quebrado:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Talvez seja por isso que o C ++ não esteja listado na página principal.

Na minha opinião, a resposta a esta pergunta ainda é "NÃO" .


11
Favorito este. O problema com o C ++ é sua sintaxe muito complexa e sensível ao contexto. Sem realmente analisar a fonte completa, você não pode ter certeza do que significa um identificador.
DevSolar 7/09/09

Veja também: stackoverflow.com/questions/249827/... mas não tem muito a oferecer
dmckee --- ex-moderador gatinho

4
O Eclipse realmente funciona muito bem, você só precisa permitir que ele use mais memória editando eclipse.ini
n0rd

3
Se você ainda está monitorando ferramentas de refatoração para C ++, por favor considere que a JetBrains está trabalhando atualmente em suporte C ++ em ReSharper e uma multi-plataforma separada C ++ IDE
Jura Gorohovsky

1
@RED SOFT ADAIR você é famoso. Verifique isso youtu.be/RT46MpK39rQ?t=1611
George C.

Respostas:


38

Acho o Visual Assist X com o Visual Studio muito útil. Outra opção é Refatorar para C ++ .


8
Infelizmente, o Refactor for C ++ não funciona bem (se houver) com grandes bases de código.
Daniel Rose

1
O que acontece especificamente com o Refactor para C ++ e grandes bases de código?
Ira Baxter

2
@IraBaxter Simplesmente está quebrado. As opções de refatoração não aparecem ou não são concluídas. Existem mensagens de erro estranhas ou nenhuma.
11117 Daniel Rose

4
O Refactor para C ++ não funciona bem, mesmo para pequenas bases de código, está quebrado e inutilizável.
precisa saber é o seguinte

3
@ Nils: você pode fornecer um exemplo específico do que ele não entende?
Ira Baxter

41

O Visual Assist e o Visual Studio tornam muito mais fácil lidar com grandes bases de códigos. A assistência visual é boa para rastrear como uma classe ou membro é usada e é mais eficaz em renomeá-la sem falsos positivos do que pesquisar e substituir.


23

Espero que o clang mude significativamente o cenário das ferramentas de refatoração de C ++ nos próximos anos. É um compilador modular de código aberto que expõe uma API para analisar e analisar semanticamente o código C ++. Os IDEs e outras ferramentas poderão usar essa API em vez de fazer o trabalho difícil de escrever seu próprio analisador e analisador semântico.

O Google já criou uma ferramenta de refatoração em larga escala usando o clang .


2
Mas há algum resultado disso que um mero mortal fora do Google poderia usar?
Jan Hudec

1
@JanHudec: Confira o tutorial ligada a partir daqui: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

O Mozilla possui sua própria ferramenta de refatoração chamada Pork ( Wiki , Developer Wiki ). Aqui está o blog do desenvolvedor por trás do Pork. Pelo que li, o Pork foi usado com sucesso em refatorações na Mozilla.

A carne de porco deve ajudar se você vier de * nix land. Para o Visual Studio, eu também recomendo o Visual Assist.


9

Nosso DMS Software Reengineering Toolkit é um mecanismo de transformação projetado para realizar transformações complexas em grandes corpos de código, incluindo C ++. Ele foi usado para fazer alterações confiáveis ​​em sistemas de milhões de linhas de código. Ele opera usando analisadores e transformadores de precisão para compiladores.

Possui um analisador C ++ completo com resolução de nome e tipo, cria ASTs de código, pode aplicar transformações procedurais ou de origem para origem (com sintaxe de superfície C ++) para revisar essas árvores e regenerar saída compilável com os comentários preservados. (Edit: 1/7/2011: Agora o C ++ 1X é suficiente para entendermos o padrão :)

Ele foi usado em projetos de reengenharia em larga escala, incluindo a re-arquitetura de componentes C ++ e traduções 100% totalmente automatizadas entre idiomas. Você pode ler sobre isso no site.

O DMS também é usado para criar ferramentas arbitrárias de análise de fontes. Os exemplos incluem detecção de clone, cobertura de teste, diferença inteligente (comparação de estruturas de código-fonte e operações de edição abstrata em vez de linhas com inserção e exclusão simples), etc.

O que não é (atualmente) é uma ferramenta de refatoração interativa. Acreditamos que, para fazer bem a maioria das refatorações, é necessário um controle profundo e análises de fluxo de dados. O DMS possui um mecanismo genérico para dar suporte a isso, e esse mecanismo é implementado para C, COBOL e Java neste momento, com o C ++ sendo o próximo na fila. Este é um trabalho difícil. Você não verá muitas ferramentas sérias de refatoração de C ++ de ninguém até que esse tipo de problema tenha sido resolvido bem. Primeiro você precisa de um analisador C ++ completo: -}

EDIT 7/5/2011: Parece que vamos dar uma corrida na versão interativa. Ganhamos um SBIR do Departamento de Energia da Fase I para investigar como fazer isso. Consulte http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (procure designs semânticos em "Texas"). Não espere um resultado com pressa; este é apenas o começo do programa trienal de três fases para chegar a uma ferramenta.

EDIT 8/11/2011: Primeiro progresso ... agora lidamos com todas as diretivas C ++ 0x e OpenMP.

EDIT 1/4/2012: Realiza análise de fluxo de controle total do código C ++.

EDIT 15/9/2014: Agora tenha o analisador de front-end C ++ 14 / mecanismo de transformação em mãos. Mesmo renomeia bastante confiável neste momento: -}


Parece não haver um link para avaliar esta ferramenta na sua página de download semanticdesigns.com/Products/RegisterEval.html Há uma versão de avaliação e preços disponíveis no momento para o VS2010 ou o VS2008?
amigos estão dizendo sobre smacl

Para uma ferramenta de refatoração, "não espere resultado com pressa". Nossa tarefa de Pesquisa e Desenvolvimento da Fase I terminou e estamos solicitando fundos para a Fase II. Para discutir o DMS e os meios para avaliá-lo, entre em contato com a empresa. Não é o tipo de coisa que você "baixa para avaliar", da mesma forma que o Enterprise Oracle não é um item de download.
21912 Ira Baxter

... O DMS é capaz de transformar o VS2008 / VS2010, mas não como uma ferramenta interativa, e há limitações em relação às diretivas de pré-processador. (A boa notícia é que achamos que resolvemos um grande problema com eles e o aplicaremos em um programa de Pesquisa e Desenvolvimento de Fase II).
21912 Ira Baxter

Obrigado pelo feedback, mas não se parece com o tipo de ferramenta que procuro. Não preciso de interatividade, apenas algo que possa realizar transformações razoavelmente simples em uma grande base de código, sem custar um braço e uma perna, por exemplo, alterar o número de parâmetros que uma chamada leva, alterar um parâmetro de ponteiro para uma referência. O VisualAssist está próximo, mas só precisa ir um pouco mais longe.
smacl

3
... o objetivo do DMS é permitir a codificação e a aplicação sem erros de transformações de código, "refatorando" ou "não". Sim, é difícil e ainda não estamos lá. Estamos mais próximos do IMNSHO do que qualquer outra ferramenta que eu já vi para C ++, e não há nada de errado com os fundamentos de nossas ferramentas. O que resta são problemas sórdidos com o pré-processador, a escala de código e o esforço para codificar a semântica do C ++ de forma adequada para permitir essas transformações. E eu serei o primeiro a dizer que este é um projeto GRANDE.
Ira Baxter

8

Se você estiver usando o emacs, tente o Xrefactory . Ele suporta extração de métodos, renomeação de classes / funções / variáveis ​​e parâmetros de inserção / exclusão / movimentação. Também possui um mecanismo de conclusão de código muito bom / rápido.


6

Atualmente, não posso recomendar nenhuma ferramenta de refatoração para C ++, certamente não para grandes bases de código de 100 mil linhas ou mais. Eu esperava que isso mudasse, como o OP, e espero que um dia haja algo. Receio que o próprio idioma possa ter que mudar significativamente antes de vermos realmente boas ferramentas.

Aliás, o SlickEdit abandonou seus recursos de refatoração?


A linguagem fez mudança significativa, com o lançamento do C ++ padrão 2011. As complicações adicionais torna o problema mais difícil, não mais fácil, porque todos os usuários vão querer todos os recursos de linguagem avançadas, e uma capacidade refatoração: - {
Ira Baxter

2
Após ler recentemente os recursos do Slickedit, parece que ele determina a definição correspondente ao uso de um nome por métodos heurísticos. Ele não faz uma pesquisa de nome C ++ "correta". Isso significa que você não pode confiar que suas transformações estejam corretas. Se você não se importa em inspecionar seu trabalho, isso pode ser bom para você. Em pacotes de software realmente grandes, isso provavelmente não é bom. Minha opinião.
Ira Baxter

3

O kit de ferramentas de engenharia de software DMS faz isso, eu acho. É um mecanismo de transformação de código, projetado para grande escala e manipula C ++. No entanto, não tenho idéia de quão elegante é a saída.


1
O DMS foi usado para automatizar a re-arquitetura de grandes corpos de código C ++. Veja Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Estudo de caso: Re-engenharia de modelos de componentes C ++ via transformação automática de programas, informação e tecnologia de software 49 (3): 275 -291 2007. Disponível do editor
Ira Baxter

Não sei o que você quer dizer com "saída elegante". A saída obtida do DMS depende claramente do que você fornece e de quais transformações você aplica. Se a transformação não tocar em parte do código, essa parte do código é tão elegante ou não quanto era em primeiro lugar. Se tocar o código, a elegância é determinada pela inteligência das transformações, assim como as alterações manuais de um codificador seriam. Não acho que isso seja elegância, mas a formatação do resultado pode ser a impressão de "fidelidade" (o formato original) ou um estilo de impressão bonito definido.
Ira Baxter

3

Eu recomendo tentar rtags se você usa o emacs e ainda não o experimentou (também há um pacote para o vim disponível). É um aplicativo cliente / servidor baseado em clang que indexa o código C / C ++, com esses recursos incluídos:

  • vá para definição / declaração
  • encontre todas as referências, vá para o próximo / anterior
  • renomear símbolo
  • integração com os “fixits” do clang

Decidi experimentá-lo depois de assistir a essa palestra, que apresentou rtags (e emacs) para mim.

(Devo dizer que fui tão longe somente depois que meu QtCreator falhou em renomear alguns símbolos corretamente, o que é um impedimento para o uso desse ótimo IDE por enquanto)

Além do que é suportado pelas rtags, também preciso de alguns recursos interessantes, incluindo:

  • criar definição / protótipo de função
  • extrair função
  • criar métodos getter / setter

Para isso, recomendo usar um refator semântico pacote de para o emacs (não tenho certeza se existem alternativas para o vim)

Geralmente, as ferramentas baseadas em clangs parecem muito promissoras. Se você estiver interessado em obter mais informações sobre ferramentas clang para refatoração de C ++, inclusive para projetos com grandes bases de código, há algumas ótimas palestras de Chandler Carruth.


2

Certamente é preciso mencionar o Klocwork como um conjunto de refatoração de código comercial. Parece muito promissor quando você passa pelo vídeo de demonstração.


2

O problema são modelos C ++. A partir de 2019, não conheço nenhuma ferramenta de refatoração que suporte modelos C ++. Eu tentei o VS2019, VisualAssist, Clion, QtCreator.

Considere o exemplo:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Se eu executar Renomear refatoração em foo::print, bar::printtambém deverá ser renomeado automaticamente. Porque eles estão vinculados por meio de call_printinstanciações do modelo de função.


1

Se você estiver usando o Visual C ++ (o Express Edition é gratuito), poderá usar o Visual Assist em www.wholetomato.com (link para os recursos de refatoração do C ++).

Ele tem um período de avaliação de 30 dias e descobrimos que é mais rápido e mais cheio de recursos do que o intellisense interno no próprio produto Visual C ++.


2
Eu não acho que você poderia usar plugins com a edição Express
Yacoby

3
Eu certamente tentei instalar o VA com o VS C ++ express no passado e não funcionou.
quamrana 7/09/09

Você não pode instalar os plug-ins do Visual Studio no modo isolado (as edições Express executam o IDE no modo isolado). Se você é um estudante, pode baixar versões completas do Visual Studio no DreamSpark ou MSDNAA.
Billy ONeal

1

Se você deseja recriar sua base de código: MOOSE. Mas essa é uma grande coleção de ferramentas de análise e reengenharia, não um editor.




1

CLion parece muito promissor.

Isenção de responsabilidade: ainda não tentei, pois preciso converter meus projetos no formato CMake para usá-lo.


1

Eu recomendo que você tente Lattix . Ele permite que você analise grandes bases de código C / C ++ para descobrir a arquitetura, identificar dependências problemáticas e reprojetar o código para melhorar a modularidade e reduzir a dívida técnica. O Lattix também fornece vários algoritmos para ajudar no processo de refatoração. Esses algoritmos ajudam você a descobrir como mover elementos de uma parte da hierarquia para outra, quebrar ciclos e mover subsistemas para que o acoplamento e a coesão dos subsistemas possam ser aprimorados. Aqui estão os resultados do Lattix analisando o Android Kernel (1,6 milhão de LOC do C / C ++). Divulgação completa: Trabalho para Lattix


1

Desculpe por encontrar esta pergunta apenas tão tarde. Meus alunos e assistentes trabalham na refatoração de C ++ desde 2006. A maioria das infraestruturas de refatoração de CDTs foi construída por minha equipe no instituto de software IFS. há alguns anos, fornecemos ao Cevelop nossa versão do CDT suporte para refatorações de modernização de código C ++ etc. O Cevelop pode trabalhar com grandes bases de código, se o espaço de trabalho estiver configurado corretamente. Disponível gratuitamente em https://cevelop.com


Muito interessante. Eu baixei e ele não inicia. Consulte github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR

0

Encontrei o seguinte plugin para o Visual Studio 2013: Refatoração do Visual C ++ pela Microsoft.

É apenas uma ferramenta de renomeação simples, mas funciona perfeitamente. Ele adiciona o seguinte menu de contexto após clicar com o botão direito do mouse em um símbolo:

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.