Frage

Ich habe zwei Klassen. SpeciesReader nimmt Dateien und analysiert sie. Species speichert bestimmte Daten über eine Spezies, die aus der Datei analysiert wurden.

Zur Zeit habe ich eine Methode: SpeciesReader.generateSpecies(), die die Datei verwendet, mit denen sie instanziiert wurde ein Species Objekt zu erstellen. Ist das schlechte Praxis / Design? Soll ich irgendwie einen Weg finden, dies zu einem Konstruktor in Species zu bewegen, die die Dateinamen als Argument?

War es hilfreich?

Lösung

nicht. Das ist ein gemeinsames Muster einer Fabrik genannt.

aber sagte, dass Fabriken sind in der Regel auf der Klasse selbst implementiert (Tierart in diesem Fall), anstatt eine separate Klasse, aber ich sehe kein Problem mit ihm so zu trennen.

Als ob diese Verantwortung auf Species statt gehen soll, hängt das von der Art der Dateien. Wenn eine Datei enthält nur eine Art und es gibt keine großen Overhead beim Laden, die dann könnte es Datei sinnvoll, es ist Teil der Arten zu machen.

Aber wenn die Datei enthält viele Arten oder teuer zu initialisieren dann es Sinn macht, dass die Verantwortung in einer anderen Klasse zu bewegen und haben sie für die Erstellung von Arten Objekten verantwortlich.

Andere Tipps

Es gibt ein paar Muster, die Sie verwenden können:

Die Wahl, welche Muster auf Anwendungsfall wäre zu implementieren abhängen, aber Cletus ist richtig, Fabrik scheint eine gute Wahl.

public class SpeciesFactory
{
    private final static SpeciesFactory INSTANCE = new SpeciesFactory();

    private SpeciesFactory() { }

    public static SpeciesFactory getFactory() 
    {
        return INSTANCE;
    }


    public Species getSpecies(String filename)
    {
        Species species = null;
        //do business logic
        return species;
    }

}

Sie würden es verwenden, durch den Aufruf Species carnivore = SpeciesFactory.getFactory () getSpecies ( "carnivore.txt");.

Was Sie haben, ist ein Beispiel für die Factory Method Pattern . Diese Erzeugungsmuster in einigen Fällen auch verwendet werden können. Meine persönliche Präferenz ist jedoch zu versuchen, und es Nutzung nur, dass einer besser lesbaren Ersatz für eine Ctor zu beschränken und nicht in ihm etwas zu komplex machen. Dies ist Prüfung aller Klassen zu vereinfachen, die auf dieser Fabrik ab.

Für etwas mit einer komplexen Konstruktion würde ich Abstract Factory verwenden. Auf diese Weise I-Komponenten mit einer Abhängigkeit testen auf dem Werk ohne eine Reihe von Dateien zu erstellen und alle anderen Abhängigkeiten der Fabrik hat.

Vor Sie bitten um eine Singleton vs statische Methode in der Fabrik. Meine Meinung dazu ist: Eine statische Methode für lesbare ctors gut ist, ein Singleton gut jemand reizt mit einer Vorliebe für Komponententests .

Es ist eine gute Idee, das Parsen einer Datei aus der Implementierung von Objekten aus dieser Datei analysiert zu trennen. Dies wird als „Separation of Concerns“ bekannt. Die Umsetzung der Arten nicht wissen sollte, oder egal, wie es in persistenten Speicher dargestellt wird (in OO-Design-Jargon, sollte es sein „Persistenz Agnostiker“), oder wenn die Parameter an den Konstruktor übergeben kommen. Es sollte nur interessieren, wie mit anderen Objekten in dem System interagiert, sobald es erstellt wurde, jedoch, dass die Schöpfung stattfindet. Die Sorge, wie Arten in persistenten Speichern dargestellt werden, sollte an anderer Stelle implementiert werden, in Ihrem Fall in dem SpeciesReader.

Es ist oft bessere Idee zu trennen Objekt aus dem Weg, es beibehalten wird. Stellen Sie sich vor, wenn es viele Möglichkeiten gibt, zu laden Art - aus Binärdatei, aus XML-Datei, von Datenbank-Datensatz, aus dem Netzwerk-Buchse, usw. - schlecht Species will nicht über jeden Teil des Programms kennen <. / p>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top