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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

05.02.2010, 10:44

Das Projekt an sich ist eine nette Idee und gefällt mir auch. Und da du Kommentare zum Code haben wolltest... Hier mal was mir auf den ersten Blick aufgefallen ist:

o Dir scheint dir const correctness ziemlich egal zu sein. Solang du nur dich selbst damit belastest ist das natürlich dir überlassen (unschön ist es trotzdem).

o Ich erkenn irgendwie kein Prinzip wie du Parameter übergibst:

C-/C++-Quelltext

1
2
3
4
5
void SetPosX( const int iNewX )

bool Init( const std::string FilePath )

bool Init( std::vector<int> itemids


Das meiste widerspricht den allgemeinen Regeln die man als C++ Programmierer normal gelernt hat.

o Du kommentierst viel zu viel. Dokumentation ist wichtig aber nicht in diesem Maß und nicht auf diese Art!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/*
 * function:    Init
 * parameter:   string FilePath
 * returns:     true -> success
                false -> error
 * purpose:     initializes unit values with the 
                values of a given file
 */


Das ließe sich reduzieren auf:

C-/C++-Quelltext

1
2
3
4
5
/*
 * Init
 *
 * Initializes unit values with the values of a given file
 */


Dinge die offensichtlich sind werden nicht kommentiert, wieso auch? Kommentare machen den Code nicht übersichtlicher und unnötige Kommentare bringen überhaupt nichts.

o Oft verwendete Codefragmente wie dieser hier:

C-/C++-Quelltext

1
2
3
4
5
6
if( iValue < 0 )
        _iHitpointsCURRENT = 0;
    else if( iValue > _iHitpointsMAX )
        _iHitpointsCURRENT = _iHitpointsMAX;
    else
        _iHitpointsCURRENT = iValue;


sind prädestiniert um als Funktion ausgelagert zu werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename T>
inline T Clamp( const T& min, const T& max, const T& value )
{
  return value < min ? min : value > max ? max : value;
}

void Unit::SetHitpoints(const int iValue)
{
    _iHitpointsCURRENT = Clamp( 0, _iHitpointsMAX, iValue );
}

void Unit::SetMana(const int iValue)
{
    _iManaCURRENT = Clamp( 0, _iManaMAX, iValue );
}   // end SetHitpoints


o Hast du irgendwelche Konventionen bezüglich der Namensgebung von Variablen (und für deinen Code allgemein)? Ich erkenn kaum etwas.

o Viele Funktionen sind zu lang und unübersichtlich.

o Der Code ist alles andere als Fehlersicher (z.B. doppeltes initialisieren von Instanz)

o Bei vielen Klassen ist die Zuständigkeit nicht ersichtlich weil alles vermischt wird (Entitycontroller-Klassen etc.. ??)

o Du nutzt die WinAPI aber nicht konsequent, wieso? (z.B. system( "cls"))

o Dein "Design" wirkt eher pragmatisch/statisch als durchdacht.

12

05.02.2010, 11:44

Zitat von »"David_pb"«


o Dir scheint dir const correctness ziemlich egal zu sein. Solang du nur dich selbst damit belastest ist das natürlich dir überlassen (unschön ist es trotzdem).

verstehe nicht ganz, womit ich mich da belaste? parameter, deren wert ich in der funktion nicht ändere(ändern sollte) definiere ich eben als konstante parameter. sonst verwende ich const eh nur bei konstanten deklarationen.

Zitat von »"David_pb"«


o Ich erkenn irgendwie kein Prinzip wie du Parameter übergibst:

C-/C++-Quelltext

1
2
3
4
5
void SetPosX( const int iNewX )

bool Init( const std::string FilePath )

bool Init( std::vector<int> itemids


siehe oben. falls du aber die parameternamen meinst, dann muss ich dir recht geben. ich wechsle leider recht oft zwischen verschiednen schreibweisen. meistens, wenn ich nicht viel zeit habe, wird einfach alles klein geschrieben und sonst entsprechend ungarische notation.


Zitat von »"David_pb"«


Das meiste widerspricht den allgemeinen Regeln die man als C++ Programmierer normal gelernt hat.

da wir an der uni nur java lernen und ich c++ eigentlich nur von c++ für spieleprogrammierer kenne, bin ich dementsprechend kein guter c++ programmierer.
wäre nett, wenn du ausführst, was "das meiste" ist bzw. die allgemeinen regeln. das sagt mir nämlich nichts.


Zitat von »"David_pb"«


o Du kommentierst viel zu viel. Dokumentation ist wichtig aber nicht in diesem Maß und nicht auf diese Art!

Dinge die offensichtlich sind werden nicht kommentiert, wieso auch? Kommentare machen den Code nicht übersichtlicher und unnötige Kommentare bringen überhaupt nichts.

darüber lässt sich vermutlich streiten. ich mag einfach eine einheitliche kommentierung und die zieh ich eben durch. ich persönlich komme damit recht gut zurecht und finde immer schnell die dinge,die ich brauche.
dass diese art bei den derzeit meisten funktionen vl unnötig ist, mag sein, aber mit fortschreitendem verlauf des spiels nimmt auch die funktionalität zu und finde mein "kommentarschema" dafür recht angenehm.


Zitat von »"David_pb"«


o Oft verwendete Codefragmente wie dieser hier:

auch da hast du natürlich recht, aber diese klasse wurde noch nicht wirklich angerührt (lediglich das bewegen + item"verwalten") und deshalb sind da atm nur erste codevorschläge/versionen drin. ebenso habe ich diese form der abfrage nur einmal (eben genau an dieser stelle) gebraucht und deswegen hat sich die codeauslagerung noch nicht angeboten. falls ich das jedoch noch öfters brauchen werde, wird es natürlich ausgelagert.


Zitat von »"David_pb"«


o Hast du irgendwelche Konventionen bezüglich der Namensgebung von Variablen (und für deinen Code allgemein)? Ich erkenn kaum etwas.

siehe oben


Zitat von »"David_pb"«


o Viele Funktionen sind zu lang und unübersichtlich.

könntest du mir da beispiele geben?


Zitat von »"David_pb"«


o Der Code ist alles andere als Fehlersicher (z.B. doppeltes initialisieren von Instanz)

meinst du damit die listen in der gameklasse? die werde ich noch auf pointerlisten umändern und somit wird nur einmal eine instanz dynamisch erzeugt/gelöscht. atm hast du aber recht, da gibt es viele doppelinstanzen bis zum ende einer funktion. dessen bin ich mir bereits bewusst, aber da man es als benutzer nicht wirklich mitkrigt, habe ich das derzeit noch nicht behoben/geändert.


Zitat von »"David_pb"«


o Bei vielen Klassen ist die Zuständigkeit nicht ersichtlich weil alles vermischt wird (Entitycontroller-Klassen etc.. ??)

auch hier bitte wieder beispiele


Zitat von »"David_pb"«


o Du nutzt die WinAPI aber nicht konsequent, wieso? (z.B. system( "cls"))

wie gesagt, bin ich kein c++ guru und kenne eben nur von damals eben ein paar funktionen für die konsole, die das tun, was ich brauche. zum konsole clearen kenne ich eben nur system( "cls" ) und die tut das, was ich eigentlich will.


Zitat von »"David_pb"«


o Dein "Design" wirkt eher pragmatisch/statisch als durchdacht.

damit kann ich leider gar nichts anfangen. was meinst du damit genau?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

05.02.2010, 11:53

Zitat von »"Draculark"«

Zitat von »"David_pb"«


o Ich erkenn irgendwie kein Prinzip wie du Parameter übergibst:

C-/C++-Quelltext

1
2
3
4
5
void SetPosX( const int iNewX )

bool Init( const std::string FilePath )

bool Init( std::vector<int> itemids


siehe oben. falls du aber die parameternamen meinst, dann muss ich dir recht geben. ich wechsle leider recht oft zwischen verschiednen schreibweisen. meistens, wenn ich nicht viel zeit habe, wird einfach alles klein geschrieben und sonst entsprechend ungarische notation.

ich glaube david meinte dass man nicht-elementare datentypen als verweis(referenz) auf const übergeben sollte.

wenn du dein stil verbessern willst empfehle ich dir:http://www.amazon.de/Effektiv-programmie…_pr_product_top
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

05.02.2010, 12:03

Zitat von »"Draculark"«


verstehe nicht ganz, womit ich mich da belaste? parameter, deren wert ich in der funktion nicht ändere(ändern sollte) definiere ich eben als konstante parameter. sonst verwende ich const eh nur bei konstanten deklarationen.


Les dir mal einen Artikel zum Thema durch, da geht es um einiges mehr als ein const beim Parameter.

Noch ein Link: http://www.parashift.com/c++-faq-lite/const-correctness.html

Zitat von »"Draculark"«


siehe oben. falls du aber die parameternamen meinst, dann muss ich dir recht geben. ich wechsle leider recht oft zwischen verschiednen schreibweisen. meistens, wenn ich nicht viel zeit habe, wird einfach alles klein geschrieben und sonst entsprechend ungarische notation.


Zitat von »"Draculark"«


da wir an der uni nur java lernen und ich c++ eigentlich nur von c++ für spieleprogrammierer kenne, bin ich dementsprechend kein guter c++ programmierer.
wäre nett, wenn du ausführst, was "das meiste" ist bzw. die allgemeinen regeln. das sagt mir nämlich nichts.


Nein es geht mir eher darum, dass man komplexe Typen i.A. per konstanter Referenz übergibt um temporäre Kopien zu vermweiden. Und schon bekommst du wieder probleme mit der nicht konsequent durchgeführten "const correctness".
Wenn du in C++ entwickeln willst musst du zwangsläufig von vielen Javagewohnheiten weg kommen.

Zitat von »"Draculark"«


darüber lässt sich vermutlich streiten. ich mag einfach eine einheitliche kommentierung und die zieh ich eben durch. ich persönlich komme damit recht gut zurecht und finde immer schnell die dinge,die ich brauche.
dass diese art bei den derzeit meisten funktionen vl unnötig ist, mag sein, aber mit fortschreitendem verlauf des spiels nimmt auch die funktionalität zu und finde mein "kommentarschema" dafür recht angenehm.


Nein, darüber lässt sich nicht streiten. Überflüssige Kommentare haben nichts im Code verloren. Überflüssige Kommentare machen den Code sogar noch unübersichtlich.

Zitat von »"Draculark"«


auch da hast du natürlich recht, aber diese klasse wurde noch nicht wirklich angerührt (lediglich das bewegen + item"verwalten") und deshalb sind da atm nur erste codevorschläge/versionen drin. ebenso habe ich diese form der abfrage nur einmal (eben genau an dieser stelle) gebraucht und deswegen hat sich die codeauslagerung noch nicht angeboten. falls ich das jedoch noch öfters brauchen werde, wird es natürlich ausgelagert.


Du hast dieses Stück Code doch bereits 2x gebraucht!


Zitat von »"Draculark"«


siehe oben


Schade, das kommt der Übersicht und Verständlichkeit enorm entgegen wenn man sich da klare Richtlinien setzt.


Zitat von »"Draculark"«


könntest du mir da beispiele geben?


Viele deiner Init-Methoden z.B.

Zitat von »"Draculark"«


meinst du damit die listen in der gameklasse? die werde ich noch auf pointerlisten umändern und somit wird nur einmal eine instanz dynamisch erzeugt/gelöscht. atm hast du aber recht, da gibt es viele doppelinstanzen bis zum ende einer funktion. dessen bin ich mir bereits bewusst, aber da man es als benutzer nicht wirklich mitkrigt, habe ich das derzeit noch nicht behoben/geändert.


Ich meine Allgemein werden potentielle Fehlerfälle bei dir nicht behandelt. Zum Beispiel ist es z.T. möglich Objekte über Init mehrmals zu initialisieren ohne das alte Resourcen freigegeben werden.

Zitat von »"Draculark"«


auch hier bitte wieder beispiele


Im grund fast jede Klasse in deinem Programm. Du würfelst alles durcheinander (z.B. Hero: ProcessMoving, Paint, ...) man hat den Eindruck als hättest du dir keine Gedanken gemacht welche Instanzen für was Zuständig sind.

Zitat von »"Draculark"«


wie gesagt, bin ich kein c++ guru und kenne eben nur von damals eben ein paar funktionen für die konsole, die das tun, was ich brauche. zum konsole clearen kenne ich eben nur system( "cls" ) und die tut das, was ich eigentlich will.


Es geht hier ja nicht um C++. Es geht grundlegend ums Programmieren. Und speziell zu system( "cls" ) gibts bereits genug Diskussionen.

Zitat von »"Draculark"«


damit kann ich leider gar nichts anfangen. was meinst du damit genau?


In dem Fall solltest du mal die Lektüre deines Vertrauens konfrontieren und schauen was gutes Softwaredesign ausmacht! :)

15

05.02.2010, 12:24

@angesprochene fehler:
ich persönlich brauch diese fehlerabfragen vorerst einmal nicht, da ich ja selbst weiß, wo einheiten initialisiert werden z.b. und es somit zu solchen problemen nicht kommen kann.
dass die aber noch behandelt gehören (iwann mal) streite ich nicht ab.

@zufälliges zusammenwürfeln:
verstehe jetzt nicht, was da durchgewürfelt ist? um objekte darstellen zu können, brauchen sie eben eine paint funktion und die bewegung des helden finde ich auch schöner, wenn die in der heldenklasse behandelt wird und nicht iwo außerhalb. meine objekte sind genau für das zuständig, was im headerfile immer als purpose angegeben ist. sehe da wirklich kein durcheinander oO.

@softwaredesign:
finde ich jetzt auch nicht so schlecht. natürlich kann man immer übertrieben und alles megamäßig abkapseln um die 3-schichten persistenz zu wahren, aber das hier soll ein kleines spiel für mich selbst werden und kein verkaufsschlager. durch zuviel aufspalten mache ich mir persönlich die arbeit nur viel unangenehmer, da ich alleine über alles den überblick behalten muss und nicht mehrere mitarbeiter habe, die alle für ihren eigenen bereich zuständig sind.

finde da meine einfache struktur mehr als ausreichend:
framework -> zuständig für grafik/soundwiedergabe + eingabe
game -> spiellogik

alle anderen klassen sind immer für sich eigene "blöcke", die nicht wirklich auf dinge außerhalb zugreifen.

so ähnlich wird es auch in dem raumschiffshooter am ende des buches gemacht und da ich nur das als "vorlage" kenne, setze ich es halt derzeit auch so um.



wie würde denn dein design für so ein spiel aussehen? kannst mir da vl ein kleines klassendiagramm oder kurzbeschreibung geben? würde mich interessieren.

edit:
@const nochmal:
glaub habe das jetzt etwas mehr verstanden, was du da genau meinst.
am beispiel dialog.h
das wäre so dann sinnvoller/besser(?)

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
/*
 * author:  Simon Klausner
 * version: 0.1
 * purpose: contains methods to display npctexts,
            or other infos like herostats
 */

#ifndef DIALOG_H
#define DIALOG_H

#include <windows.h>
#include <iostream>

class Dialog
{
public:
    bool Init( HANDLE WhichWindow, int iBorderSizeX, int iBorderSizeY, int iTextSpeed );
    void ShowText( const std::string& stTalkerName, const std::string& stFilePath );
    void ShowTextLine( const std::string& stText );
    void PauseDialog();

private:
    void ClearDialog();
    void DisplayTalker( const std::string& stTalkerName );
    void DisplayTextLine( const std::string& stText, int iCoordX, int iCoordY );

    unsigned int _iDialogSizeX;
    unsigned int _iDialogSizeY;
    int _iCurrentLineY;
    int _iTextSpeed;
    RECT _border;
    HANDLE _window;
};

#endif

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

05.02.2010, 12:40

Zitat von »"Draculark"«

@angesprochene fehler:
ich persönlich brauch diese fehlerabfragen vorerst einmal nicht, da ich ja selbst weiß, wo einheiten initialisiert werden z.b. und es somit zu solchen problemen nicht kommen kann.
dass die aber noch behandelt gehören (iwann mal) streite ich nicht ab.


Naja, die Meinung ändert sich hoffentlich noch mit der Zeit und Erfahrung.

Zitat von »"Draculark"«


@zufälliges zusammenwürfeln:
verstehe jetzt nicht, was da durchgewürfelt ist? um objekte darstellen zu können, brauchen sie eben eine paint funktion und die bewegung des helden finde ich auch schöner, wenn die in der heldenklasse behandelt wird und nicht iwo außerhalb. meine objekte sind genau für das zuständig, was im headerfile immer als purpose angegeben ist. sehe da wirklich kein durcheinander oO.


http://de.wikipedia.org/wiki/Robustheitsanalyse

Zitat von »"Draculark"«


@softwaredesign:
finde ich jetzt auch nicht so schlecht. natürlich kann man immer übertrieben und alles megamäßig abkapseln um die 3-schichten persistenz zu wahren, aber das hier soll ein kleines spiel für mich selbst werden und kein verkaufsschlager. durch zuviel aufspalten mache ich mir persönlich die arbeit nur viel unangenehmer, da ich alleine über alles den überblick behalten muss und nicht mehrere mitarbeiter habe, die alle für ihren eigenen bereich zuständig sind.


Wenn du mit deinem Design zu frieden bist, wieso Fragst du dann nach Kommentaren von erfahreneren Leuten? :roll:

Zitat von »"Draculark"«


finde da meine einfache struktur mehr als ausreichend:
framework -> zuständig für grafik/soundwiedergabe + eingabe
game -> spiellogik

alle anderen klassen sind immer für sich eigene "blöcke", die nicht wirklich auf dinge außerhalb zugreifen.

so ähnlich wird es auch in dem raumschiffshooter am ende des buches gemacht und da ich nur das als "vorlage" kenne, setze ich es halt derzeit auch so um.


Es geht aber nicht um "es reicht aus für ..." sondern darum ob das Design etwas taugt oder nicht. Auf mich wirkt das "Design" pragmatisch und statisch, wenn dir das reicht ist ja alles gut. Aber nochmals, wieso fragst du dann nach Meinungen?

Zitat von »"Draculark"«


wie würde denn dein design für so ein spiel aussehen? kannst mir da vl ein kleines klassendiagramm oder kurzbeschreibung geben? würde mich interessieren.


Hätte ich zwei drei Tage Zeit würde ich mir das mal durch den Kopf gehen lassen.

17

05.02.2010, 13:39

Das ist ein schönes RPG-Projekt, das gute Chancen hat realisiert zu werden. :)

Zum Codestiel:

Wenn er nicht sehr sauber ist, hast du 4 Vorteile:

1) Man konzentriert sich auf das, was das Programm können soll und nicht auf das wie (d.h. man erhält bessere Programme) ;)
2) Man lernt fremde Quelltexte besser zu lesen, da man Informationen variabler verarbeiten kann, wenn man selbst verschiedene Lösungen verwendet.
3) Es fördert komplexes Denken.
4) Ideale theoretische Lösungen sind oft sehr komplex und werden oft in Lehrbüchern(wie z.B. in der Mathematik) oft ungenauer formuliert, damit der Lernstoff klein bleibt (Effizienz). Es gibt auch nicht-Klartext-Standards und die haben ihre Existenzberechtigung.

Für einen Buchhalter oder Briefmarkensammler ist dies natürlich der reinste Horror ;) 8)

Außerdem muss man sein begrenztes Wissen auch anwenden und kann nicht erwarten, dass man schon alle Kniffe einer Sprache beherrscht. Keep it simple stupid - KISS-principle!

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

18

05.02.2010, 14:10

1. saubere programme sind wesentlich leichter zu erweitern und weniger fehleranfällig. (d.h. man erhält bessere programme)
2. bei sauberen code gibt es auch viele verschiedene lösungen. ich glaub nicht das es ein vorteil ist.
3. besonders das planen von sauberen programmen ist sehr komplex.
4. natürlich sind das alles nur vorgaben. es ist abhängig von der situation in der man ist. da C++ so komplex ist gibt es wesentlich mehr situationen als in anderen sprachen. man sollte lernen wann man wie vor gehen muss um schnellen, kompakten, fehlerfreien, lesbaren und erweiterbaren code erstellen zu können.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

05.02.2010, 14:24

Zitat von »"User_User"«


Für einen Buchhalter oder Briefmarkensammler ist dies natürlich der reinste Horror ;) 8)


Schlechter Code (mal ganz abgesehen von der Diskussion hier) ist in erster Linie für den Programmierer der reinste Horror. Das hat nichts mit Buchhalter oder Briefmarkensammler zu tun, sondern damit ob du einen Job in der Branche bekommst oder nicht... :roll:

20

05.02.2010, 14:28

Zitat

Wenn du mit deinem Design zu frieden bist, wieso Fragst du dann nach Kommentaren von erfahreneren Leuten? Rolling Eyes


was spricht dagen sich anmerkungen und verbesserungsvorschläge zu holen?
nur hilft es mir halt nicht viel, wenn es heißt "dein design ist zu statisch" oder "deine klassen sind zu überfüllt". hätte da halt gern beispiele, wie mans besser machen kann.
denn es ist ja logisch, dass ich dinge so realisiert habe, wie sie sind, weil ich es eben nur so kenne. und ohne beispiele, wie man es anders lösen könnte, kann ichs halt schwer umändern.

Werbeanzeige