2012-01-13 15 views
10

Kod źródłowy naszej aplikacji to setki tysięcy linii, tysiące plików, a w miejscach bardzo starych - aplikacja została napisana po raz pierwszy w 1995 lub 1996 roku. W ciągu ostatnich kilku lat mój zespół znacznie poprawił jakość źródła , ale pozostaje jeden problem, który szczególnie mnie budzi: wiele klas ma wiele metod w pełni zdefiniowanych w ich pliku nagłówkowym.Narzędzie do parsowania źródła C++ i przenoszenia metod inline w nagłówku do pliku źródłowego .cpp?

nie mam problemu z metod zadeklarowanych inline w nagłówku w niektórych przypadkach - konstruktora struct, w prosty sposób, w którym inline wymiernie czyni go szybciej (mamy kilka funkcji matematycznych, takich jak ta) itp Ale liberalne stosowanie z inlined metod bez wyraźnego powodu jest:

  • Messy
  • sprawia, że ​​trudno znaleźć wdrożenie metody (zwłaszcza wyszukiwanie poprzez drzewa zajęć dla funkcji wirtualnego, aby znaleźć jeden klasa miała swoją wersję zadeklarowane w nagłówku ...)
  • Prawdopodobnie zwiększa skompilowany rozmiar kodu
  • Prawdopodobnie powoduje problemy z naszym łącznikiem, który jest notoriously flaky for large codebases. Aby być uczciwym, w ciągu ostatnich kilku lat jest znacznie lepiej, ale nie jest doskonały.

Ten ostatni powód może być teraz przyczyną problemów i jest to dobry powód, aby przejść przez kod i przenieść większość definicji do pliku źródłowego.

Nasza baza kodów jest ogromna. Czy istnieje zautomatyzowane narzędzie, które może zrobić (większość) tego dla nas?

Uwagi:

  • Używamy Embarcadero RAD Studio 2010. Innymi słowy, dialekt C++ zawiera VCL and other extensions itp
  • Kilka nagłówki są samodzielne, ale większość z nich w połączeniu z odpowiednia. plik cpp, jak zwykle. Oprócz rozszerzenia nazwa pliku jest taka sama, tj. Jeśli istnieją metody zdefiniowane w X.h, można je przenieść do X.cpp. Oznacza to również, że narzędzie nie musi obsługiwać analizowania całego projektu - może prawdopodobnie po prostu przeanalizować pojedyncze pary plików .cpp/.h, zignorować załączniki, itp., O ile może niezawodnie rozpoznać metodę z określonym obiektem w deklaracji klasowej i przenieś ją.
+0

http://stackoverflow.com/questions/6362995/c-refactoring-move-method-to-implementation-file duplicate? – Zuljin

+11

Uzyskaj stażystę, aby to zrobić. –

+1

@Zuljin: hmm, możliwe ... Ale nie ma odpowiednich odpowiedzi! (Dodatki VS, bez wskazania masowych zmian na swoich stronach internetowych, a najważniejszą rzeczą spośród wszystkich komentarzy i odpowiedzi jest stwierdzenie "Och, możesz łatwo stworzyć skrypt ..." Nie sądzę, że jest "łatwy" i "parsuj C++" zwykle idą w parze!) –

Odpowiedz

6

Możesz spróbować Lazy C++. Nie użyłem go, ale uważam, że jest to narzędzie wiersza poleceń, aby robić to, co chcesz.

+0

+1: nie wiem o tym narzędziu :) – neuro

+0

+1, nigdy o tym nie słyszałem. Szybkie przeglądanie sprawia, że ​​wygląda to na bardzo przydatne narzędzie do tego typu rzeczy! –

+0

Po przeczytaniu FAQ, skontaktowałem się z autorem. Narzędzie wymaga napisania kodu w pliku .lzz, który Lazy C++ analizuje i dzieli na pliki CPP i H. Myślę, że łączenie naszego kodu w pojedyncze pliki tylko po to, by narzędzie je podzieliło, może być równie dobrą pracą ... :) Dzięki za sugestię, jest to interesujące narzędzie. –

3

Jeśli kod działa, zagłosowałbym przeciwko większemu automatycznemu przepisywaniu.
Może zająć się naprawieniem tego problemu.

Małe iteracyjne ulepszenia w czasie są lepszą techniką, ponieważ będziesz w stanie przetestować każdą zmianę w izolacji (i dodać testy jednostkowe). W każdym razie twoja główna skarga, że ​​nie można znaleźć kodu, nie jest prawdziwym problemem i jest już rozwiązana. Istnieją już narzędzia, które zindeksują bazę kodu, dzięki czemu twój edytor przejdzie do właściwej definicji funkcji bez konieczności jej wyszukiwania. Spójrz na ctags lub odpowiednik swojego edytora.

  • Messy

    Subiektywna

  • sprawia, że ​​trudno znaleźć wdrożenie metody (zwłaszcza wyszukiwanie poprzez drzewa zajęć dla funkcji wirtualnego, aby znaleźć jedną klasę gdyby jego wersja została zadeklarowana w nagłówku ...)

    Istnieje już oole dostępne do znalezienia funkcji. ctags utworzy plik, który pozwala przejść bezpośrednio do funkcji z dowolnego przyzwoitego edytora (vim/emacs). Jestem pewien, że twój edytor, jeśli nto jeden z nich ma równoważne narzędzie.

  • Prawdopodobnie zwiększa skompilowany rozmiar kodu

    prawdopodobne. Kompilator wybierze wbudowany lub nie oparty na wewnętrznych metrykach, a nie na pogodzie, że jest zaznaczony w wierszu źródła.

  • Prawdopodobnie powoduje problemy dla naszego linkera, który jest notorycznie niestabilny w przypadku dużych baz kodów. Aby być uczciwym, w ciągu ostatnich kilku lat jest znacznie lepiej, ale nie jest doskonały.

    Mało prawdopodobne. Jeśli twój linker jest flakey, to jest flakey, nie ma większego znaczenia, gdzie funkcje są zdefiniowane, ponieważ to nie ma wpływu na, jeśli i tak są one zainspirowane.

+0

+1 za "Dużo pracy może wymagać naprawienia." Powiedziałbym nawet, że "Wiele pracy ** będzie ** wymagało naprawy." – Sjoerd

+0

Dzięki Loki. Nie chcę robić "przepisywania" - chcę zachować identyczny kod logiczny, po prostu przenieść jego lokalizację. Wiem, że to nie jest takie proste, ale ... :) Przewiduję, że mogę uruchomić narzędzie i ręcznie przeglądać jego zmiany, i znam kod bazowy bardzo dobrze pomimo jego wielkości, więc czuję się pewnie po tej stronie to. Re niektóre z innych punktów, [to pytanie SO] (http://stackoverflow.com/questions/6895408/to-inline- or-not-to-inline) może Cię zainteresować. –

1

Masz wiele problemów do rozwiązania:

  • Jak przegrupować pliki źródłowe i nagłówkowe idealnie
  • Jak zautomatyzować modyfikacji kodu do wykonania to się

W obu przypadkach potrzebny jest solidny analizator składni C++ z pełną rozpoznawaniem nazw w celu dokładnego określenia zależności.

Następnie potrzebujesz maszyny, która może niezawodnie modyfikować kod źródłowy C++.

Nasz DMS Software Reengineering Toolkit z jego z jego C++ Front End może być używany do tego. DMS został użyty do restrukturyzacji kodu w dużej skali w C++; patrz http://www.semdesigns.com/Company/Publications/ i wyśledzić pierwszy artykuł "Analiza przypadku: Przeprojektowywanie modeli komponentów C++ za pomocą automatycznej transformacji programu". (Istnieje starsza wersja tego artykułu, którą można pobrać, ale opublikowana jest lepsza). AFAIK, DMS to jedyne narzędzie, jakie kiedykolwiek zastosowano do transformacji C++ na dużą skalę.

Ten numer SO discussion on reorganizing code rozwiązuje problem grupowania bezpośrednio.

1

XE2 zawiera nowy analizator statyczny. Warto spróbować, aby nowa wersja testu C++ Builera była spinem.

+0

Dzięki David! Właściwie mam kopię C++ Builder XE2 Pro, więc spróbuję z tym. (Mimo że prace zostały wstrzymane w 2010 r. - czekamy na 64-bitową aktualizację ponownie - staram się być na bieżąco, a więc i mój własny egzemplarz.) Próbowałem tylko refaktoryzacji dostępnych w 2010 r. Przedtem, a oni nie byli jest bardzo niezawodny. –

Powiązane problemy