Hay una buena razón para escribir código en el Programa.cs / main en lugar de usar clases? [cerrado]


Estoy trabajando en una aplicación bastante grande y mi líder técnico y yo no estamos de acuerdo en ciertas cosas.

Uno de ellos se refiere a las aplicaciones de consola. Estas aplicaciones están siendo portadas a C# desde scripts de shell. Algunos de estos scripts son razonablemente grandes (300-400 líneas de código después de la conversión) y hacen cosas como E/S, correo electrónico y acceso a la base de datos.

Para cada uno de estos scripts he creado una clase. Cada clase tiene un método Run que llama a cualquier método / operación que están dentro. Programa Interno.cs / main, creo un objeto de dicha clase y llamo a Run. Programa.cs contiene 4-5 líneas de código. Limpio y sencillo.

Mi líder técnico quiere deshacerse de las clases de script y simplemente tener todo dentro del método principal del programa.cs. Su razonamiento es que es demasiado confuso como es.

Se siente incómodo tener que hacerlo de esta manera ya que la clase ya no se vuelve reutilizable/capaz de paquetes en una biblioteca de clases sin tener que jugar con el método principal.

Las pruebas unitarias parecen no verse afectadas ya que puede crear una instancia del programa.cs en sí, pero de nuevo....esto se siente torpe. ¿Hay algún beneficio en hacerlo a su manera que yo no estoy viendo? ¿Hay algún beneficio a mi manera? ¿Existe una práctica general cuando se trata de grandes aplicaciones y contenido en su método principal?

Gracias por su tiempo.

 26
Author: JohnnySaxx, 2012-10-16

8 answers

Se siente incómodo tener que hacerlo de esta manera ya que la clase ya no se vuelve reutilizable/capaz de paquetes en una biblioteca de clases sin tener que jugar con el método principal.

No tiene que ser así.

Por ejemplo, cada uno de sus scripts todavía podría tener la misma estructura que tiene, pero también tiene un método private static void Main(string[] args). (Podría ser no privado si lo desea, todo depende de sus necesidades.)

De esa manera es independiente (puede ser compilado como una sola entrada a una sola salida y luego ejecutado) que ocasionalmente puede ser útil, pero podría también ser utilizado como parte de una biblioteca de clases. La presencia de un método Main de ninguna manera impide que la clase se utilice desde otras clases, después de todo.

No está claro si tienes uno Program.cs archivo o uno por script. Si tienes uno por script, cada uno de los cuales es solo 4-5 líneas, eso parece algo inútil.

Ahora esto ciertamente no sería como normalmente estructuraría una aplicación grande, pero si el punto es tener varios "scripts" cada uno de los cuales puede ejecutarse de forma independiente, entonces darle a cada clase un método Main no parece tan malo.

De hecho, lo que a menudo hago para fines de demo es tener varias clases con métodos Main en un solo proyecto, luego tener un punto de entrada separado (que es en Program.cs) que usa la reflexión para encontrar todos los demás y luego permite usuario / presentador para elegir cuál ejecutar.

Si todo su código tiene sentido tener en una sola clase, entonces tener un pequeño método de entrada adicional no parece un problema. Si es en realidad un caso de demasiado código para una sola clase independientemente de de dónde está el punto de entrada, eso es un asunto diferente. (Así que si te apegaste a tener una única ScriptClass cuando en realidad deberías dar diferentes tareas a diferentes clases, eso también sería malo.) Del mismo modo si realmente está insistiendo si todo el código está en un único método , eso es definitivamente un problema para probar y mantener.

Le sugiero que deje de lado el desacuerdo del punto de entrada por el momento: encuentre la manera más limpia de estructurar todo lo demás sobre el código, y entonces realmente no importa si el método Main entra en Program.cs o dentro de otra clase.

 34
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:18:41

Creo que estás creando trabajo para ti mismo, honestamente. No puedo decir por los detalles en su descripción, pero si los scripts de shell han estado funcionando, ¿por qué estructurarlo donde aparentemente la estructura no era necesaria?

Usted está afirmando que la modularidad y el reempaquetado en una biblioteca externa es algo que tendrá que hacer - Yo respondería "¿por qué?"(esto es lo que quiero decir con trabajo extra).

Si crea un conjunto simple de métodos en un solo archivo, ¡eso es un solo archivo! It, by definición, será más fácil trabajar con múltiples proyectos, etc.

Dicho esto, es difícil saber de qué estamos hablando a menos que haya más detalles. Si se trata de" enviar un informe nocturno y enviar un correo electrónico a estas personas", eso es algo que no necesita una biblioteca de clases y un montón de modularidad. Ejecuta un método, estás acabado.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:23:44

Sabes que el punto de entrada de una aplicación de consola es configurable, ¿verdad?

Mi método preferido sería:

class MeaningfullyNamedProgram { 
    public static void Main(string[] args) {
        var program = new MeaningfullyNamedProgram(args);
        program.Run();
    }

    public MeaningfullyNamedProgram(string[] args) { 
    }

    public Run() {
        // well structured, broken-out code follows 
    }
}

Punto el punto de entrada del proyecto en el programa Meaningfullynamed.Main

NOTA: Lo dejaré como un ejercicio para el lector, pero podría crear una clase base para esto usando genéricos, y ahorrarse algo de escritura.

 4
Author: Troy Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:48:46

Su líder tecnológico necesita una buena conversación! Poniendo todo en el Programa.cs no es el camino a seguir.

 3
Author: Swomble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:08:37

Bueno, su manera es conceptualmente más simple, ya que es cómo se escribieron los programas antes de que se inventara la subrutina ....

Su camino es mejor: soporta reusabilidad y sería más fácil de modificar y depurar.

La única otra justificación en la que puedo pensar para su camino era que si te estaba tomando mucho más tiempo hacerlo a tu manera que hacerlo a su manera. Pero ese es un caso de pensamiento a corto plazo de su parte. Tu camino resistirá la prueba del tiempo mejor.

 3
Author: Ann L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:10:41

Su líder técnico está equivocado. El método que propone es mucho más razonable allows permite la consolidación de diferentes scripts fácilmente. Cada script que tiene su propio método Main puede volverse torpe, especialmente si planea tener una aplicación que pueda ejecutar varios de estos a la vez.

 2
Author: nickolayratchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:11:11

Dividir la lógica en una clase (o clases) separada es el camino a seguir. Ponerlo todo en un solo lugar viola los principios del diseño SÓLIDO y SECO. Definitivamente estás en el camino correcto con tu enfoque.

Cuanto más mantenga sus clases enfocadas en roles individuales, más fácil será su vida para el mantenimiento y las pruebas.

 1
Author: Mike Parkhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:10:39

Si la funcionalidad puede ser consumida por otros medios que no sean un programa de consola, por supuesto que debe mantenerlos en una biblioteca de clases modelada por nicelly. Guardar algunas líneas de código enredando el procesamiento de parámetros de la línea de comandos con funcionalidad encapsulada no tiene sentido dado el hecho de que las preocupaciones se separaron originalmente de todos modos. Tal vez tu líder tecnológico debería encontrar tareas más productivas para ti en mi humilde opinión.

 1
Author: Jack Wester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-15 22:13:33