Frage

Ich habe eine Klasse, die einen CallRate -Typ definiert. Ich muss die Möglichkeit hinzufügen, mehrere Instanzen meiner Klasse zu erstellen, indem ich die Daten aus einer Datei lese.

Ich habe meiner Klassen CallRate eine statische Methode hinzugefügt, die a zurückgibt List<CallRate>. Ist es für eine Klasse in Ordnung, neue Instanzen von sich selbst zu generieren, indem sie einen seiner eigenen Konstrukteure anrufen? Es funktioniert, ich frage mich nur, ob es das Richtige ist.

List<CallRates> cr = CallRates.ProcessCallsFile(file);
War es hilfreich?

Lösung

Es ist vollkommen in Ordnung, eigene Objekte aus der statischen Methode zu erhalten.

z.B

Eine der DOT -Net -Bibliotheken macht das Gleiche wie Sie,

XmlReadrer reader = XmlReader.Create(filepathString);

Andere Tipps

Sicher, das ist in Ordnung, in einigen Fällen sogar ermutigt. Es gibt einige Entwurfsmuster, die sich mit der Erstellung von Objekten befassen, und einige von ihnen tun genau das, was Sie beschreiben.

Ich verwende dieses Muster oft, wenn ich die Gültigkeit von Parametern überprüfen muss. Es ist stark entmutigt, eine Ausnahme von einem Konstruktor zu machen. Es ist nicht so schlimm von einer Fabrikmethode, oder Sie können sich entscheiden, NULL zurückzugeben.

Scheint mir gut. In anderen Sprachen würden Sie wahrscheinlich eine Funktion schreiben, aber in einer Sprache wie C#übernehmen statische Methoden diese Rolle.

Es ist okay. Was Sie gerade erstellt haben, ist so etwas wie eine einfache Fabrikmethode. Sie haben eine statische Methode, die eine gültige Instanz eines Typs erstellt. Eigentlich muss Ihre Methode nicht einmal statisch sein und Sie haben immer noch einen gültigen Code. Es gibt ein Designmuster (Prototyp), das ein neues gültiges Objekt aus einem vorhandenen Objekt erstellt. Siehe Details bei http://www.dofactory.com/patterns/patternPrototype.aspx.

Sicher, für einfache Parsen- (oder ähnliche) Szenarien - ich habe eigentlich vorziehen das Fabrikmethode Teil der Klasse sein. Ja - es bricht SRP, aber es erfüllt KUSS - Also nenne ich es einen Nettogewinn. Für größere Apps oder kompliziertere Parsen -Routinen ist es sinnvoller, wenn es sich um eine externe Fabrikklasse handelt.

Für Ihren speziellen Fall würde ich wahrscheinlich eine Methode bevorzugen, die eine Ienumerable aufgenommen hatu003Cstring> Anstelle eines Dateinamens - das würde Ihnen immer noch die Parsenlogik geben, aber einfache Einheiten -Tests und "Wiederverwendung" zulassen. Der Anrufer kann die Datei leicht genug in ein iEnumerable einwickeln.

Fabrikmethoden sind oft ein gutes Design. Wenn ich sie in C#schreibe, nenne ich sie "neu", so dass:

new MyClass()

wird

MyClass.New()

Trivial ist es so implementiert:

class MyClass
{
    public static MyClass New()
    {
        return new MyClass();
    }
}

Meistens mache ich dies, wenn es zusätzliche Bedingungen gibt, ob sie tatsächlich die Klasse erstellen oder einfach zurückkehren sollen null, oder ob Sie zurückkehren sollen MyClass oder etwas, das daraus abgeleitet ist.

Manchmal verwende ich öffentliche statische Methoden als Alternative zur Konstruktorüberlastung.

Vor allem in Situationen, in denen es nicht schön ist, sich allein auf Parametertypen zu verlassen, um anzugeben, welche Art von Objektkonstruktion beabsichtigt ist.

Ich bin ein Fan von statischen Methoden, die Instanzen zurückgeben, wie oben angedeutet, wie oben.

@Paul: Vergessen Sie nicht, den obigen Kommentar zu krempeln, den Sie finden, der die beste Antwort ist.

Ich mag es, "neue Instanzen von sich selbst zu generieren, indem sie einen seiner eigenen Konstrukteure anrufen".

Es stammt nicht vom Konstruktor, sondern aus der statischen Methode.

Ich benutze dies im Allgemeinen, wenn ich sofortige Implementierungen einer Klasse brauche. Zum Beispiel

    public class Car
    {
        public static Car RedExpensiveCar = new Car("Red", 250000);

        public Car()
        {

        }

        public Car(string color, int price)
        {
            Color = color;
            Price = price;
        }

        public string Color { get; set; }
        public int Price { get; set; }
    }

Und damit muss ich mich nicht an Konstruktorparameter in meinen Code erinnern oder schreiben.

Car car = Car.RedExpensiveCar;

Es ist vollkommen akzeptabel, dies zu tun. Wenn ich das tue, mache ich normalerweise die wirklichen Konstruktoren für die Klasse privat, so dass klar ist, dass die nur Die Möglichkeit, Instanzen zu konstruieren, erfolgt über die statische Methode.

Dies ist sehr nützlich in Fällen, in denen "Bau" möglicherweise nicht immer eine neue Instanz zurückgibt. Sie möchten beispielsweise stattdessen ein zuvor zwischengespeichertes Objekt zurückgeben.

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