| Autor |
Beitrag |
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mi 05.03.08 03:26
Hi,
erstmal vorweg - ich weiß, dass es so ein Programm vor kurzem schonmal in der DP gab ( DupeChecker). Tatsächlich hat mich dieses Programm sogar dazu inspiriert meine eigene Version zu schreiben, da ich in einigen Punkten nicht ganz glücklich damit war (siehe dazu mein Posting im Thread zu dem Programm).
Ich habe daher beschlossen mein eigenes Programm zu schreiben und versucht die von mir kritisierten Punkte zu verbessern.
Features: - Sehr schnelle Duplikatssuche
- Kommentare werden vor dem Vergleichen entfernt -> unterschiedliche Kommentare in identischen Codeblöcken spielen keine Rolle mehr; auskommentierter Code wird nicht als Duplikat erkannt
- "Überflüssige" Leerzeichen werden vor dem Vergleichen ebenfalls entfernt (aus "i : integer ;" wird "i:integer;") -> Unterschiede in der Formatierung werden ignoriert
- Übersichtliche Aufbereitung der Ergebnisse in einem Treeview
Anmerkung: Treeview Einträge die kursiv sind sind "Subduplikate", sie sind also ein Teil eines größeren Duplikats. Diese werden nur dann angezeigt, wenn sie identisch mit anderen gefundenen Dupliakten sind, die selbst keine Subdupliakte sind.
v0.4.1- Speicherverbrauch wurde drastisch gesenkt
- Geschwindigkeit wurde um das 4-5 fache gesteigert
- Rekursive Suche in Unterordnern kann optional deaktiviert werden
- Comboboxen wurden durch "erweiterte" Versionen ersetzt
- Es wird nun überall der volle Pfad als Hint angezeigt
v0.3.1- Analyse findet nun in einem eigenen Thread statt und kann abgebrochen werden
- Geschwindigkeit wurde nochmals gesteigert
- Speicherverbrauch wurde deutlich reduziert
- Splitter-Problem beseitigt
- Die Schriftart des Treeview wurde auf Verdana umgestellt - damit gibt es keine Probleme mit den kursiven Zahlen mehr.
v0.2.2- Es gibt jetzt eine SettingsForm - die Einstellungen werden in einer ini-Datei und einer txt-Datei gespeichert (siehe weiter unten)
- Alle Sources eines Duplikats können nun in einem eigenen Fenster direkt verglichen werden
- Sowohl im "Compare-Fenster" als auch in der MainForm werden die Duplikate im Source durch eine eigene Hintergrundfarbe gekennzeichnet
- Duplikate die nur aus Keywords bestehen können ignoriert werden
- Geschwindigkeit wurde um das bis zu 4-fache beschleunigt
Folgende Einstellungen sind möglich:
- Minimale Zeilenanzahl
- Extensions der Files die beim Durchsuchen von Ordnern berücksichtigt werden sollen
- Ignorieren von Duplikaten die nur aus Keywords bestehen
- Es sollen nur Zeilen gezählt werden die nicht nur aus einem Keyword bestehen (betrifft minimale Zeilenanzahl)
- Liste der Keywords die ignoriert werden sollen - betrifft die beiden obigen Einstellungen (diese List wird in keywords.txt gespeichert)
v0.1.2- Das Programm kann jetzt auch für ganze Ordner angewendet werden. Dabei werden alle pas und dpr Files aus dem gewählten Ordner und allen Unterordnern zur Duplikatssuche herangezogen.
- Die Duplikatsanzeige wurde korrigiert, es sollten jetzt immer die korrekten Zeilen angezeigt werden
- Das Ergebnis kann nach Files gefiltert werden, dabei werden nur jene Duplikate angezeigt die in dem ausgewählten File vorkommen. Wenn zusätzlich noch "strict" aktiviert ist werden alle Sources aus anderen Files ebenfalls ausgeblendet.
- Optional kann nun das gesamte File im Edit angezeigt werden, das Duplikat wird dabei markiert.
- Während der Duplikatssuche wird jetzt ein Dialog mit Progressbar angezeigt. Im Moment verwende ich noch Application.ProcessMessages damit das UI upgedatet wird was sich natürlich auf die Laufzeit auswirkt. In Zukunft wird das per Multithreading gelöst.
TODO: -
- Einstellungsmöglichkeiten - Kommentare beim Preprocessing entfernen, Compiler-Schalter als Kommentar behandeln, ...
- Subduplikate mit "Eltern"-Duplikat verknüpfen
- Eventuell noch bessere Anpassung während des preprocessing um unterschiedliche Formatierungen noch besser auszugleichen
- ...
Gruß, Motzi
Einloggen, um Attachments anzusehen!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Zuletzt bearbeitet von Motzi am Sa 15.03.08 20:22, insgesamt 6-mal bearbeitet
|
|
kkausp
      
Beiträge: 77
Erhaltene Danke: 1
W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
|
Verfasst: Mi 05.03.08 10:02
Erst mal ein Lob.
Ich habe aber noch einen Vorschlag:
Führe bitte eine Liste ein, in der man Elemente einträgt, so das wenn nur diese enthalten sind, kein Duplikat vorhanden ist.
d.h es muss mindestens ein Element vorhanden sein welches nicht in der Liste ist.
z.B. Listen elemente:
begin
end
try
finally
except
else
Ziel ist solche Sequencen nicht angezeigt zu bekommen.
end;
end;
end;
end;
oder
end;
end;
finally
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Mi 05.03.08 10:49
(1) Na ja, für den Anfang nicht schlecht, dringend erfoderlich, das ganze Projekte durchsucht werden, Datei und Odrner sind für mich nicht relevant.
(2) Warum in Englisch?
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mi 05.03.08 12:10
@kkausp: Gute Idee, wird eingebaut!
Kroko hat folgendes geschrieben: | | (1) Na ja, für den Anfang nicht schlecht, dringend erfoderlich, das ganze Projekte durchsucht werden, Datei und Odrner sind für mich nicht relevant. |
Naja, üblicherweise hat man ja einen eigenen Ordner für ein Projekt. Wenn ein Ordner ausgewählt wird werden alle Files aus diesem Ordner inkl. Unterordner zur Analyse herangezogen. Oder gibt es bessere Vorschläge?
Kroko hat folgendes geschrieben: | | (2) Warum in Englisch? |
Ganz einfach weil ich es mir angewöhnt habe alle meine Projekte in Englisch zu machen!
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 05.03.08 13:38
Kroko hat folgendes geschrieben: | | (2) Warum in Englisch? |
Weil englisch jeder auf der welt verstehen sollte und dadurch das programm für jeden auf der welt nutzbar wird.
@Motzi: Coole Idee. getestet hab ichs noch nicht. (Hab keine Programm am PC mit dem internet) Wir aber noch nachgeliefert.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Mi 05.03.08 16:28
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Tarry
      
Beiträge: 213
Erhaltene Danke: 1
|
Verfasst: Mi 05.03.08 19:26
ALs erstes: Super Idee
Ich hab auch noch zwei Verbesserungsvorschläge:
1) Man bekommt den Code nur in Großbuchstaben zu sehen, es wäre schöner wenn du ihn in der Orginalformatierung (auch mit Kommentaren) anzeigen würdest.
2) Ich würde gerne den Kontext des Codes sehen könne, vielleicht den ganzen Code und die einzelnen Wiederholungen nur in unterschiedlichen Farben hervorgehoben, oder so
Also: Bleib dran
Gruß
Tarry
_________________ "Es gibt zwei Dinge, die unendlich sind. Das Universum und die menschliche Dummheit. Beim Universum bin ich mir noch nicht ganz sicher." -Albert Einstein
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 06.03.08 02:30
Neue Version ist online, Details siehe erstes Posting.
Tarry hat folgendes geschrieben: | | 1) Man bekommt den Code nur in Großbuchstaben zu sehen, es wäre schöner wenn du ihn in der Orginalformatierung (auch mit Kommentaren) anzeigen würdest. |
Im Treeview sind 2 "Ebenen" - die erste Ebene enthält die Duplikate, wenn du einen Knoten aus dieser Ebene auswählst wird der "preprocessed code" angezeigt. In der zweiten Ebende (also die Kindknoten der Duplikate) sind die "Sources", das sind all jene Stellen im Sourcecode deren Code nach dem Preprocessing mit dem des Duplikats identisch ist. Sprich: alle Kindknoten eines Duplikats sind semantisch äquivalent.
Tarry hat folgendes geschrieben: | 2) Ich würde gerne den Kontext des Codes sehen könne, vielleicht den ganzen Code und die einzelnen Wiederholungen nur in unterschiedlichen Farben hervorgehoben, oder so  |
Das ist seit der neuen Version möglich. Einfach "Show complete file" über dem Editor aktivieren und du bekommst immer das komplette File in dem das jeweilige Duplikat markiert ist.
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 06.03.08 10:11
(a) neue Version -> schon mal ganz gut, aber
(b) Fenster zu breit, vielleicht kannst Du es etwas verkleinern bzw. poScreenCenter setzen!
(c) Ist das Auslesen der Pfade aus der cfg-Datei noch im ToDo?
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 06.03.08 10:49
Kroko hat folgendes geschrieben: | | (b) Fenster zu breit, vielleicht kannst Du es etwas verkleinern bzw. poScreenCenter setzen! |
poScreenCenter kommt noch (hab ich in der Version vergessen)
Kroko hat folgendes geschrieben: | | (c) Ist das Auslesen der Pfade aus der cfg-Datei noch im ToDo? |
Ja, aber im Moment eher weiter hinten. Ich denke der Ordner-Ansatz ist fürs erste mal ausreichend. Eventuell mach ich es so, dass in Zukunft mehrere Files/Ordner ausgewählt werden können, die alle durchsucht werden.
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 06.03.08 10:59
(a) mehrere Ordner wäre auch okay
(b) per Ini-Datei etc. sollten die Einstellungen speicherbar sein, man hat wenig Lust die Ordner jedesmal neu zu suchen
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 06.03.08 11:42
Kroko hat folgendes geschrieben: | | (b) per Ini-Datei etc. sollten die Einstellungen speicherbar sein, man hat wenig Lust die Ordner jedesmal neu zu suchen |
Ist ebenfalls in Planung - zusammen mit einigen anderen Einstellungen (siehe erstes Posting): 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 08.03.08 17:14
Führst Du eine textuelle oder eine syntaktische Duplikatsuche durch?
Heißt: Wird auch sowas erkannt?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure Proc1; var I: Integer; begin For I := 0 To 15 do WriteLn('Hello World!'); end;
Procedure Proc2; var A: Integer; begin For A := 0 To 15 do WriteLn('Hello World!'); end; |
Das kommt nämlich auch häufig vor, dass Variablen einfach auch anders heißen, als im Original-Source.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Sa 08.03.08 17:40
Darf ich mal fragen, wozu so ein Programm gut sein soll? 
_________________ Na denn, dann. Bis dann, denn.
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 08.03.08 18:01
BenBE hat folgendes geschrieben: | Führst Du eine textuelle oder eine syntaktische Duplikatsuche durch?
Heißt: Wird auch sowas erkannt?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure Proc1; var I: Integer; begin For I := 0 To 15 do WriteLn('Hello World!'); end;
Procedure Proc2; var A: Integer; begin For A := 0 To 15 do WriteLn('Hello World!'); end; |
Das kommt nämlich auch häufig vor, dass Variablen einfach auch anders heißen, als im Original-Source. |
Ich führe eine textbasierte Suche durch, so etwas wird also nicht erkannt. Eine semantische Duplikatssuche wäre in vielerlei Hinsicht besser, allerdings erfodert diese ein völlig anders Vorgehen und wäre um einiges komplizierter umzusetzen. Ich denke aber, dass auch der textbasierte Ansatz kann durchaus hilfreich sein.
@alzaimar: ganz einfach, wenn du feststelltst, dass du in deinem Projekt ein und denselben Code mehrmals hast, dann ist es unter Umständen sinnvoll diesen Teil in eine eigene Funktion auszulagern, was den Code wiederum besser wartbar macht. Es liefert einfach ein paar Ansätze zum Refactoring. Ich hab zum Beispiel vor einigen Wochen ein Projekt übernommen das ~40.000 Zeilen hatte. Einige Tausend davon waren aber vollkommen unnötig, da der ursprüngliche Programmierer Funktionen bis zu 8 mal in unterschiedliche Units kopiert hat. Solche Sachen lassen sich mit diesem Programm schnell feststellen. (dieses besagte Projekt war es auch, das mich auf die Idee gebracht hat dieses Programm zu schreiben).
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 08.03.08 18:01
Das ist für die Leute gut, die viel redundanten Source schreiben, und nun versuchen, diesen zu kürzen.
Im Endeffekt kann man damit auch Codestellen suchen, die im Falle eines Fehlers einen solchen aufweisen werden. Daher auch mein Hinweis in Bezug auf Syntaktische oder rein textuelle Vergleiche. Mit der syntaktischen Variante, kann man feststellen, dass beide Routinen in meinem Beispiel den gleichen Fehler haben werden, mit einer rein Textuellen Analyse geht dies nicht.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 08.03.08 18:25
BenBE hat folgendes geschrieben: | Das ist für die Leute gut, die viel redundanten Source schreiben, und nun versuchen, diesen zu kürzen.
Im Endeffekt kann man damit auch Codestellen suchen, die im Falle eines Fehlers einen solchen aufweisen werden. Daher auch mein Hinweis in Bezug auf Syntaktische oder rein textuelle Vergleiche. Mit der syntaktischen Variante, kann man feststellen, dass beide Routinen in meinem Beispiel den gleichen Fehler haben werden, mit einer rein Textuellen Analyse geht dies nicht. |
Eine solche Analyse wäre ohne Zweifel wesentlich besser, da sie vollkommen unabhängig von Namen, Formatierung, Reihenfolge von Variablendeklarationen etc wäre, aber so etwas ist wie gesagt wesentlich komplizierter zu implementieren! Ich mache im Prinzip nichts anderes als Kommentare etc entfernen und die übrig gebliebenen Zeilen in ein paar Datenstrukturen zu verpacken die mit geeigneten Algorithmen sortiert/durchsucht etc werden (Details wären hier jetzt zu kompliziert). Auf jeden Fall war das recht schnell und einfach zu implementieren und das war das einzige worauf es mir angekommen ist. Für eine syntaktische Analyse müsste man einen kompletten Syntax-Parser schreiben und einen Syntaxbaum aufbauen welcher dann so transformiert werden müsste, dass man eine entsprechende Duplikatssuche durchführen kann. Ist sicher sehr interessant sowas zu machen, aber ich tu mir die Arbeit nicht an! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Motzi 
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 08.03.08 21:13
Neue Version ist fertig (siehe erstes Posting)!
Hab gerade einen Hardcore-Test gemacht:
Files: 947
Original lines: 292.041
Preprocessed lines: 152.783
Comparisons: 665.512.367
Duplicates: 544
Duplicates sources: 1675
Time: 52.250ms
Gruß, Motzi
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 09.03.08 10:19
Motzi hat folgendes geschrieben: |
@alzaimar: ...in deinem Projekt ein und denselben Code mehrmals hast, ... |
Die erste Version funktionierte ja nur mit einer einzigen PAS-Datei und da war mir der Sinn nicht klar. So ist es natürlich ein extrem praktisches Tool für Entwickler, die den Mist anderer Frickler aufräumen müssen. 
_________________ Na denn, dann. Bis dann, denn.
|
|
kkausp
      
Beiträge: 77
Erhaltene Danke: 1
W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
|
Verfasst: Mi 12.03.08 17:21
Hallo
ich hätte noch einen Wunsch, das als hint des Filenamens der vollständige Pfad angezeigt wird, da bei mir einige Dateien offensichtlich doppelt in der Folderstruktur sind.
PS: Ansonsten hat er auch 500.000 Original lines mit 260.000 Preprocessed lines überstanden.
PPS: Ist das nächste dann die IDE-Integration? ;-)
|
|
|