Ist C++ wirklich so schlecht?



  • Original erstellt von Gregor:
    ...ich nutze Reflection momentan in Verbindung mit Plugins.

    Wie das?



  • java



  • Original erstellt von Mr. N:
    Wie das?

    Naja! Ich durchsuche halt bei Programmstart ein Verzeichnis nach allen Java-Klassen, teste dann, welche mein Plugin-Interface implementieren, teile diese noch in ein paar verschiedene Kategorien ein, erzeuge mir mit Hilfe der geladenen Klassen einen Großteil meiner GUI und erzeuge mir bei Bedarf ein Objekt einer Klasse.

    ...vor allem kommt es mir also aufs dynamische Klassenladen an.



  • Ich durchsuche halt bei Programmstart ein Verzeichnis nach allen Java-Klassen

    Wie soll das gehen?



  • Original erstellt von <Domian>:
    Wie soll das gehen?

    Zum Beispiel so:
    [java]
    public static Class [] loadControllerClasses ()
    {
    java.net.URL controllerURL = PluginLoader.class.getResource ("/plugin");
    LinkedList classList = new LinkedList();
    try
    {
    File controllerDirectory = new File (new URI(controllerURL.toString ()));
    File [] directories = getSubdirectories(controllerDirectory);
    if (directories == null) return null;
    for (int i = 0 ; i < directories.length ; ++i)
    {
    File [] files = directories[i].listFiles ();
    for (int x = 0 ; x < files.length ; ++x)
    {
    Class currentClass = loadControllerClass (files[x]);
    if (currentClass != null)
    {
    classList.add(currentClass);
    }
    }
    }
    }
    catch (java.net.URISyntaxException e)
    {
    return null;
    }
    Class [] outArray = new Class [classList.size ()];
    Iterator iterator = classList.iterator ();
    for (int i = 0 ; i < outArray.length ; ++i)
    {
    outArray[i] = (Class)iterator.next ();
    }
    return outArray;
    }

    private static File [] getSubdirectories (File directory)
    {
    if (!directory.isDirectory ()) return null;
    ArrayList directoryList = new ArrayList();
    File [] files = directory.listFiles ();
    for (int i = 0 ; i < files.length ; ++i)
    {
    if (files[i].isDirectory ()) directoryList.add(files[i]);
    }
    int length = directoryList.size ();
    for (int i = 0 ; i < length ; ++i)
    {
    File [] newDirectories = getSubdirectories((File)directoryList.get (i));
    for (int x = 0 ; x < newDirectories.length ; ++x)
    {
    directoryList.add(newDirectories[x]);
    }
    }
    File [] directoryArray = new File [directoryList.size ()];
    for (int i = 0 ; i < directoryArray.length ; ++i)
    {
    directoryArray [i] = (File) directoryList.get(i);
    }
    return directoryArray;
    }

    private static Class loadControllerClass(File classFile)
    {
    String className = classFile.getAbsolutePath ();
    if (!className.endsWith (".class")) return null;
    if (!classFile.getParentFile ().getAbsolutePath ().endsWith ("controller")) return null;
    int start = className.indexOf ("plugin");
    className = className.substring (start,className.length()-6);
    className = className.replace (File.separatorChar,'.');
    try
    {
    Class loadedClass = Class.forName (className);
    if (Class.forName ("plugin.Plugin").isAssignableFrom (loadedClass))
    {
    return loadedClass;
    }
    }
    catch (ClassNotFoundException e)
    {
    }
    return null;
    }[/code]
    Der Code ist allerdings schon recht alt und ich bin nicht so zufrieden damit. ...muss ich wohl irgendwann überarbeiten.



  • Hallo,
    Reflections haben wie fast alles ihre Vor- und Nachteile. Ein Vorteil ist ganz klar die Möglichkeit der Reduzierung statischer Abhängigkeiten. Man kann relativ einfach neue Komponenten in ein Programm einbinden ohne irgendetwas neu kompilieren (oder neu ausliefern) zu müssen. Man kann also sehr gut statische Typeinschränkungen aufweichen und vieles auf Stringbasis erledigen.

    Hier liegt aber auch einer der Nachteile. Viele Fehler können so nur noch zur Laufzeit erkannt werden, da zur Compilezeit die notwendigen Informationen noch gar nicht vorliegen. Und Laufzeitfehler sind bekanntlich böse Fehler.

    Übertrieben häufig angewendet resultiert Reflection häufig auch in unnützer Komplexität.

    Ich könnte mir allerdings gut vorstellen, dass der neue C++ Standard auch etwas zum Thema Reflections zu sagen haben wird. Auch wenn der Wunsch nach einem Reflection-System in der C++ Community nicht so verbreitet (gewünscht) ist. Liegt wohl daran, dass sich selbige Community in den letzten Jahren mehr mit Temlates als mit allem anderen beschäftigt hat 🙂



  • Ist sowas wie Reflections überhaupt möglich in einer "compilieren Sprache"?



  • Original erstellt von <Startguthaben>:
    Ist sowas wie Reflections überhaupt möglich in einer "compilieren Sprache"?

    man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );



  • Original erstellt von Dimah:
    man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );

    jo. sehe den sinn von reflection hier nicht.



  • Original erstellt von Mr. N:
    [quote]Original erstellt von Dimah:
    [qb]man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );

    jo. sehe den sinn von reflection hier nicht.[/QB][/QUOTE]
    Ich weiß nicht, was man da alles mit C++ machen kann. Deshalb aus Interesse:

    Zeig mal C++-Code, der ein Verzeichnis nach Klassen durchsucht, die von einer gegebenen Klasse abgeleitet sind. ...es sollen auch andere Klassen in dem Verzeichnis zu finden sein. Die entsprechenden Klassen, die du findest, speicherst du in einem Array, erstellst dann von jeder dieser Klassen ein Exemplar und läßt das Exemplar dann etwas machen, was es wegen der Oberklasse können muss.

    ...ich würde einen solchen Code gerne mal sehen, weil ich es eben noch nicht gesehen habe.

    [ Dieser Beitrag wurde am 17.01.2003 um 00:02 Uhr von Gregor editiert. ]



  • +im moment geht das auf keinen fall. ich glaube auch nicht das es in der nächsten version von c++ geht. 😉



  • Zeig mal C++-Code, der ein Verzeichnis nach Klassen durchsucht, die von einer gegebenen Klasse abgeleitet sind. ...es sollen auch andere Klassen in dem Verzeichnis zu finden sein. Die entsprechenden Klassen, die du findest, speicherst du in einem Array, erstellst dann von jeder dieser Klassen ein Exemplar und läßt das Exemplar dann etwas machen, was es wegen der Oberklasse können muss.

    ...ich würde einen solchen Code gerne mal sehen, weil ich es eben noch nicht gesehen habe.

    Das wirst du ohne eine ausgeklügelte Lib nicht hinbekommen. Bedenke: Es gibt in C++ keine class-Dateien, keinen class-Loader und nix. Nur ein ganz simples RTTI. Du musst also vorher eine Menge Logik reinprogrammieren um sowas hinzubekommen.



  • Original erstellt von HumeSikkins:
    **
    Das wirst du ohne eine ausgeklügelte Lib nicht hinbekommen. Bedenke: Es gibt in C++ keine class-Dateien, keinen class-Loader und nix. Nur ein ganz simples RTTI. Du musst also vorher eine Menge Logik reinprogrammieren um sowas hinzubekommen.**

    Schade! Ich dachte, der Beitrag von Mr. N ging in die Richtung, dass das mit C++ auch nicht so schwer ist! Da habe ich wohl etwas falsches hineininterpretiert! 🙄



  • Hallo,
    mit COM oder ähnlichen Technologien ist das alles nicht so tragisch. In Standard-C++ würde man da wohl aber einige Monate dran sitzen 😃



  • @Gregor :p 😃



  • ...zeig mal, wie soetwas aussieht!



  • man kann ja den gcc sozusagen in sein programm reinbauen und dann die klassen immer wieder neu kompilieren in den speicher laden und ausführen :D.
    aber mal im ernst wenn ich ein plugin will dann schmeiss ich das in ne dll (oder was enstprechnedes) und die informationen die das programm braucht um das plugin einzusetzen kann ich da ja auch einbauen...



  • Original erstellt von Gregor:
    Schade! Ich dachte, der Beitrag von Mr. N ging in die Richtung, dass das mit C++ auch nicht so schwer ist! Da habe ich wohl etwas falsches hineininterpretiert! 🙄

    Ich meinte, dass sowas in solchem C++ Code (der übrigens leider plattformabhängig ist, unter Linux (POSIX?) gibts shared objects, unter Win32 DLLs) unnötig ist. Wobei man aus Gründen der Portabilität zu C Funktionen greifen wird. Man machts ganz ganz einfach so: In dem Verzeichnis alle DLLs (.so s) anschauen und dann die Funktion laden. Fertig. Nix RTTI, nix Reflection. Good ol' C.



  • Original erstellt von <Rüsselsheimer>:
    **Hi @ all,

    **
    WICHTIG:
    @kingruedi && elise: Der Beitrag war ernst gemeint. Ich bin nicht der echte gerner, ich habe ihn sozusagen gefakt.**

    ich möchte mich gleich für meine Wortwahl entschuldigen, ich bin aber ein
    bisschen von C++ entäscht. Ich habe mit Java das Programmieren gelernt und
    in allen Büchern steht, dass Java an C++ angeleht ist. In vier Seiten werden
    für C++ Programmierer die Unterschiede erklärt.
    Ich habe mir also gedacht, lern ich kurz mal C++, das kann nicht schaden.
    Nun muss ich mit Erschrecken feststellen, dass C++ kryptisch und weit
    weniger gut beherrschbar wie Java oder VBA sind. Auch die Klassen in C++
    sind ein Witz, dass ist prakisch nur die Überschrift der Datei.

    Wie ist das eigentich bei C#? Da heißt es es sei eine Mischung aus Java und
    C++. Wem ähnelt es mehr, undwo liegen die Unterschiede zu Java?

    Bin für jede Antwort dankbar,

    Rüsselsheimer**

    Soviel ich weiß ist Java lahmer als C++...
    Und wenn das stimmt, was soll ich mit ner Sprache wo ich bei der Anwendung warten muß, bis ich was weiter bearbeiten darf...



  • Soviel ich weiß ist Java lahmer als C++...
    Und wenn das stimmt, was soll ich mit ner Sprache wo ich bei der Anwendung warten muß, bis ich was weiter bearbeiten darf...

    Wenn man so argumentiert müsste man alles in Assembler schreiben.
    Sicher ist Java in einigen Dingen langsamer als andere Sprachen, aber man muss Java (und jede andere Sprache) ja auch nicht für alles einsetzen. Wenn für eine Anwendung X eine Sprache Y (bzw. besser eine Implementation/eine Umgebung) zu langsam ist, dann muss man eben eine Sprache Z nehmen. Das heißt aber nicht, dass Y keine Daseinsberechtigung hat.

    Und für Y = Java gilt, dass es unzählig viele Anwendungsbereiche gibt, in denen die Performance völlig ausreicht.


Anmelden zum Antworten