Должен ли класс c # генерировать экземпляры самого себя? - PullRequest
13 голосов
/ 02 ноября 2008

У меня есть класс, который определяет тип CallRate. Мне нужно добавить возможность создавать несколько экземпляров моего класса, читая данные из файла.

Я добавил статический метод в свой класс CallRate, который возвращает List<CallRate>. Можно ли классу генерировать новые экземпляры самого себя, вызывая один из своих собственных конструкторов? Это работает, мне просто интересно, правильно ли это делать.

List<CallRates> cr = CallRates.ProcessCallsFile(file);

Ответы [ 12 ]

20 голосов
/ 02 ноября 2008

Прекрасно получить собственный объект (ы) из статического метода.

, например

Одна из библиотек dot net делает то же самое, что и вы,

XmlReadrer reader = XmlReader.Create(filepathString);
5 голосов
/ 02 ноября 2008

Конечно, это хорошо, в некоторых случаях даже поощряется. Есть несколько шаблонов проектирования, которые имеют дело с созданием объекта , и некоторые из них делают именно то, что вы описываете.

3 голосов
/ 02 ноября 2008

Я часто использую этот шаблон, когда мне нужно проверить правильность параметров. Настоятельно не рекомендуется создавать исключение из конструктора. Это не так уж плохо с фабричным методом, или вы можете вернуть null.

2 голосов
/ 02 ноября 2008

Кажется, хорошо для меня. В других языках вы, вероятно, написали бы функцию, но в языке, таком как C #, статические методы играют эту роль.

1 голос
/ 02 ноября 2008

Я обычно использую это, когда мне нужны мгновенные реализации класса. Например

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

И с этим мне не нужно запоминать или записывать параметры конструктора в моем коде.

Car car = Car.RedExpensiveCar;
1 голос
/ 02 ноября 2008

Просто хотел бы отметить, «генерировать новые экземпляры самого себя, вызывая один из своих собственных конструкторов»

Это не из конструктора, а из статического метода.

1 голос
/ 02 ноября 2008

Я фанат того, чтобы статические методы возвращали экземпляры, как много раз предлагалось выше.

@ Пол: не забудьте поставить галочку над комментарием, который вы считаете лучшим ответом.

1 голос
/ 02 ноября 2008

Иногда я использую открытые статические методы в качестве альтернативы перегрузке конструктора.

Особенно в ситуациях, когда нехорошо полагаться только на типы параметров, чтобы указать, какой тип конструкции объекта предназначен.

1 голос
/ 02 ноября 2008

Заводские методы часто бывают хорошими. Когда я пишу их на C #, я называю их «New», так что:

new MyClass()

становится

MyClass.New()

Тривиально это реализовано так:

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

В основном, я делаю это, когда есть дополнительные условия о том, действительно ли создать класс или просто вернуть null, или вернуть MyClass или что-то производное от него.

1 голос
/ 02 ноября 2008

Конечно, для простых синтаксических (или подобных) сценариев - я на самом деле предпочитаю фабричный метод быть частью класса. Да - он ломается SRP , но он удовлетворяет KISS - поэтому я называю это чистым выигрышем. Для более крупных приложений или более сложных процедур синтаксического анализа - имеет смысл иметь внешний фабричный класс.

В вашем конкретном случае я бы, вероятно, предпочел бы метод, который принимает IEnumerable вместо имени файла, - который все равно даст вам логику синтаксического анализа, но позволит легко выполнять модульные тесты и "повторно использовать". Вызывающий может достаточно легко обернуть файл в IEnumerable.

...