Jak odnaleźć "martwy" kod w Delphi 7

0

Czyli mamy jakąś procedurę zdarzeniową, ale nie ma powiązanego z nią obiektu (np. Button1Click, ale Button1 został skasowany i zostają po nim procedurki zdarzeniowe).

Oczywiście można przelatywać ręcznie kod i patrzeć na niebieskie kropeczki na Glitter (czy Glutter) barze (po lewej w oknie edycji kodu - tam, gdzie sie klika, żeby postawić BreakPointa), ale przy dużym projekcie bywa to uciążliwe. Po 20 000 linii kodu można dostać oczopląsu. Nie chciałbym też żadnego narzędzia, które automatycznie czyści martwy kod.

Po prostu chciałbym wiedzieć które procedury/funkcje są martwe/nie podpięte, żeby posprzątać trochę kod i zapobiec ew ryzyku, że kiedy ponownie utworzę obiekt danego typu, a Delphi automatycznie nada mu nazwę z numerem, który był użyty wcześniej - może się zdarzyć, że podepnę niewłaściwą procedurę.

Np. Jest wspomniany Button1. Definiuje dla niego Button1Click, Potem definiuje Button2, Button3, itd. razem z odpowiednimi procedurkami zdarzeniowymi dla nich. Kasuję Button1. Procedura Button1Click pozostaje. Działam dalej - tworzę kolejne obiekty innego typu po czym znów potrzebuję buttona, więc go tworzę. Delphi generuje mi automatyczną nazwę Button1 (ponownie, bo ma wolne miejsce). klikam dwa razy. POdpina się automatycznie procedura Button1Click utworzona za pierwszym razem. W roztargnieniu nie zwracam uwagi co w niej było, a później zaczyna się zabawa dlaczego program zachował się tak a nie inaczej.

0

To ja dodam, że identycznie jest ze zmiennymi lub stałymi globalnymi.
Także nie ma choćby ostrzeżenia o ich nieużywaniu.

0

Przed skasowaniem jakiegoś komponentu zawsze sprawdzam w Inspektorze Obiektów w zakładce Events które zdarzenia oprogramowałem i usuwam je z kodu.
Jeśli chodzi o zmienne czy stałe globalne to można zakomentować ich deklaracje i spróbować skompilować program - wyjdzie czarno na białym które są używane.

0
pelsta napisał(a)

Przed skasowaniem jakiegoś komponentu zawsze sprawdzam w Inspektorze Obiektów w zakładce Events które zdarzenia oprogramowałem i usuwam je z kodu.
Jeśli chodzi o zmienne czy stałe globalne to można zakomentować ich deklaracje i spróbować skompilować program - wyjdzie czarno na białym które są używane.
Oczywiście masz całkowitą rację, że nie ma jak Best Practices.

Ale życie jest życiem. Czasem coś dziabniesz, albo co więcej - kopiujesz jakąś kontrolkę, albo grupę kontrolek. Spieszysz się, bo siedzisz u klienta, który stoi nad tobą i oczekuje szybkiego rozwiązania problemu. Dodajesz, kasujesz, mieszasz, kombinujesz i ... zapominasz posprzątać. Wiadomo. Życie.

Jak siedzisz w ciepłych bamboszach w biurze/domu i masz czas się zastanowić - super. Czasem w wirze walki zdarzają się takie sytuacje i co jakiś czas warto pozamiatać miejsce pracy.

Co do zmiennych - kompilator zgłasza Warning: Declared, but not used. Zrób rebuilda - zobaczysz.

0
toyman napisał(a)

Co do zmiennych - kompilator zgłasza Warning: Declared, but not used. Zrób rebuilda - zobaczysz.

Dla zmiennych deklarowanych w sekcji interface nie zgłasza.

I jeszcze jeden tip.
Każdy nowy projekt umieszczam w nowym katalogu. Przed dokonaniem jakichkolwiek zmian w projekcie robię kopię zapasową tego katalogu. Gdy zmiany nie satysfakcjonują mnie przywracam poprzednią wersję z zapasu i po kłopocie.

0

Ja też od pewnego czasu (mniej więcej dwa lata) używam wersjonowania (nie CSV/SVN tylko Build project)- to znaczy przed rozpoczęciem prac nad kolejnym buildem, poprzedmi jest zgrywany do osobnego katalogu w celach archiwalno-porownawczych.

Ale to działa, jeżeli pracujemy nad wersjami 'Pudełkowymi'.

Jak pracuję nad projektem jednostkowym bez wersjonowania - robie zwykly backup.

Co nie zmienia faktu, że odbiegamy delikatnie od tematu.

Znalazłem interesujący wątek:
http://stackoverflow.com/questions/4226970/finding-unused-aka-dead-code-in-delphi
ale jeszcze nie miałem czasu tego przetestowac - tym bardziej, że częśc z tych narzędzi działa na D2007, a ja wciąż używam D7.

0

Ogólnie w tym przypadku bardzo dobrze sprawdzi się Pascal Analyzer. Jest płatny, ale możliwe jest jego przetestowanie.
W praniu wyjdzie Ci, że w Twoim projekcie jest nie tylko martwy kod, ale i nie zoptymalizowany.

Poza tym chyba w Delphi XE i XE2 już nie jest to problemem (kasowany jest też kod podłączony pod usuwane elementy).

1 użytkowników online, w tym zalogowanych: 0, gości: 1