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

21

05.02.2017, 13:27

Doppelpost... keine Ahnung wie das passiert ist...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

05.02.2017, 13:46

Das stimmt doch einfach nicht.
OK, dann habe ich wohl in meinem Code Dinge, die scheinbar "einfach nicht stimmen", aber trotzdem genau so funktionieren...
In deinem Beispiel sehe ich übrigens nicht, wieso bei instanceof nicht alle anderen bei Erweiterung geändert werden müssen. Das sagst du zwar, widerspricht aber meiner Logik und meiner Erfahrung. Ich kenne das nur so, dass man dann in *jede* dieser Klassen anfängt den neuen Typ mit instanceof zu prüfen. Instanceof führt daher nach meiner Erfahrung dazu, dass man überall verstreut im Code die wildesten Type-Checks macht, strukturlos und völlig vernetzt.
Da brauchst du mich auch nicht versuchen über den Weg der Bücher, die ich lese, zu beleidigen. Das sind Erfahrungswerte. Aber ich bin das Thema Leid. Macht euren Scheiß, wie ihr das wollt und für klug haltet, ich habe die Nase voll mich zu wiederholen und dann auch noch beleidigen lassen zu müssen. Ich war hier um zu helfen und sinnvolle Anregungen zu geben, nicht um mir hier irgendwelche Sprüche anzuhören. Schönen Tag noch.
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« (05.02.2017, 13:53)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

23

05.02.2017, 13:51

Ich war & bin bisher noch der Ansicht, dass der Einsatz von instanceof nur zeigt, dass meine Architektur schrott ist. Es gibt eigentlich immer eine bessere Lösung. Dynamich-Cast/Up-Casts - die mit dem Einsatz von instanceof einhergehen - sind immer schlecht/teuer. In manchen Compilern hab' ich eine Art Kompromiss gesehen, so in etwa ein Polymorphes-instanceof/cast:

Quellcode

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
interface CreatureInterface
{
    public function fulfills(ConditionInterface $condition): bool;
    public function asHuman(): Human;
    public function asAnimal(): Animal;
}

abstract class AbstractCreature implements CreatureInterface
{
    public function asHuman(): Human
    {
        throw new Exception('Das ist kein Mensch');
    }

    public function asAnimal(): Animal
    {
        throw new Exception('Das ist kein Tier');
    }
}

final class Human extends AbstractCreature
{
    public function fulfills(ConditionInterface $condition): bool
    {
        return $condition->fulfills($this);
    }

    public function asHuman(): Human
    {
        return $this;
    }
}
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

24

05.02.2017, 13:52

Aber ich bin das Thema Leid. Macht euren Scheiß, wie ihr das wollt und für klug haltet, ich habe die Nase voll mich zu wiederholen und dann auch noch beleidigen lassen zu müssen. Ich war hier um zu helfen und sinnvolle Anregungen zu geben, nicht um mir hier irgendwelche Sprüche anzuhören. Schönen Tag noch.

Ich hab dich nicht beleidigt. Ich war & bin nur zu blöd, einen Mediator auf mein Problem zu münzen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

25

05.02.2017, 13:53

Sorry, Du hast recht, das war doof. Ich wollte nur etwas intensiver nachhaken, weil ich wirklich mit der "Essenz meines gesamten Seins" nicht nachvollziehen kann, wieso die Variante mit Mediator flexibler ist oder zu weniger Fehlern führt als die Variante mit instanceof...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

26

05.02.2017, 13:54

Ich bezog mich da auf Chromanoid. Aber wie gesagt, ich bin raus. Hab' nur gerade deine Antwort durch meinen Edit noch gesehen.
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]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

27

05.02.2017, 13:56

Ich bezog mich da auf Chromanoid. Aber wie gesagt, ich bin raus. Hab' nur gerade deine Antwort durch meinen Edit noch gesehen.

Schade, hätte mich interessiert, wie der Mediator in meinem Fall funktioniert hätte. Trotzdem danke.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

28

05.02.2017, 14:01

Ich war & bin bisher noch der Ansicht, dass der Einsatz von instanceof nur zeigt, dass meine Architektur schrott ist. Es gibt eigentlich immer eine bessere Lösung. Dynamich-Cast/Up-Casts - die mit dem Einsatz von instanceof einhergehen - sind immer schlecht/teuer. In manchen Compilern hab' ich eine Art Kompromiss gesehen, so in etwa ein Polymorphes-instanceof/cast:

Quellcode

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
interface CreatureInterface
{
    public function fulfills(ConditionInterface $condition): bool;
    public function asHuman(): Human;
    public function asAnimal(): Animal;
}

abstract class AbstractCreature implements CreatureInterface
{
    public function asHuman(): Human
    {
        throw new Exception('Das ist kein Mensch');
    }

    public function asAnimal(): Animal
    {
        throw new Exception('Das ist kein Tier');
    }
}

final class Human extends AbstractCreature
{
    public function fulfills(ConditionInterface $condition): bool
    {
        return $condition->fulfills($this);
    }

    public function asHuman(): Human
    {
        return $this;
    }
}

Die Variante ist doch genauso problematisch:
1. Du musst tierisch aufpassen, dass Du nicht die falschen Viecher in eine Condition packst, die eigentlich ein anderes Viech erwartet.
2. Du musst bei einer neuen Viech-Sorte die API anpassen, AbstractCreature anpassen und alle Viech-Klassen anpassen, die nicht von AbstractCreature erben.

instanceof mag bei Sprachen wie C++ verschrien sein, weil das da eben nicht gratis kommt. Bei dynamischen Sprachen wie PHP oder Java ist das doch gratis, kostet auch nicht viel. Warum sollte man das dann nicht nutzen? Durch die Sprache werden andere Architekturstile ermöglicht. Die sind nur weil man sie nicht so schön in C++ abbilden kann deswegen nicht schlechter. Dynamische Sprachen profitieren sehr von Runtime-Type-Informationen und Reflection. Dadurch wird für viele Bibliotheken erst richtig der nutzen "freigeschaltet". In C kann man doch auch nicht richtig OOP programmieren, das heißt doch noch lange nicht, dass die Mittel der OOP schlecht sind.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (05.02.2017, 14:07)


29

05.02.2017, 14:03

Ich kenne das nur so, dass man dann in *jede* dieser Klassen anfängt den neuen Typ mit instanceof zu prüfen. Instanceof führt daher nach meiner Erfahrung dazu, dass man überall verstreut im Code die wildesten Type-Checks macht, strukturlos und völlig vernetzt.
Würde man die einzelnen Creature-Subtypen in eigenen Modulen oder Packages führen, würde man das natürlich verbieten. Die Klassen in Fish dürfen dann einfach nicht von Human wissen. Das kann man durch Unittests oder durch Modulabhängigkeiten bzw. deren Verbot wunderbar abbilden.

Nur Conditions in Modulen, die mehrere Creature-Typen betreffen, dürften dann auch diese Module einbinden. So kann man alle Abhängigkeiten zwischen den Creatures klar definieren und steuern.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

30

05.02.2017, 14:25


Die Variante ist doch genauso problematisch:
1. Du musst tierisch aufpassen, dass Du nicht die falschen Viecher in eine Condition packst, die eigentlich ein anderes Viech erwartet.
2. Du musst bei einer neuen Viech-Sorte die API anpassen, AbstractCreature anpassen und alle Viech-Klassen anpassen, die nicht von AbstractCreature erben.

instanceof mag bei Sprachen wie C++ verschrien sein, weil das da eben nicht gratis kommt. Bei dynamischen Sprachen wie PHP oder Java ist das doch gratis, kostet auch nicht viel. Warum sollte man das dann nicht nutzen? Durch die Sprache werden andere Architekturstile ermöglicht. Die sind nur weil man sie nicht so schön in C++ abbilden kann deswegen nicht schlechter. Dynamische Sprachen profitieren sehr von Runtime-Type-Informationen und Reflection. Dadurch wird für viele Bibliotheken erst richtig der nutzen "freigeschaltet". In C kann man doch auch nicht richtig OOP programmieren, das heißt doch noch lange nicht, dass die Mittel der OOP schlecht sind.

instanceof wird halt sooft, soviel und sehr schnell miss-used. Hab' ich schon zuoft in unseren Code gesehen. Deswegen fällts mir so schwer, mich daran zu gewöhnen oder anderen die Möglichkeit zu geben, das eig. sinnvolle Konstrukte andersweitig zu benutzen.

Eine Variante gibt es allerdings noch (PHP sei Dank), denn man könnte Lambdas benutzen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
interface ConditionInterface
{
    public function fulfills(callable $callback): bool;
}

final class Human implements CreatureInterface
{
    public function fulfills(callable $callback): bool
    {
        return $callback($this);
    }
}


Und in den jeweiligen Conditions entweder:

Quellcode

1
2
3
$creature->fulfills(function (Human $human): bool {
    ...
});


oder

Quellcode

1
2
3
$creature->fulfills(function (Animal $animal): bool {
    ...
});


Das fiel mir jetzt noch ein. Das wäre glaub' ich der flexibelste Weg. Passt der Typ nicht, wird PHP schon einen Error generieren.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (05.02.2017, 14:31)


Werbeanzeige