Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

27.05.2015, 13:51

Design Pattern | Zustandsänderung von außen

Hi,
meine Frage ist ein Designproblem.

Wie sind Klassen anzuordnen, wenn man Eingaben von außen erwartet?
Zum Beispiel: Ein Fenster wird minimiert, eine IRC Klasse empfängt eine Nachricht oder ein Button wird gedrückt.

Welche Design-Pattern lassen sich bei solchen Problemen anwenden?
(Disclaimer: Ich kenne bisher nur Singleton, Adapter und Service Locator)

Mir geht's lediglich darum meinen Code eleganter und professioneller zu gestalten.

Gruß Julien
P.S.: Gibt es eigentlich ein Design Pattern Kompendium für C++?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

27.05.2015, 14:10

Spontan würde ich "Observer" in den Raum werfen. Was aber die beste Lösung ist, kommt allerdings auf den konkreten Anwendungsfall an.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

27.05.2015, 14:30

P.S.: Gibt es eigentlich ein Design Pattern Kompendium für C++?

Das originale GoF Buch hat C++ Beispiele (Allerdings nicht aktuell mit C++11/14!).

Ansonsten würde ich in deinem Fall auch zu Observer raten.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

4

27.05.2015, 14:32

Ich empfehle dir allgemein für die Reduzierung von Abhängigkeiten zwischen Klassen das "Observer"-Pattern. Du wirst merken wie natürlich sich deine Programmierung anfühlen wird.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

27.05.2015, 15:01

Gut, jetzt sieht es bei mir so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*

    This class allows the bot to recieve its commands
    from an master in an IRC.

    The constructor takes an adress and a channelname.

    History:
        25/05/2015  File created.
                    Class created.
        26/05/2015  Added additional member.
                    Implemented basic class.
        27/05/2915  Implemented Observer Pattern.

*/

#pragma once
#include <string>
#include <list>

namespace Miscellaneous{

    class IRC{
        public:
            class Observer;

        private:

            std::string address;
            std::string IP;
            std::string channel;
            bool        connected;

            unsigned int    sock;

            std::list<Observer*> observerList;

        public:

            //
            // Takes an address and channel name.
            //
            IRC(std::string address, std::string channel);


            //
            // Closes the connection.
            //
            ~IRC();

            //
            // Connects to the server.
            // Returns 'false' if fails.
            //
            bool connect();

            //
            // Sends a message into the chat room.
            //
            void sendMessage(std::string message);

            //
            // Listens for the latest messages.
            //
            // Calls observers if found something valuable.
            // 
            void processMessages();



            //
            // Adds an observer to observer list
            //
            void addObserver(Observer* obs);

            //
            // Removes an observer from observer list
            //
            void rmObserver(Observer* obs);


            // Observer
            class Observer{
                virtual void processMessage(std::string message) = 0;
                virtual ~Observer() {};
            };
    };
}


Ich nehme an, dass das "ObservedConcreteObject" eigentlich ein Interface wie "ObserverObject" implementieren sollte, aber hier reicht's! :)
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

27.05.2015, 18:18

Ich empfehle dir allgemein für die Reduzierung von Abhängigkeiten zwischen Klassen das "Observer"-Pattern. Du wirst merken wie natürlich sich deine Programmierung anfühlen wird.

Für alles anwenden würde ich das nicht. Das ganze bringt einen gewissen Overhead mit den man sich möglicherweise gern sparen möchte. Und ja, eventlastig programmieren ist auf den ersten Blick total genial und man will gar nicht mehr anders aber nur Vorteile hat auch das nicht. Wie gesagt gibt es einen gewissen Overhead und Abhängigkeiten werden nicht wirklich reduziert sondern viel mehr verschleiert. Code wird dadurch teilweise ziemlich unübersichtlich, vor allem wenn man zu extrem davon Gebrauch macht. Ich denke die Zeiten in welchen jede Software MVC implementieren muss sind vorbei;)
Mein Vorschlag, wende lieber für konkrete Problemfälle konkrete Lösungsmethoden an und versuch nicht zu vereinheitlichen.

edit: Ah gehts wieder an den IRC Bot? :)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

27.05.2015, 19:10

Naja, ich habe auch mal einen Post über das Observer Pattern geschrieben. Vll hilft es ja. Kritik ist auch herzlich willkommen ;)

http://simple2d-engine.de/?p=13

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

27.05.2015, 19:37

Mal was ganz anderes, weil ich die Historie im Kopf der Datei sehe. Gewöhn Dir sowas gar nicht an. Nimm ein SVN, Mercurial, Git oder sonstewas und verwalte Änderungen damit. Mit letzteren brauchst Du dazu nichtmal einen Server, Du kannst alles direkt lokal lassen, wieder auschecken, ändern, verfolgen, nachlesen oder was Du gerade brauchst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

10

28.05.2015, 00:17

@BlueCobold:
Danke, wusste nicht, dass ich GIT ohne Server verwenden kann.

@Schorsch:
Joop! Wobei ich ein bisschen von meinem vorherigen Vorhaben abweiche. Ich will ein kleines dezentrales Netzwerk machen, ähnlich dem vom BitCoin woher ich auch die Idee habe.
Die BitCoin-Programme gehen auf einen IRC, holen sich eine Peer-IP und verbinden sich dann mit den anderen Clienten.
Alternativ wäre da noch der Netzwerk Broadcast, der jedoch nur in einem Subnetz zum Ziel führt (Korrektur bitte!).
Es wird wahrscheinlich nur eine kleine Chatapp, aber vll. kann ich dass auch in einem Spiel nutzen, wäre bestimmt geil.

@anti-freak:
Interessanter Artikel! Ich glaube, dass ich den Ansatz mit Signals und Slots bei Qt schonmal gesehen habe, wobei ich zur Zeit mehr mit QML und JavaScript programmiere,
da ich dies sauberer finde.
Ich fände es interessant, wenn man Funktionen schon mit bestimmten Referenzen als Parameter binden könnte. Mal sehen was C++ 11/14 da so bietet.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Julién« (28.05.2015, 00:33) aus folgendem Grund: Je müder desto weiter die Gedankensprünge.


Werbeanzeige