namespace refactoring



  • Hi,

    kennt jemand Open Source Tools, mit denen man namepsaces in einem größeren Projekt sauber umbenennen/entfernen kann?



  • Lässt sich doch relativ schnell selber tippen. Ansonsten nen Header mit den ganzen using namespace's anlegen und inkludieren.


  • Mod

    Kóyaánasqatsi schrieb:

    Lässt sich doch relativ schnell selber tippen. Ansonsten nen Header mit den ganzen using namespace's anlegen und inkludieren.

    😮 Das nennst du sauber?

    @Threadersteller: Kann dir leider nicht weiterhelfen, außer nicht das oben genannte zu tun.



  • Was sollte nicht daran sauber sein?



  • Kóyaánasqatsi schrieb:

    Lässt sich doch relativ schnell selber tippen.

    Das "größeres Projekt" übersehen?

    Ansonsten nen Header mit den ganzen using namespace's anlegen und inkludieren.

    👍 saubere Lösung!

    kdevelop/eclipse/... bieten Tools zum Refactoring an.
    Ansonsten mal mit sed versuchen, einen Großteil wirst du damit wegbekommen.
    Ansonsten gibts hier einiges zu lesen/probieren.

    P.S.:
    irgendwie hab ich meine [ironie]-tags verlegt.



  • Kóyaánasqatsi schrieb:

    Was sollte nicht daran sauber sein?

    Weil du mit dem "using"-header eben das ganze Refactoring überflüssig machst, neben dem dass natürlich auch Header vom Refactoring betroffen sind, und die dann am Ende auch deinen "using"-Header einbinden und alles kaputt machen.
    Üblicherweise nennt man sowas nicht "Lösung" sondern "Hack", "böser Hack", bestenfalls noch "temporäre, unsaubere Lösung".



  • Kóyaánasqatsi schrieb:

    Lässt sich doch relativ schnell selber tippen.

    So einfach ist das wohl kaum. Zumindest, wenn du namespaces komplett aus einem großen Projekt löschen möchtest, musst du schon anfangen C++-Code zu parsen, um keinen Mist zu bauen. Einfaches Suchen und Ersetzen funktioniert hier leider nicht.

    Kóyaánasqatsi schrieb:

    Ansonsten nen Header mit den ganzen using namespace's anlegen und inkludieren.

    Mir geht's ja nicht darum die Schreibarbeit bei Deklarationen usw zu vermeiden, sondern die logische Struktur des Codes zu ändern.


  • Mod

    Ansonsten mal mit sed versuchen, einen Großteil wirst du damit wegbekommen.

    An das sed hatte ich auch schon gedacht, aber da müsste man doch schon ein relativ intelligentes Tool programmieren. Mit einfacher Textersetzung ist es ja nicht getan (besonders beim Entfernen). Man muss schon die C++-Syntax zumindest teilweise parsen, damit man z.B. nicht versehentlich etwas in Textliteralen ersetzt. Und ganz krank wird es, wenn man auch noch Makrotricksereien oder Trigraphsequenzen zulassen möchte.

    Insgesamt würde ich da doch lieber erstmal die anderen von dir genannten Tools probieren, bevor man selber was bastelt. Das wäre nämlich ganz schön Arbeit (und das ist vermutlich der Grund, warum der Threadersteller fragt 🙂 ).



  • Unter Eclipse CDT gibt es im Menü Refactor tatsächlich eine tolle Rename Funktion, die auch für namespaces funktioniert. Damit kann man die namespaces aber leider nicht entfernen...

    Die sed Variante riecht in der Tat nach einiger Arbeit und evtl. tagelanger Fehlersuche -- wohl nicht ganz optimal.



  • enki schrieb:

    Die sed Variante riecht in der Tat nach einiger Arbeit und evtl. tagelanger Fehlersuche -- wohl nicht ganz optimal.

    Nur wenn du sed noch nicht kennst/beherrscht. Dann ist es allerdings wie mit allen neuen Werkzeugen - man muss die Bedienung erstmal lernen. 🙂



  • Kóyaánasqatsi schrieb:

    Lässt sich doch relativ schnell selber tippen.

    Na dann mach mal und zeig her.

    Ansonsten nen Header mit den ganzen using namespace's anlegen und inkludieren.

    Man kann sich auch ins Knie schiessen.



  • Hast du irgend ne Klasse die genauso heißt wie dein Namespace? Oder warum sollte "Namespace::" durch "" erstezen nicht einfach gehen?



  • h???? schrieb:

    Hast du irgend ne Klasse die genauso heißt wie dein Namespace? Oder warum sollte "Namespace::" durch "" erstezen nicht einfach gehen?

    Das könnte sein, ich arbeite nicht alleine an dem Projekt. Falls es gleichnamige Klassen mit statischen Methoden gibt funktioniert das jedenfalls nicht. Und es wäre auch nur die halbe Miete. Sowas wie "namespace Namespace{ ...viel Code... }" ist wieder komplizierter.

    Wenn du das sauber hinkriegen willst, kommst du nicht darum herum den Code zu parsen und alle Sonderfälle zu berücksichtigen. -- Falls es geht möchte ich das nicht per Hand machen 😉



  • Um den Code korrekt parsen zu können muss man schonmal alle Präprozessor-Makros erweitern. (Mal ganz davon abgesehen dass C++ parsen so überhaupt gar nicht einfach ist.) Dummerweise erzeugen die aber auch Text. Und wenn ein Namespace Name dann von einem (oder gar mehreren) Präprozessor-Makros erzeugt wurde, wird es richtig interessant.

    Oder man kauft sich ein Tool wie Visual Assist X, und macht es damit. Funktioniert zwar auch nicht zu 100% (das wäre auch unmöglich behaupte ich mal), aber zu 99%, und meistens (fast immer) ist das gut genug.



  • Ich weiß gar nicht, worauf die genau hinaus möchtest, aber ich würde dir von sämtlicher Form des "namespaces" abraten. Es kann zu unerwünschten Überlagerungen und Ungereimtheiten führen.



  • Elexarie schrieb:

    Ich weiß gar nicht, worauf die genau hinaus möchtest, aber ich würde dir von sämtlicher Form des "namespaces" abraten. Es kann zu unerwünschten Überlagerungen und Ungereimtheiten führen.

    Hmm? Eigentlich sind Namespaces dafür gedacht, Überlagerungen und Ungereimtheiten zu vermeiden...



  • Elexarie schrieb:

    Ich weiß gar nicht, worauf die genau hinaus möchtest, aber ich würde dir von sämtlicher Form des "namespaces" abraten. Es kann zu unerwünschten Überlagerungen und Ungereimtheiten führen.

    Und ich glaube du hast keinen Plan was ein Namespace überhaupt ist.



  • Tachyon schrieb:

    Elexarie schrieb:

    Ich weiß gar nicht, worauf die genau hinaus möchtest, aber ich würde dir von sämtlicher Form des "namespaces" abraten. Es kann zu unerwünschten Überlagerungen und Ungereimtheiten führen.

    Hmm? Eigentlich sind Namespaces dafür gedacht, Überlagerungen und Ungereimtheiten zu vermeiden...

    Genau. Und sobald man kein ähnliches System hat, dann fängt man es bereits an zu vermissen. War bei mir so, als ich Eiffel gelernt habe. Ich hatte bereits in den ersten paar Zeilen, die ich geschrieben habe einen Namenskonflikt mit irgendeinem weit entfernten Modul.

    Natürlich habe ich es mir nicht nehmen lassen und Bertrand Meyer auf diese Problematik angesprochen und als Antwort nur bekommen: (frei übersetzt): "Namensräume verschieben das Problem lediglich und darum sind sie kein Sprachbestandteil".



  • Womit er natürlich Recht hat.

    Nur finde ich es doof Namespaces deswegen wegzulassen. Wenn keine vollständige Lösung bekannt ist, dann nehm ich jederzeit eine, die nur zu 90% funktioniert...



  • Natürlich hat er da Recht, aber das ist eine Verschiebung um Kilometer.
    Imo ist das einfach keine ernst zu nehmende Begründung.

    btw:
    Meine Frage, warum das neue Sprachfeature "across" nicht wie in jeder anderen Sprache foreach heisst hat er bis jetzt nicht beantwortet..
    Ich vermute das (und das mit den namespaces) liegt wohl eher an der "Eiffel-Mentalität". Man möchte sich möglichst weit von den bösen Sprachen, wie Java und C++ distanzieren. Das merkt man immer mal wieder, wenn man mit Eiffel programmiert oder Literatur darüber liest.



  • drakon schrieb:

    Natürlich hat er da Recht, aber das ist eine Verschiebung um Kilometer.
    Imo ist das einfach keine ernst zu nehmende Begründung.

    Ja, hab ja auch geschrieben ich finde es doof Namespaces deswegen wegzulassen.

    drakon schrieb:

    Meine Frage, warum das neue Sprachfeature "across" nicht wie in jeder anderen Sprache foreach heisst hat er bis jetzt nicht beantwortet..
    Ich vermute das (und das mit den namespaces) liegt wohl eher an der "Eiffel-Mentalität". Man möchte sich möglichst weit von den bösen Sprachen, wie Java und C++ distanzieren. Das merkt man immer mal wieder, wenn man mit Eiffel programmiert oder Literatur darüber liest.

    Auf mich macht es eher den Eindruck als ob es das Werk eines sehr intelligenten aber auch etwas zu sturen Eigenbrötlers wäre.
    Ich denke also er wird "across" als Name gewählt haben weil er den Namen "besser" findet, nicht um auf Zwang anders zu sein als C++/Java/...
    Ob das gut ist oder nicht ist wieder ein anderes Thema. Etwas übernehmen nur weil es alle anderen so machen hat genau so offensichtliche Nachteile, wie etwas anders zu machen als alle anderen, nur weil es (eine Spur) besser/logischer/... ist.
    Was schwerer wiegt ist dann natürlich Ansichtssache.


Anmelden zum Antworten