Sie benötigen ein Entwurfsmuster Aufzählungen und switch-Anweisung in der Objekterstellung zu entfernen

StackOverflow https://stackoverflow.com/questions/3897221

Frage

Lassen Sie uns sagen, ich bin ein Sportspiel zu schaffen, und in diesem Spiel gibt es verschiedene Positionen ein Spieler spielen können, Angriff, Verteidigung, usw. Also habe ich durch die Schaffung einer Basisklasse starten:

public abstract class Position
{
 public abstract string Name
 {
  get;
 }
}

und die Unterklassen ...

public class Defender : Position
{
 public override string Name
 {
  get { return "Defender"; }
 }
}

und so weiter. Das ist alles in Ordnung.

Aber jetzt brauche ich eine Funktion, diese Objekte zu erstellen. Ich brauche eine von Stellungs-Funktion erstellen. So Eine mögliche Lösung ist es, eine ENUM aller Positionen zu erzeugen und diesen Wert an eine Funktion, die auf dem ENUM-schaltet und liefert das entsprechende Objekt. Aber das löst meinen Code Geruch Alarm. Diese soultion miteinander verbindet die Klassen, die Enum und der Schalter in einer Funktion:

public static Position GetByType(Types position)
{
 switch(position)
 {
  case Types.Defender:
   return new Defender();
... and further terrible code

Was Lösung soll ich suchen? Welches Design-Muster ist das?

War es hilfreich?

Lösung

Wenn Sie diese auf einem kleinen Maßstab zu tun haben, der Schalter ist nicht wirklich schlecht, vor allem, wenn es an einem Ort lebt.

Wenn Sie dies auf einem mittleren Maßstab zu tun haben, möchten Sie vielleicht die Interna ein wenig Verbesserung betrachten - Steve Ellinger Vorschlag ist ein vernünftig. Persönlich bevorzuge ich eine IDictionary<MyEnum, Action<T>> verwenden, wo die Aktion eine neue Instanz der betreffenden Klasse zurückgibt.

Wenn Sie dies im großen oder konfigurierbaren Skala zu tun haben, sollten Sie vielleicht einen IoC-Controller überprüfen, wie StructureMap oder ninject oder was auch immer kühlen Kinder mit diesen Tagen spielen.

Andere Tipps

Sounds wie das Factory-Muster .

Allerdings kann es keine schlechte Sache sein, ein Schaltergehäuse zu haben, die Schalter auf einer Enumeration / string die richtige Art von Objekt zurückgeben .... solange es ist isoliert in einem Ort .

Ja, was Sie wollen, ist eine abstrakte Fabrik. Die Leichtigkeit der Fabrik Umsetzung hängt von der Sprache, die Sie verwenden. PHP ermöglicht variable Klassennamen, zum Beispiel, so dass Sie nur in den Klassennamen schicken können und neue $ classname zurück. Andere Sprachen dies nicht zulassen, jedoch. In der Tat, wenn Sie die Sprache dies nicht tun, haben Sie bereits eine Fabrik-Klasse erstellt!

Es gibt nicht wirklich etwas elegantere Sie tun können, es sei denn, Sie Reflektion verwenden möchten, zu simulieren, was php der Fall ist.

Ein Weg, mit dem Schalter zu beschäftigen ist die Fabrik hat eine Reihe von Typen deklariert und verwenden Sie dann die Aufzählung als Index in das Array wie folgt:

public abstract class Position {
    public abstract string Name {
        get;
    }
}
public class Defender : Position {
    public override string Name {
        get { return "Defender"; }
    }
}
public class Attacker : Position {
    public override string Name {
        get { return "Attacker"; }
    }
}
public static class PositionFactory {
    public enum Types {
        Defender, Attacker
    }
    private static Type[] sTypes = new Type[] { typeof(Defender), typeof(Attacker)};
    public static Position GetByType(Types positionType) {
        return Activator.CreateInstance(sTypes[(Int32)positionType]) as Position;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top