Entwickler-Ecke

Freeware Projekte - DoubleSource - Duplikate im Source finden v0.4.1


Motzi - Mi 05.03.08 03:26
Titel: DoubleSource - Duplikate im Source finden v0.4.1
Hi,

erstmal vorweg - ich weiß, dass es so ein Programm vor kurzem schonmal in der DP gab (DupeChecker [http://www.delphipraxis.net/topic79253_dupechecker+duplikate+im+source+finden+v13.html]). 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: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

v0.3.1

v0.2.2Folgende Einstellungen sind möglich:


v0.1.2

TODO:

Gruß, Motzi


kkausp - 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 - 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?


Motzi - Mi 05.03.08 12:10

@kkausp: Gute Idee, wird eingebaut!
user profile iconKroko 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?
user profile iconKroko 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


elundril - Mi 05.03.08 13:38

user profile iconKroko 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


Kroko - Mi 05.03.08 16:28

user profile iconMotzi hat folgendes geschrieben:
...
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.

Habe ich auch, aber ständig wiederkehren Units mit Klassen, Proc/Func und Forms habe ich in Extra-Ordnern. Man kann ja die Projekt-Datei und die Optionen-Datei analysieren!
user profile iconMotzi hat folgendes geschrieben:
user profile iconKroko 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
Finde ich persönlich nicht gut! :cry:


Tarry - 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


Motzi - Do 06.03.08 02:30

Neue Version ist online, Details siehe erstes Posting.

user profile iconTarry 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.

user profile iconTarry 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


Kroko - 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?


Motzi - Do 06.03.08 10:49

user profile iconKroko 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)
user profile iconKroko 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.


Kroko - 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


Motzi - Do 06.03.08 11:42

user profile iconKroko 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): :)


BenBE - 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.


alzaimar - Sa 08.03.08 17:40

Darf ich mal fragen, wozu so ein Programm gut sein soll? :gruebel:


Motzi - Sa 08.03.08 18:01

user profile iconBenBE 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


BenBE - 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.


Motzi - Sa 08.03.08 18:25

user profile iconBenBE 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! :)


Motzi - 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


alzaimar - So 09.03.08 10:19

user profile iconMotzi 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. :zustimm:


kkausp - 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? ;-)


Motzi - Mi 12.03.08 18:26

user profile iconkkausp hat folgendes geschrieben:
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? ;-)

Dass der vollständige Pfad in irgendeiner Art und Weise angezeigt werden sollte hab ich mir auch schon gedacht, ich hatte bis jetzt nur noch keine Idee wie/wo, da komplette Pfade ja doch auch recht lang werden können. Als Hint ist aber gar keine schlechte Idee.

@PS: in der DP hat sogar einer einen Hardcore-Test mit 4,9 Mio Zeilen gemacht, da gibt es bei der jetzigen Version aber irgendwann eine Out-of-Memory Exception
@PPS: keine schlechte Idee, das wird aber vermutlich etwas kompliziert, weiß nicht ob ich das mach. Aber wenn jemand schonmal IDE-Plugins gemacht hat und sich ein bisschen damit auskennt darf er mich gerne kontaktieren! :)

Gruß, Motzi


elundril - Mi 12.03.08 18:33

gib den pfad in ein edit rein das man nicht bearbeiten kann und keinen rand hat. so machts windows auch z.b: bei den ganzen verknüfungen wenn die nen pfad anzeigen müssen.

lg elundril


Motzi - Sa 15.03.08 20:22

Neue Version ist online - siehe erstes Posting.

Hardcore-Test-Ergebnisse folgen noch...

Gruß, Motzi