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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.02.2013, 20:14

Log-Klasse wie gestalten?

Hi.

Ich bin gerade am umschreiben meiner Log-Klasse. Ich würde von euch jetzt gerne wissen, was von den folgenden zwei Möglichkeiten die bessere ist:
1. Eine Singleton Klasse. Um in die Log-Datei zu schreiben, überlade ich den "->" Operator.
2. Eher nur ein Interface. Ich erstelle "#defines" in meinem Header, die dann das Log-Datei-Interface ansprechen.

Oder gibt es vielleicht noch bessere Vorschläge? Bitte die Antwort begründen.

Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.02.2013, 20:18

Wie wärs mit einer ganz normalen Klasse die du einfach dahin übergibst wo sie gebraucht wird !?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

09.02.2013, 20:19

Nein das passt mir so nicht. Ich würde gerne von Überall drauf zugreifen ohne extra jedesmal die Klasse zu übergeben, oder ein neues Objekt zu erstellen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

09.02.2013, 20:29

Könntest das Registry Pattern verwenden. Aber im Grunde ist das auch nur eine Kapselung von globalen Variablen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

09.02.2013, 21:14

Also wenn schon global, dann bitte über eine Factory. Weder Variante 1 und schon gar nicht Variante 2. Eine Factory ist einem Singleton sehr ähnlich, aber noch allemal besser, weil es wesentlich mehr Möglichkeiten für eine Klassen-spezifische Initialisierung ermöglicht. So macht es z.B. ApacheLog.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.02.2013, 21:20

Wenn es wirklich sein muss, dann würd ich das wohl über eine Accessor-Funktion lösen, also sowas:

C-/C++-Quelltext

1
2
3
4
5
Log& log()
{
  static Log l;
  return l;
}

Die kann dann notfalls noch z.B. zumindest für jeden Thread eine andere Instanz returnen.

Ich würde dir aber jedenfalls sehr empfehlen, dir nochmal genau zu überlegen, wieso du nicht einfach ein Log übergeben kannst wo eins benötigt wird...


Und wenn es tatsächlich global sein muss, würde ich mir an deiner Stelle zumindest mal die Frage stellen, ob es wirklich eine Klasse sein muss, oder ob freie Funktionen in einem namespace nicht besser wären...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (09.02.2013, 21:30)


7

09.02.2013, 23:57

Viel wichtiger als die eigentliche Entscheidung, wie du es machst, ist es zu verstehen, was der jeweilige Unterschied ist.

Singleton ist Blödsinn, weil es sehr gut vorstellbar ist, dass man verschiedene Logs haben will. Singleton ist eigentlich immer Blödsinn, aber hier ganz besonders.

Eine globale Variable wäre natürlich das aller einfachste. Lustig wird es, wenn du dir überlegen musst, was bei mehreren Threads passieren soll. Wenn du eh nicht Multithreaded programmieren willst, musst du dir darüber natürlich keine Gedanken machen, aber es lohnt sich auf jeden Fall, das im Hinterkopf zu behalten, weil es gerade bei so etwas wie einem Log-Objekt ab und zu möglich ist, dass 2 Threads gleichzeitig darauf zugreifen und dann lustige Fehler passieren. Sowas kann man durch unterschiedliche Logger für unterschiedliche Threads lösen, oder aber indem man den Thread-Zugriff synchronisiert.

Ein Log-Objekt irgendwie durchzureichen, bis es überall ist, wo man mal was loggen will finde ich nicht so toll. Es hängt natürlich stark davon ab, was genau du loggen willst, und wie tief runter es dann dementsprechend gehen müsste. Wenn du nur ein bisschen Initialisierungskram in 4 verschiedenen Objekten loggen willst, ist es kein Thema, aber wenn du in jedem Mini-Objekt Debugausgaben haben willst, bläht das den ganzen Code ohne wirklichen Mehrwert ziemlich auf. Und die extra Arbeit hält dich evtl. davon ab, etwas zu loggen, was du ansonsten gerne getan hättest, und durch sowas können sehr leicht wichtige Informationen einfach verloren gehen.

Aber: Bist du dir sicher, dass du überhaupt eine Log-Klasse brauchst? Damit Debug-Ausgaben zu machen ist ein wenig fragwürdig, mit den meisten IDE kannst du viel besser debuggen. Und Fehler will man vielleicht live ausgeben und nicht in irgendeine Datei schreiben.
Ich persönlich benutze meistens cout und habe dann eben noch ein Konsolenfenster neben dem Spielfenster. Der Vorteil ist, dass du überhaupt nichts machen musst, es ist einfach da und funktioniert. In meinem Editor benutzt der Exception-Handler dagegen Message-Boxen um Fehler auszugeben, weil es da sehr leicht geht - in mein Spiel eine GUI nur für Fehlermeldungen einzubauen hätte hingegen wenig Sinn gemacht.


@BlueCobold: Was genau meinst du mit Factory? Die Aussage ist mir ein bisschen zu allgemein um zu verstehen, was genau du meinst und ich bin mir ziemlich sicher, dass der Fragesteller nicht einmal ansatzweise versteht, worum es da geht. Eine Factory ist für mich einfach nur irgendeine Art von Objekt, das dafür da ist, irgendwelche anderen Objekte zu erzeugen, das hat zunächst mal gar nichts mit der Zugriffsmethode zu tun, und daher auch nichts mit Singletons. Und jetzt in den Apache-Source schauen will ich wirklich nicht.
Lieber dumm fragen, als dumm bleiben!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

10.02.2013, 00:02

Logging ist dann sinnvoll, wenn man nicht beim Lauf des Programms dabei ist oder eben nicht debuggen kann. Dann ist man schon froh zu wissen, was wo wann passiert ist oder eben nicht.
Ein Singleton macht ebenfalls meiner Meinung nach gar keinen Sinn. Wie gesagt, eine Instanz pro Klasse oder pro Objekt erlaubt deutlich mehr Optionen zur Ausgabe als mit einem Singleton sinnvoll machbar wäre.

Bezüglich Factory: Eine Factory erzeugt Objekte, richtig. Sie sind meist aber statisch und damit überall ohne Instanz verfügbar. Das ist ja das, was er will und somit letztlich auch eine Art Zugriffsmethode, um ein gültiges Log zu erhalten.

In Java sieht das z.B. üblich so aus:

private static final Log log = LogFactory.Create ( Foobar.class );
// oder auch: private final Log log = LogFactory.Create ( getClass().getName() );
...
log.debug ( "qwerz" );

Ausgabe:
10.02.2013 00:04 - Foobar (line 22) - BlubMethod(): qwertz
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (10.02.2013, 00:09)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

10.02.2013, 00:22

So eine Art Factory wie sie dir vorschwebt ist doch das Registry Pattern. Hab' nur leider gerade keine Möglichkeit nachzugucken, wie das in C++ aussehen würde.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

10.02.2013, 00:28

Hmm, nein, mit Registry Pattern hat das eigentlich nichts zu tun. Es wird ja nichts registriert und wieder abgerufen, es wird nur etwas erzeugt und das dann benutzt.
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]

Werbeanzeige