Czy istnieje działające narzędzie do refaktoryzacji C ++? [Zamknięte]

161

Czy ktoś zna w pełni funkcjonalne narzędzie do refaktoryzacji dla C ++, które działa niezawodnie z dużymi bazami kodu (około 100 000 linii)?

Próbowałem wszystkiego, co udało mi się znaleźć w ciągu ostatnich lat: SlickEdit, Eclipse CDT. W ogóle nie nadawały się do użytku.

PODSUMOWANIE : Poświęciłem trochę czasu i oceniłem „Visual Assist X” oraz „Refactor for C ++”. Oba mają imponujące funkcje, ale oba również nie są doskonałe. Wyodrębnienie dużego bloku kodu zwykle nie jest satysfakcjonujące bez ręcznych modyfikacji - i dlatego się nie opłaca.

„Visual Assist X” ma fajne funkcje, takie jak znacznie bardziej kompletne autouzupełnianie itp. Ale prowadzi do tak dużego migotania i znacznie spowalnia w niektórych punktach.

Moim zdaniem odpowiedź brzmi: „Nie, nie ma gotowego do produkcji narzędzia do refaktoryzacji dla C ++”

AKTUALIZACJA Marzec 2015 Jeśli chodzi o hdoghmens, odpowiedz dzisiaj, próbowałem Resharper dla C ++. Jego link https://www.jetbrains.com/resharper/ nie mówi nic o C ++. Ale znalazłem Resharper C ++, który został ogłoszony ponad rok temu tutaj:

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

Wypróbowałem to z VC2010, używając podstawy kodu 20 MB.

Test 1: Metoda wyodrębniania: powoduje wyjątek Resharper. Żaden kod źródłowy nie został zmieniony.

Test 2: Metoda wyodrębniania z innego źródła: działa dobrze

Test 3: Zmień sygnaturę wyodrębnionej funkcji: Wyniki w uszkodzonym kodzie C ++:

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

Może dlatego C ++ nie jest wymieniony na stronie głównej.

Moim zdaniem nadal odpowiedź na to pytanie brzmi „NIE” .

RED SOFT ADAIR
źródło
11
Ulubiony ten. Problem z C ++ polega na jego bardzo złożonej, kontekstowej składni. Bez faktycznego przeanalizowania pełnego źródła nie można być pewnym, co oznacza identyfikator.
DevSolar,
Zobacz też: stackoverflow.com/questions/249827/… ale nie ma wiele do zaoferowania
dmckee --- ex-moderator kitten
4
Eclipse faktycznie działa całkiem nieźle, wystarczy pozwolić mu na użycie większej ilości pamięci, edytując eclipse.ini
n0rd
3
Jeśli nadal monitorujesz narzędzia do refaktoryzacji dla C ++, weź pod uwagę, że w JetBrains obecnie pracujemy nad obsługą C ++ w ReSharper i oddzielnym wieloplatformowym środowisku C ++ IDE
Jura Gorohovsky
1
@RED SOFT ADAIR jesteś sławny. Sprawdź to youtu.be/RT46MpK39rQ?t=1611
George C.

Odpowiedzi:

38

Uważam, że Visual Assist X z Visual Studio jest bardzo przydatny. Innym wyborem jest Refactor for C ++ .

Gant
źródło
8
Niestety, Refactor for C ++ nie działa dobrze (jeśli w ogóle) z dużymi bazami kodu.
Daniel Rose
1
Co konkretnie dzieje się z Refactor for C ++ i dużymi bazami kodu?
Ira Baxter
2
@IraBaxter Po prostu jest zepsuty. Opcje refaktoryzacji albo się nie pojawiają, albo nie są kompletne. Pojawiają się dziwne komunikaty o błędach lub nie ma ich wcale.
Daniel Rose,
4
Refaktoryzacja dla C ++ nie działa dobrze nawet dla małych baz kodu, jest w ogóle zepsuta i bezużyteczna.
kovarex
3
@Nils: czy możesz podać konkretny przykład tego, czego nie rozumie?
Ira Baxter
41

Visual Assist i Visual Studio znacznie ułatwiają obsługę dużych baz kodu. Pomoc wizualna jest dobra w śledzeniu, w jaki sposób klasa lub element członkowski jest używana, i jest bardziej skuteczna w zmienianiu jej nazwy bez fałszywych alarmów niż wyszukiwanie i zastępowanie.

Tom Leys
źródło
23

Spodziewam się, że clang znacząco zmieni krajobraz narzędzi do refaktoryzacji C ++ w ciągu najbliższych kilku lat. Jest to modułowy kompilator typu open source, który udostępnia interfejs API do analizowania i semantycznej analizy kodu C ++. IDE i inne narzędzia będą mogły korzystać z tego interfejsu API, zamiast wykonywać trudną pracę polegającą na pisaniu własnego parsera i analizatora semantycznego.

Google już stworzył narzędzie do refaktoryzacji na dużą skalę przy użyciu clang .

HighCommander4
źródło
2
Ale czy jest jakiś wynik, z którego mógłby skorzystać zwykły śmiertelnik spoza Google?
Jan Hudec
1
@JanHudec: Sprawdź samouczek, do którego link znajduje się tutaj: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4
17

Mozilla ma własne narzędzie do refaktoryzacji o nazwie Pork ( Wiki , Developer Wiki ). Oto blog twórcy Pork. Z tego, co przeczytałem, Wieprzowina była z powodzeniem stosowana w refaktoryzacjach w Mozilli.

Wieprzowina powinna pomóc, jeśli pochodzisz z * nix land, dla Visual Studio też polecam Visual Assist.

Cristian Adam
źródło
9

Nasz DMS Software Reengineering Toolkit to silnik transformacji zaprojektowany do przeprowadzania złożonych transformacji dużych części kodu, w tym C ++. Był używany do wprowadzania niezawodnych zmian w systemach zawierających miliony linii kodu. Działa przy użyciu analizatorów i transformatorów poprawnych dla kompilatora.

Ma pełny parser C ++ z rozpoznawaniem nazw i typów, buduje AST kodu, może stosować transformacje proceduralne lub od źródła do źródła (ze składnią powierzchniową C ++) w celu poprawienia tych drzew i ponownie wygenerować kompilowalne dane wyjściowe z zachowanymi komentarzami. (Edycja: 01.07.2011: Teraz C ++ 1X w stopniu, w jakim rozumiemy standard :)

Był używany w projektach reengineeringu na dużą skalę, w tym przy przebudowie komponentów C ++ oraz w 100% w pełni zautomatyzowanych tłumaczeniach między językami. Możesz przeczytać o tym na stronie internetowej.

DMS jest również używany do tworzenia dowolnych narzędzi do analizy źródeł. Przykłady obejmują wykrywanie klonów, pokrycie testów, inteligentną różnicę (porównanie struktur kodu źródłowego i abstrakcyjnych operacji edycji zamiast wierszy z prostym wstawianiem i usuwaniem) itp.

To, czym nie jest (obecnie), jest interaktywnym narzędziem do refaktoryzacji. Uważamy, że aby dobrze wykonać większość refaktoryzacji, potrzebujesz głębokiej kontroli i analiz przepływu danych. DMS ma ogólną maszynerię, która to obsługuje, i ta maszyna jest obecnie zaimplementowana dla C, COBOL i Java, a C ++ jest następnym w kolejności. To ciężka praca. Nie zobaczysz wielu poważnych narzędzi do refaktoryzacji C ++ od nikogo, dopóki tego rodzaju problem nie zostanie dobrze rozwiązany. Najpierw potrzebujesz pełnego parsera C ++: -}

EDYCJA 05.07.2011: Wygląda na to, że mamy zamiar uruchomić wersję interaktywną. Wygraliśmy Departament Energii Fazy I SBIR, aby zbadać, jak to zrobić. Zobacz http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Look for Semantic Designs under „Texas”). Nie spodziewaj się wyniku w pośpiechu; to dopiero początek 3-fazowego wieloletniego programu, który prowadzi do narzędzia.

EDYCJA 11.08.2011: Pierwszy postęp ... teraz obsługujemy wszystkie dyrektywy C ++ 0x i OpenMP.

EDYCJA 1/4/2012: Wykonuje pełną analizę przepływu kontroli kodu C ++.

EDYCJA 15.09.2014: Teraz masz pod ręką przedni parser / silnik transformacji C ++ 14. Nawet zmienia nazwę całkiem niezawodnie w tym momencie: -}

Ira Baxter
źródło
Na Twojej stronie pobierania semanticdesigns.com/Products/RegisterEval.html nie ma linku do oceny tego narzędzia. Czy jest obecnie dostępna wersja próbna i ceny dla VS2010 lub VS2008?
SmacL
W przypadku narzędzia do refaktoryzacji „nie spodziewaj się wyniku w pośpiechu”. Nasze zadanie badawczo-rozwojowe Fazy I dobiegło końca i staramy się o fundusze na Fazę II. Aby omówić DMS i sposoby jego oceny, skontaktuj się z firmą. Nie jest to coś, co „pobierasz do oceny”, w ten sam sposób, w jaki Enterprise Oracle nie jest elementem do pobrania.
Ira Baxter
... DMS jest w stanie przekształcić VS2008 / VS2010, ale nie jako narzędzie interaktywne i istnieją ograniczenia w odniesieniu do dyrektyw preprocesora. (Dobra wiadomość jest taka, że ​​naszym zdaniem rozwiązaliśmy z nimi poważny problem i będziemy go stosować w programie badawczo-rozwojowym fazy II).
Ira Baxter
Dziękuję za opinię, ale nie wygląda to na rodzaj narzędzia, którego szukam. Nie potrzebuję interaktywności, po prostu coś, co może wykonać dość proste transformacje na dużej bazie kodu, bez kosztu ręki i nogi, np. Zmiana liczby parametrów pobieranych przez wywołanie, zmiana parametru wskaźnika na referencję. VisualAssist jest blisko, ale wystarczy, że pójdzie trochę dalej.
SmacL
3
... celem DMS jest umożliwienie kodowania i bezbłędnego stosowania transformacji kodu, czy to „refaktoryzacji”, czy „nie”. Tak, to trudne i jeszcze nas tam nie ma. Jesteśmy bliżej IMNSHO niż jakiekolwiek inne narzędzie, które widziałem dla C ++ i nie ma nic złego w naszych podstawach narzędziowych. Pozostały okropne problemy z preprocesorem, skalą kodu i próbą odpowiedniego zakodowania semantyki C ++ w celu umożliwienia takich przekształceń. I ja jako pierwszy powiem, że to WIELKI projekt.
Ira Baxter
8

Jeśli używasz emacsa, wypróbuj Xrefactory . Obsługuje ekstrakcję metod, zmianę nazw klas / funkcji / zmiennych oraz parametry wstawiania / usuwania / przenoszenia, a także bardzo dobry / szybki silnik uzupełniania kodu.

bmeric
źródło
6

Obecnie nie mogę polecić żadnego narzędzia do refaktoryzacji dla C ++, a już na pewno nie dla dużych baz kodu składających się z 100 tysięcy linii i więcej. Miałem nadzieję, że to się zmieni, podobnie jak OP, i mam nadzieję, że pewnego dnia coś się wydarzy. Obawiam się, że sam język może się znacznie zmienić, zanim zobaczymy naprawdę dobre narzędzia.

btw, czy SlickEdit porzucił swoje funkcje refaktoryzacji?

quamrana
źródło
Język zrobił znacznie się zmieniły wraz z wydaniem standardu C ++ 2011. Dodatkowe komplikacje sprawiają, że problem jest trudniejszy, a nie łatwiejszy, ponieważ wszyscy użytkownicy będą chcieli wszystkich zaawansowanych funkcji językowych i możliwości refaktoryzacji: - {
Ira Baxter
2
Po niedawnym zapoznaniu się z możliwościami Slickedita wydaje się, że określa on definicję odpowiadającą używaniu nazwy metodami heurystycznymi. Nie wykonuje „poprawnego” wyszukiwania nazw w C ++. Oznacza to, że nie możesz ufać, że jego transformacje są poprawne. Jeśli nie masz nic przeciwko sprawdzeniu jego działania, może to być dla ciebie w porządku. W przypadku naprawdę dużych pakietów oprogramowania prawdopodobnie nie jest to dobre. Moja opinia.
Ira Baxter
4

Polecam wypróbować rtags, jeśli używasz emacsa i jeszcze go nie wypróbowałeś (dostępny jest również pakiet dla vima). Jest to aplikacja klient / serwer oparta na Clang, która indeksuje kod C / C ++, z następującymi funkcjami:

  • przejdź do definicji / deklaracji
  • znajdź wszystkie odniesienia, przejdź do następnego / poprzedniego
  • zmienić nazwę symbolu
  • integracja z „poprawkami” Clang

Postanowiłem spróbować po obejrzeniu tego wykładu, który przedstawił mi rtagi (i emacs).

(Muszę powiedzieć, że posunąłem się tak daleko dopiero po tym, jak mój QtCreator nie zdołał poprawnie zmienić nazw niektórych symboli, co jest powodem, dla którego używam tego wspaniałego IDE na razie)

Oprócz tego, co jest obsługiwane przez rtagi, potrzebuję również dodatkowych fajnych funkcji, w tym:

  • stworzyć definicję / prototyp funkcji
  • funkcja ekstrakcji
  • Utwórz metody pobierające / ustawiające

W tym celu polecam użycie pakietu semantycznego refaktora dla emacsa (nie jestem pewien, czy istnieją alternatywy dla vima)

Ogólnie narzędzia oparte na clang wyglądają bardzo obiecująco. Jeśli jesteście zainteresowani dodatkowymi informacjami o narzędziach clang do refaktoryzacji w C ++, w tym o projektach z dużą bazą kodu, Chandler Carruth wygłosi kilka świetnych przemówień.

Nikolay Bobovnikov
źródło
3

Wydaje mi się, że zestaw narzędzi do inżynierii oprogramowania DMS robi to. Jest to silnik do transformacji kodu, zaprojektowany na dużą skalę i obsługuje C ++. Nie mam jednak pojęcia, jak eleganckie jest to wyjście.

Ira Baxter
źródło
1
DMS został użyty do zautomatyzowania ponownej architektury dużych zbiorów kodu C ++. Patrz Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Case Study: Re-engineering C ++ Component Models Via Automatic Program Transformation, Information & Software Technology 49 (3): 275 -291 2007. Dostępne od wydawcy
Ira Baxter
Nie wiem, co masz na myśli mówiąc o „eleganckiej produkcji”. Wynik uzyskany z DMS wyraźnie zależy od tego, co mu dajesz i jakie transformacje zastosujesz. Jeśli transformacja nie dotyka części kodu, ta część kodu jest tak elegancka lub nie, jak na początku. Jeśli dotknie kodu, o elegancji decyduje sprytny przebieg transformacji, tak jak byłyby to ręczne zmiany kodera. Nie sądzę, żeby to była elegancja, ale formatowanie wyniku może być albo "wiernym" drukowaniem (format oryginalny), albo określonym ładnym stylem drukowania.
Ira Baxter,
2

Z pewnością trzeba wspomnieć o Klocwork jako o komercyjnym zestawie do refaktoryzacji kodu. Wygląda to bardzo obiecująco, kiedy przeglądasz wideo demonstracyjne.

muenalan
źródło
2

Problemem są szablony C ++. Od 2019 roku nie znam żadnego narzędzia do refaktoryzacji, które obsługuje szablony C ++. Próbowałem VS2019, VisualAssist, Clion, QtCreator.

Rozważ przykład:

#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;
}

Jeśli uruchomię Rename Refactoring foo::print, bar::printnależy również zmienić nazwę automatycznie. Ponieważ są one połączone za pomocą call_printwystąpień szablonów funkcji.

losowy
źródło
1

Jeśli używasz Visual C ++ (Express Edition jest bezpłatna), możesz skorzystać z Visual Assist ze strony www.wholetomato.com (link do funkcji refaktoryzacji C ++).

Ma 30-dniowy okres próbny i okazało się, że jest szybszy i bardziej wyposażony w funkcje niż wbudowana funkcja Intellisense w samym produkcie Visual C ++.

JBRWilkinson
źródło
2
Nie sądziłem, że można użyć wtyczek z wersją ekspresową
Yacoby,
3
Z pewnością próbowałem w przeszłości zainstalować VA z VS C ++ express i nie zadziałało.
quamrana,
Nie można zainstalować wtyczek programu Visual Studio w trybie izolowanym (wszystkie wersje Express uruchamiają IDE w trybie izolowanym). Jeśli jesteś studentem, możesz pobrać pełne wersje programu Visual Studio z DreamSpark lub MSDNAA.
Billy ONeal
1

Jeśli chcesz przeprojektować swoją bazę kodu: ŁOŚ. Ale to jest duży zbiór narzędzi do analizy i przebudowy, a nie edytor.

Stephan Eggermont
źródło
1

Zdecydowanie Resharper Ultimate jest drogą do zrobienia. Szczęście gwarantowane :)

W wersji beta od marca 2015 r.

hdoghmen
źródło
W końcu spróbowałem i zaktualizowałem moje pytanie. W każdym razie dzięki.
RED SOFT ADAIR
To jest dla .NET ... a nie C ++.
wcochran
1

CLion wygląda bardzo obiecująco.

Uwaga: nie próbowałem jeszcze tego, ponieważ muszę przekonwertować moje projekty do formatu CMake, aby z niego korzystać.

Adamskiego
źródło
1

Polecam wypróbować Lattix . Pozwala analizować duże bazy kodów C / C ++ w celu odkrycia architektury, zidentyfikowania problematycznych zależności i przeprojektowania kodu w celu poprawy modułowości i zmniejszenia długu technicznego. Lattix zapewnia również szereg algorytmów pomocnych w procesie refaktoryzacji. Algorytmy te pomagają dowiedzieć się, jak przenosić elementy z jednej części hierarchii do drugiej, przerywać cykle i przenosić podsystemy, aby można było poprawić sprzężenie i spójność podsystemów. Oto wyniki analizy Lattix jądra Androida (1,6 miliona LOC C / C ++). Pełne ujawnienie: pracuję dla Lattix

S Barow
źródło
1

Przepraszam, że tak późno znalazłem to pytanie. Moi studenci i asystenci pracują nad refaktoryzacją C ++ od około 2006 roku. Większość infrastruktury refaktoryzacyjnej CDT została zbudowana przez mój zespół w Instytucie Oprogramowania IFS. od kilku lat zapewniamy Cevelop naszą wersję CDT z obsługą refaktoryzacji modernizacji kodu C ++ itp. Cevelop może pracować z dużymi bazami kodu, jeśli obszar roboczy jest poprawnie skonfigurowany. Bezpłatne dostępne na https://cevelop.com

PeterSom
źródło
Bardzo interesujące. Ściągnąłem go i nie chce się uruchomić. Zobacz github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR
0

Znalazłem następującą wtyczkę dla Visual Studio 2013: Refaktoryzacja Visual C ++ firmy Microsoft.

To tylko proste narzędzie do zmiany nazwy, ale działa bezbłędnie. Dodaje następujące menu kontekstowe po kliknięciu symbolu prawym przyciskiem myszy:

wprowadź opis obrazu tutaj

Zac
źródło