ein kleines spiel
-
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind. Mit std::bind, std::function und einer std::map die die function-pointer basierend auf game-events dispatched fährt man auf Dauer wesentlich besser, und deutlich flexibler sogar. Gerade in Text-Spielen habe ich diese Erfahrung gemacht.
Ich kenne kein Argument std::bind und std::function nicht zu verwenden (außer dieser ominöse VS2013 Compiler-Bug, dieser lässt sich mit einem Lambda aber umgehen).
std::placeholders ist ein legitimer gebrauch eines usings, das habe ich vergessen
Aber sonst nutze ich es nicht, und man sollte es auch nicht.Und nein SFML Game Development nutzt C++11 Techniken wie std::unique_ptr und std::bind.
Kommen jetzt noch mehr konstruierte Gegenargumente oder wars das?
-
SeriousITGuy schrieb:
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind. Mit std::bind, std::function und einer std::map die die function-pointer basierend auf game-events dispatched fährt man auf Dauer wesentlich besser, und deutlich flexibler sogar. Gerade in Text-Spielen habe ich diese Erfahrung gemacht.
Deine Erfahrung ist falsch. switch hat legitime Anwendungsfaelle, genauso wie Makros und goto.
SeriousITGuy schrieb:
Ich kenne kein Argument std::bind und std::function nicht zu verwenden (außer dieser ominöse VS2013 Compiler-Bug, dieser lässt sich mit einem Lambda aber umgehen).
Ich keine kein Argument, std::bind und std::function zu verwenden. Lambdas sind besser.
-
Na irgendwo müssen die Lambdas doch hin, da eignet sich oft eine std::function?
-
Aeh, frag mich nicht, wieso ich da std::function dazugeschrieben hab. std::function ist nett, std::bind nicht.
-
Kellerautomat schrieb:
Ich
keinekenne kein Argument, std::bind und std::function zu verwenden. Lambdas sind besser.Compiler der keine Lambdas kann?
-
Kellerautomat schrieb:
SeriousITGuy schrieb:
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind. Mit std::bind, std::function und einer std::map die die function-pointer basierend auf game-events dispatched fährt man auf Dauer wesentlich besser, und deutlich flexibler sogar. Gerade in Text-Spielen habe ich diese Erfahrung gemacht.
Deine Erfahrung ist falsch. switch hat legitime Anwendungsfaelle, genauso wie Makros und goto.
SeriousITGuy schrieb:
Ich kenne kein Argument std::bind und std::function nicht zu verwenden (außer dieser ominöse VS2013 Compiler-Bug, dieser lässt sich mit einem Lambda aber umgehen).
Ich keine kein Argument, std::bind und std::function zu verwenden. Lambdas sind besser.
Wow falsche Erfahrung, wusste gar nicht das es sowas gibt. Da lernt man jeden Tag noch was neues hier

Das switch legitime Anwendungsfälle hat, habe ich nicht bestritten. ABER im vorliegenden Beispiel (und in diesem Kontext habe ich es gemeint) des Themenerstellers sind switch-Anweisungen kontraproduktiv zur Code-Wartbarkeit und Erweiterbarkeit. Wenn du das nicht glauben willst schreibe mal einen Zork-like Command-Parser (Von mir aus vereinfacht auf <verb> <active object> <passive object>) mit nem switch, viel Spaß dabei.
Ein std::mapstd::string,std::function - Konstrukt ist hier deutlich eleganter und flexibler von der Code-Architektur her. Und ob man dabei std::bind oder Lambdas verwendet ist egal, das Ergebnis ist das Gleiche. Und warum sollen Lambdas dann bitte besser sein als std::bind?
Ich verwende täglich beides und habe (bis auf den VS2013 Compiler-Bug mit std::bind) noch nie Probleme damit gehabt. Der Code leidet unter keiner der beiden Varianten, im Gegenteil ich finde std::bind sogar leserlicher als Lambdas (subjektiv!).Eine weiterführende Erklärung warum std::bind schlechter als Lambdas für die Zwecke von Function Pointers sein soll wäre nett, dann lernen vielleicht ein paar was dazu.
-
hustbaer schrieb:
Kellerautomat schrieb:
Ich
keinekenne kein Argument, std::bind und std::function zu verwenden. Lambdas sind besser.Compiler der keine Lambdas kann?
Sowas gibts noch?

SeriousITGuy schrieb:
Das switch legitime Anwendungsfälle hat, habe ich nicht bestritten. ABER im vorliegenden Beispiel (und in diesem Kontext habe ich es gemeint) des Themenerstellers sind switch-Anweisungen kontraproduktiv zur Code-Wartbarkeit und Erweiterbarkeit.
SeriousITGuy schrieb:
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind.
Ja, war voll konkret und spezifisch fuer das Problem des TE gemeint!!!!!!111
Mal ganz ehrlich, ich hab noch nie jemanden gesehen, der es geschafft hat, mit so wenigen Forenposts so viel Bullshit zu verzapfen. Ich gratuliere dir zu dieser Kunst.

-
Mal ganz ehrlich, ich hab noch nie jemanden gesehen, der es geschafft hat, mit so wenigen Forenposts so viel Bullshit zu verzapfen.
Hey, den Rekord dafür halte ich!
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind.
Für
switch-Konstrukte kann der Compiler ggf. eine jump table erstellen. Oder (binäre) Intervallschachtelung anwenden. Also recht performant.
-
Wäre interessant ab wie vielen Cases ein Funktionszeiger schneller wird als
switch.
-
SeriousITGuy schrieb:
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind.
Dann lern halt programmieren.
SeriousITGuy schrieb:
Ich kenne kein Argument std::bind und std::function nicht zu verwenden (außer dieser ominöse VS2013 Compiler-Bug, dieser lässt sich mit einem Lambda aber umgehen).
Performance ist kein Argument?
SeriousITGuy schrieb:
Aber sonst nutze ich es nicht, und man sollte es auch nicht.
Wie du aus meinem Gegenbeispiel hättest entnehmen sollen ist Verallgemeinerung nicht gut.
SeriousITGuy schrieb:
Und nein SFML Game Development nutzt C++11 Techniken wie std::unique_ptr und std::bind.
Ups, das ist ein Buch und nicht ein Link zu SFML (das in C++03 geschrieben ist, was ich auch eig. meinte). Mein Fehler.
SeriousITGuy schrieb:
Kommen jetzt noch mehr konstruierte Gegenargumente oder wars das?
Soll das jetzt lustig sein?
Kellerautomat schrieb:
Mal ganz ehrlich, ich hab noch nie jemanden gesehen, der es geschafft hat, mit so wenigen Forenposts so viel Bullshit zu verzapfen. Ich gratuliere dir zu dieser Kunst.


-
Not so serious schrieb:
SeriousITGuy schrieb:
switch ist natürlich korrektes C++, aber in der Spiele-Programmierung sollte man von switch eher abstand nehmen, da es selbst in kleinen Projekten schnell zu Monster-Konstrukten kommt die nicht mehr wartbar sind.
Dann lern halt programmieren.
Er hat Recht. Schade, dass dir kein Gegenargument einfällt.
Not so serious schrieb:
Performance ist kein Argument?
Nicht bevor du mir zeigst, dass bind/function so viel langsamer ist, dass es zum problematischen Bottleneck im ganzen Spiel wird. Wenn du das schaffst, "dann lern halt programmieren"