Создание экземпляра класса, который содержит статический void Main () - PullRequest
6 голосов
/ 12 мая 2011

Я рассматриваю консольное приложение коллеги на C # и вижу этот фрагмент:

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.RealMain();
    }

    ... non-static RealMain function
}

Предположительно, он делает это, потому что хочет иметь поля уровня экземпляра и т. Д.

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

Ответы [ 8 ]

6 голосов
/ 12 мая 2011

Существует школа мысли, согласно которой функция main () объектно-ориентированного кода должна делать как можно меньше.Main () - это «уродливый» возврат к процессу процедурного кода, когда программы были написаны в одной функции, вызывая подпрограммы только по мере необходимости.В ООП весь код должен быть инкапсулирован в объекты, которые выполняют свою работу, когда ему сообщают.

Таким образом, делая это, вы уменьшаете LOC в точке входа main () до двух строк, а реальная логикаПрограмма структурирована и выполнена более оригинально.

6 голосов
/ 12 мая 2011

Это имеет смысл для меня.

В частности, вы можете добавить только достаточной логики в Main для анализа аргументов командной строки - возможно, с использованием обобщенного анализатора аргументов - и затем передать эти параметры в конструктор в сильно типизированный способ, подходящий для рассматриваемой программы.

Альбин спросил, почему это будет необходимо. Одним словом: тестируемость. В некоторых случаях вполне возможно хотя бы проверить некоторые аспекты программы верхнего уровня с помощью модульных тестов или, возможно, интеграционных тестов. Использование полей экземпляров вместо статических полей (и т. Д.) Улучшает тестируемость, так как вам не нужно беспокоиться о том, что предыдущие тесты запутывали состояние.

2 голосов
/ 12 мая 2011

если вы хотите получить non static functions, вы должны сделать это так.

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program(); // dependency of the class will be there.So not a good practice
        p.RealMain();// if you want initalize, you have to go like this or better you can do it in some other class.
    }

    void RealMain(){} 
}
2 голосов
/ 12 мая 2011

Никогда раньше не видел. Если вы хотите использовать этот шаблон, создайте отдельный класс Program2 с RealMain и создайте его экземпляр.

Зачем вам нужны поля уровня экземпляра? Разве статических полей недостаточно?

Может быть полезно, если вы внутренне хотите создать множество Program классов.

Я не вижу ничего особенно плохого в этом подходе, я просто не видел его раньше.

1 голос
/ 12 мая 2011

Общепринятой практикой является создание экземпляра отдельного класса, который может содержать все, что вам нужно. Вышеуказанный фрагмент выглядит как минимум странно:).

1 голос
/ 12 мая 2011

Точка входа в приложение всегда определяется как static void Main(...).
Вы можете решить написать свой код в Main () или использовать этот метод для запуска чего-то еще, расположенного в другом месте ... вам решать ...

0 голосов
/ 12 мая 2011

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

Visual Studio практически поощряет это - если вы запрашиваете новую консольную программу, она генерирует один файл с классом, содержащим только метод Main.

Если вы не делаете что-то сложное, для чего требуется более 1 класса, или что-то очень простое, вообще не требующее класса (то есть все методы и переменные статические) почему бы тебе не сделать это таким образом?

0 голосов
/ 12 мая 2011

Если бы это был какой-то другой класс, кроме «Программы», вопрос не возник бы.Этот дизайн дает вам возможность создать несколько экземпляров «Программы», возможно, в будущем, так почему бы и нет.Я здесь с Китом: как можно меньше в статической пустоте Main.

...