Pregunta

Tengo una clase que define un tipo de CallRate. Necesito agregar la capacidad de crear múltiples instancias de mi clase leyendo los datos de un archivo.

Agregué un método estático a mi clase CallRate que devuelve un List<CallRate>. ¿Está bien que una clase genere nuevas instancias de sí misma llamando a uno de sus propios constructores? Funciona, solo me pregunto si es lo correcto.

List<CallRates> cr = CallRates.ProcessCallsFile(file);
¿Fue útil?

Solución

Está perfectamente bien obtener sus propios objetos del método estático.

por ejemplo

Una de las bibliotecas de dot net hace lo mismo que usted,

XmlReadrer reader = XmlReader.Create(filepathString);

Otros consejos

Claro que está bien, incluso alentado en algunos casos. Hay varios patrones de diseño que se ocupan de la creación de objetos , y algunos de ellos simplemente lo que estás describiendo.

A menudo uso este patrón cuando necesito verificar la validez de los parámetros. Se desaconseja encarecidamente lanzar una excepción de un constructor. No es tan malo de un método de fábrica, o puede optar por devolver nulo.

Me parece bien. En otros idiomas, probablemente escribiría una función, pero en un lenguaje como C #, los métodos estáticos toman esa función.

Está bien. Lo que acaba de crear es algo así como un simple método de fábrica. Tiene un método estático que crea una instancia válida de un tipo. En realidad, su método ni siquiera tiene que ser estático y aún tiene un código válido. Hay un patrón de diseño (prototipo) que crea un nuevo objeto válido a partir de un objeto existente. Ver detalles en http://www.dofactory.com/Patterns/PatternPrototype.aspx .

Claro, para escenarios de análisis simple (o similar): en realidad prefiero el método de fábrica sea parte de la clase. Sí, se rompe SRP , pero cumple KISS , así que lo llamo una ganancia neta. Para aplicaciones más grandes o rutinas de análisis más complicadas, tiene más sentido que sea una clase de fábrica externa.

Para su caso particular, probablemente preferiría un método que incluyera IEnumerable < string > en lugar de un nombre de archivo, eso todavía le daría la lógica de análisis, pero permitiría pruebas unitarias fáciles y " reutilizar " ;. La persona que llama puede envolver el archivo en un IEnumerable con bastante facilidad.

Los métodos de fábrica suelen ser un buen diseño. Cuando los escribo en C #, los llamo 'Nuevo', de modo que:

new MyClass()

se convierte

MyClass.New()

Trivialmente se implementa de esta manera:

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

Principalmente hago esto cuando hay condiciones adicionales sobre si crear realmente la clase o simplemente devolver null, o si devolver MyClass o algo derivado de ella.

A veces uso métodos estáticos públicos como alternativa a la sobrecarga del constructor.

Especialmente en situaciones en las que no es bueno confiar solo en los tipos de parámetros para indicar qué tipo de construcción de objetos se pretende.

Soy fanático de que los métodos estáticos devuelvan instancias, como se sugirió muchas veces, más arriba.

@Paul: no olvides marcar el comentario anterior, que es la mejor respuesta.

Solo quiero señalar " genera nuevas instancias de sí mismo llamando a uno de sus propios constructores "

No es del constructor, es del método estático.

Generalmente uso esto cuando necesito implementaciones instantáneas de una clase. Por ejemplo

    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; }
    }

Y con esto, no necesito recordar ni escribir parámetros de constructor en mi código.

Car car = Car.RedExpensiveCar;

Es perfectamente aceptable hacer esto. Cuando lo hago, normalmente hago que los constructores reales de la clase sean privados para que quede claro que la forma única de construir instancias es a través del método estático.

Esto es muy útil en casos donde " construcción " Es posible que no siempre devuelva una nueva instancia. Por ejemplo, es posible que desee devolver un objeto previamente almacenado en caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top