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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

81

07.05.2015, 23:36

Mir gefällt Variante 2 am besten. So wird es übrigens auch bei C# gelöst.
„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.“

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

82

08.05.2015, 08:27

Jap, Variante 2 gefällt mir auch am besten.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

83

08.05.2015, 10:10

So wird es übrigens auch bei C# gelöst.

Und wieder einmal ist mir C# zuvor gekommen ^^
Gut, dann mache ich es auch so :-)

Noctarius

Treue Seele

Beiträge: 120

Wohnort: Düsseldorf

Beruf: Manager of Developer Relations at Hazelcast, Inc. & Consultant for Scaleable Gameserver Systems

  • Private Nachricht senden

84

08.05.2015, 18:05

Wieso kein switch-case? :)


switch(foo.type) {
case Foo: ...
case Bar: ...
}

idontknow

unregistriert

85

08.05.2015, 18:28

Weil z.b. switch-case eigenzlich ziemlich eklig ist und in der Regel durch deutlich sinnvollere Pattern ersetzt werden kann? Außerdem ist switch-case schlecht erweiterbar und widerspricht dem einen oder anderen Software-Design Paradigma. Hat natürlich trotzdem seine Berechtigung, aber sollte jetzt sicher nicht für etwas was mit hoher Wahrscheinlichkeit geändert / erweitert wird eingesetzt werden.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

86

08.05.2015, 18:58

Das switch-case so böse ist ist mir jetzt noch nicht so klar. Natürlich sind große switch-case Blöcke immer ein Anzeichen dafür dass man etwas mehr Zeit ins Design stecken könnte aber warum ist das deiner Meinung nach so sehr problematisch und wenig erweiterbar? Ich selbst brauche es recht selten und vielleicht ist genau das mein Problem. Aber wenn du da mehr Informationen zu hättest wäre ich interessiert.
„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.“

idontknow

unregistriert

87

08.05.2015, 21:32

Naja sobald du z.b. einen Typen hinzufügst kannst du sämtliche switch-cases über den Typ überarbeiten. Gegenbeispiel für ne bessere Lösung zumindest im SInne der erweiterbarkeit wäre halt ne virtuelle Funktion. Wie böse das tatsächlich ist ist dann aber doch Ansichtssache, wie bei den meisten Diskussionen was jetzt gut oder schlecht ist. Generell ist über sämtlichen bestehenden Code gehen bzw sämtliche vorkommen eines KOnstrukts anzupassen ja immer ne sehr unschöne Sache und switch ist eben ein KOnstrukt was genau den Fall provozieren kann.

In unserer Softwaretechnik Vorlesung wurde es zumindest auch genau so gelehrt ohne jetzt zu sagen, dass es deswegen stimmt.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

88

08.05.2015, 21:54

Meinen Compiler baue ich größten Teils mit dem Visitor Pattern, weil wir das in den Compiler Vorlesungen so gelernt haben, und es recht einfach ist.
Das Listener Pattern soll wohl noch etwas besser sein, aber das Visitor tut's hier einfach :-)
Mit einer großen Switch Anweisung für jeden AST Knoten wäre das in der Tat sehr hässlich.

Der Kern meiner Virtuellen Maschine hingegen besteht im Grunde aus nur einem sehr großen switch-case (eben für jede Instruktion),
aber das ist auch absichtlich low-level und deshalb auch in C geschrieben, da ist das ok.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

89

08.05.2015, 23:42

Die "is" Expression lies sich relativ schnell runter hacken :-)

Das Parsen und die Code-Generierung für Expressions funktioniert schon sehr gut.
Folgendes Programm kompiliert und hat die korrekte Ausgabe (stürtzt nur leider noch ab, weil das reference-counting noch nicht fertig ist ^^):

C#-Quelltext

1
2
3
4
// Gibt den String in "writeLine" aus:
if { 1, 2 }.toString() is String {
    Console.writeLine("'{ ... }.toString()' is a String")
}

Selbst abstruse Verschachtelungen von Ausdrücken kann der Compiler übersetzen :thumbsup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

90

09.05.2015, 10:22

@switch
Jetzt weiß ich worauf du hinaus wolltest. An sich hast du schon recht und man kann es oft schöner lösen. Visitor wurde ja genannt, State kann auch hilfreich sein. Switch Case ist aber eine schön schnelle Angelegenheit und behält da in manchen Fällen sicher seine Berechtigung.

@LukasBanana
kannst du grob abschätzen wie viel Arbeitszeit in deiner Sprache steckt? Mir ist schon klar dass du keine Arbeitsstunden zählst aber vielleicht kannst du ja mal grob schätzen.
„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.“

Werbeanzeige