API-Design: Baukasten-System?



  • hi. ich habe nur mal den quelltext überflogen.
    habt ihr einen this-fetisch? oO
    und warum gibt eine void funktion einen rückgabewert zurück? ^^



  • Hi Scorcher24,

    meine E-Mail-Adresse steht auf meiner Download-Seite.

    Und was mir zu deinem Source auffällt:
    du mußt lernen, noch mehr zu abstrahieren (und möglichst noch kleinere Funktionsblöcke zu schreiben), aber evtl. könnte ich ja direkt mit deinen Sourcen arbeiten, bzw. Teile davon dann selbst erstellen und dann dir schicken (oder direkt per SVN).

    Hast du denn schon mal ein einfaches Klassendiagramm erstellt (damit du den Umfang abschätzen kannst)?

    Und welchen Compiler (+OS) verwendest du?

    P.S. das "this->" finde ich auch unnötig...



  • http://www.th-h.de/
    Die hier? In deinem Profil steht leider nix drin -.-. Oder ich bin zu blöd *g*.

    Und was mir zu deinem Source auffällt:
    du mußt lernen, noch mehr zu abstrahieren (und möglichst noch kleinere Funktionsblöcke zu schreiben), aber evtl. könnte ich ja direkt mit deinen Sourcen arbeiten, bzw. Teile davon dann selbst erstellen und dann dir schicken (oder direkt per SVN).

    Hmm, ja ich hab mir halt alles selbst beigebracht und meine Freunde haben alle ganz andere interessen :D. Hobby halt :P. Aber ich versuche mich zu verbessern.

    Hast du denn schon mal ein einfaches Klassendiagramm erstellt (damit du den Umfang abschätzen kannst)?

    Ja, im Kopf. Hab leider bisher kein gutes UML-Tool für Windows gefunden und für Linux hab ich momentan keinen Platz auf der Platte... alles voll. Aber die neue Festplatte ist in Arbeit :P.
    Wegen den this->: Ja, ich weiss, dass es nicht nötig ist, das war nur zu Kontrollzwecken. Es macht ja keinen Unterschied ob das da jetzt steht oder nicht. Auf der anderen Seite sieht man auch gleich, dass es eben aus der Klasse kommt. Von daher egal.

    und warum gibt eine void funktion einen rückgabewert zurück? ^^

    Sie gibt keinen Wert zurück. Ich verlasse die Funktion in eine andere. Zumindest der g++ hat nicht gemecker mit "g++ --ansi". 😉

    Compiler verwende ich Visual C++ 2005 (war ein Geschenk nach einem Praktikum in einer Softwarefirma) von M$ und Ankh-SVN-Plugin. Werde aber schauen, dass das ganze in purem C++ geschrieben ist und evtl. gleich ein Bakefile dazu machen, dann kann man das auf jeder Plattform kompilieren.
    So far. 🙂
    rya.



  • Scorcher24 schrieb:

    Hast du denn schon mal ein einfaches Klassendiagramm erstellt (damit du den Umfang abschätzen kannst)?

    Ja, im Kopf. Hab leider bisher kein gutes UML-Tool für Windows gefunden und für Linux hab ich momentan keinen Platz auf der Platte... alles voll. Aber die neue Festplatte ist in Arbeit :P.

    Dia macht sich ganz gut für einfache Diagramme 😉

    http://live.gnome.org/Dia



  • Sieh dir mal component-based entity management an. Die Grundidee davon ist, dass man einzelne Komponenten wie Destroyable (mit health, maxhealth), Moveable (speed), Collideable (collisionRange) usw. hat und die konkreten Objekte wie ein Monster aus solchen zusammensetzt.

    Sowas wie eine Monster-Klasse gibt es dort nicht. Stattdessen ist jede Entität nur eine ID, anhand derer man die einzelnen Komponenten holen kann. Die Komponenten können miteinander über ein Message-System kommunizieren und jede Komponente entscheidet, an welchen Messages sie interessiert ist.

    Der Vorteil ist, dass das ganze System data-driven ist, das heißt du kannst dir einen Editor zum zusammenklicken basteln, und damit alle NPCs usw. erzeugen, ohne an einer gratligen Vererbungshierarchie 100mal zu refactoren - es geht komplett ohne programmieren und du hast auch nicht die üblichen Designprobleme, die du mit einer Klassenhierarchie hast.



  • Optimizer:
    So in die Richtung hab ich schon gedacht, nur wüsste ich jetzt nicht, wie ich so ein Nachrichten-System umsetzen sollte. Was ich mir vorstellen könnte, war ein Messaging-Manager, an dem sich alle Klassen anmelden (Jede Instanz für sich) und der dann jede Nachricht delegiert. Aber ich stell mir das gerade iwie voll langsam vor. Angenommen du hast 200 NPC's dann müsste jede Message in einer Schleife (oder wie macht man das?) 200x verschickt werden. Man könnte natürlich auch wieder dem Manager vorher mitteilen welche Nachrichten welche Klasse bzw Objekt haben will und welche nicht. Das wiederrum wäre mMn ein großer Sortier- und Verwaltungsaufwand.. oder?
    Bin mit solchen System ehrlich gesagt nicht richtig vertraut :).
    Ich hätte es halt so gemacht, dass es halt solche Listener gibt und die Klassen die Nachrichten dann selber versenden, bzw selbst die Listen führen... naja mal schauen, was ich da hinbasteln kann :).

    @darthdespotism:
    Danke :). Kannt ich gar nicht das Prog. Verwende eigentlich KDE und da gibts kUML. 🤡

    edit:
    So, hier is mal ein kleines Diagramm mit dem Abschnitt für den Charakter:
    http://img524.imageshack.us/my.php?image=diagramrpglibwu0.jpg
    rya.



  • Bei deinem Diagramm ... fällt dir da nciht was auf?
    IExperience, IEnergy und IHealth haben alle so ziemlich die selben Werte (IEnergie hat noch einen Max/Min-Wert ...). Was kann man dann daraus machen?



  • (D)Evil schrieb:

    Bei deinem Diagramm ... fällt dir da nciht was auf?
    IExperience, IEnergy und IHealth haben alle so ziemlich die selben Werte (IEnergie hat noch einen Max/Min-Wert ...). Was kann man dann daraus machen?

    Hmm, noch ein Interface mit get/set-Methoden und dem Wert? 😃
    Ist das nicht ein wenig zuviel des guten?
    rya.



  • Also ich hab jetzt bei vielen Klassen mit gleichen Eigenschaften und Methoden irgendwie an Templates gedacht, aber ob (D)Evil das auch gedacht hat weiß ich nicht.



  • OhneName schrieb:

    Also ich hab jetzt bei vielen Klassen mit gleichen Eigenschaften und Methoden irgendwie an Templates gedacht, aber ob (D)Evil das auch gedacht hat weiß ich nicht.

    Hehe, ja das ist wahrscheinlich:
    http://img442.imageshack.us/my.php?image=diagramrpglibjt1.jpg
    So?^^
    rya.



  • Scorcher24 schrieb:

    Optimizer:
    So in die Richtung hab ich schon gedacht, nur wüsste ich jetzt nicht, wie ich so ein Nachrichten-System umsetzen sollte.

    Ja, das ist nicht völlig trivial. Ich habe so ein System mal vor kurzem umgesetzt und es gefällt mir wirklich ganz gut. Aber am Nachrichten-System feilsche ich auch noch. Das hängt wahrscheinlich vom Einzelfall ab, wie man das genau aufzieht, aber im Grunde gibt es immer sowas wie einen Entitätenmanager, der Nachrichten verschickt, broadcasted und über den man Komponenten getten kann. Wenn du danach suchst, findest du sicher auch ein paar Beispiele.

    Aber ich stell mir das gerade iwie voll langsam vor.

    Irgendeinen Tod muss man natürlich sterben. Performance-Probleme dürftest du aber eher bei den Berechnungen, die durch Nachrichten indirekt ausgelöst werden (zum Beispiel wenn es eine Wegsuche auslöst) kriegen und nicht beim Übermitteln selber.

    Angenommen du hast 200 NPC's dann müsste jede Message in einer Schleife (oder wie macht man das?) 200x verschickt werden. Man könnte natürlich auch wieder dem Manager vorher mitteilen welche Nachrichten welche Klasse bzw Objekt haben will und welche nicht. Das wiederrum wäre mMn ein großer Sortier- und Verwaltungsaufwand.. oder?

    Der Aufwand hält sich eigentlich in Grenzen. Ich hab sowas wie eine subscribersByType-Map, die sich den Nachrichten-Typ anschaut und die Liste der interessieren Komponenten holt. Das skaliert dann auch besser mit der Objektzahl, weil man nur die Interessenten benachrichtigt.

    Ich hätte es halt so gemacht, dass es halt solche Listener gibt und die Klassen die Nachrichten dann selber versenden, bzw selbst die Listen führen...

    Das Problem hierbei ist, dass du die Empfänger kennen musst, was das ganze System ad absurdum führt. Es ist besser, wenn eine Komponente möglichst wenig von allen anderen weiß.



  • Auch wenns mir eigentlich widerstrebt, weil ich Boost nicht so mag, aber wäre Boost::Signals hier ne Möglichkeit? Vielleicht nicht ganz das, was man möchte, aber man könnte doch damit einen Manager implementieren, bei dem sich alle Objekte anmelden (über ein Singleton), die bei bestimmten Events benachrichtigt werden möchten und dabei eine oder mehrere Event-Typen (über eine einfache ID) angeben. Je nach der ID wird man dann in eine Liste einsortiert und benachrichtigt, wenn ein Event eintritt.
    So ein kleines Beispiel mit pseudo-code:

    enum eEvents
    {
       ID_LEVELUP = 1,
       ID_FOOBAR,
    };
    
    class Experience
    {
       receiveEP()
       {
           if (level_up)
           { 
              EventManager::notify(ID_LEVELUP);
           }
       }
    };
    
    class MyCharacter
    {
        MyCharacter()
        {
          EventManager::register(ID_LEVELUP, this);
        }
    
        // Afaik muss man bei Boost diesen Operator implementieren um 
        // die Klasse übergeben zu können....
        void operator()()
        {
            // Handle level up
        }
    };
    

    Wäre vllt die einfachste Möglichkeit die mir so spontan einfällt. Weil wenn ich ganz ehrlich bin, reicht mein Wissen für so ein Modell wie du das genannt hast, (noch) nicht aus :). Übernehen möchte ich mich halt auch nicht. :xmas1:
    Eine andere Idee wäre es, den EventManager bzw das EventSystem von wxWidgets zu benutzen. Die Lib ist XPlatform, wäre also kein Problem von der Portabilität, allerdings ist das Einbinden eher unlustig. Ich möchte, dass der Code auf Linux/Windows/MacOS läuft.
    Aber an der Stelle nochmal vielen Dank für eure Ideen und Hilfe.
    rya.


Anmelden zum Antworten