2008-11-28 17 views
6

Cuando comencé a programar, escribí todo en main. Pero como aprendí, traté de hacer lo menos posible en mis métodos main().¿Cómo escribir main() de una manera OOP?

¿Pero dónde decide otorgarle a la otra Clase/Método la responsabilidad de hacerse cargo del programa desde main()? ¿Cómo lo haces?

he visto muchas maneras de hacerlo, así:

class Main 
{ 
    public static void main(String[] args) 
    { 
    new Main(); 
    } 
} 

y algunos como:

class Main { 

    public static void main(String[] args) { 

    GetOpt.parse(args); 

    // Decide what to do based on the arguments passed 
    Database.initialize(); 
    MyAwesomeLogicManager.initialize(); 
    // And main waits for all others to end or shutdown signal to kill all threads. 
    } 
} 

lo que debe y no debe hacerse en main()? ¿O no hay balas de plata?

¡Gracias por el tiempo!

Respuesta

7

En mi opinión, el "principal" de un proyecto de tamaño considerable debe contener alrededor de 3 llamadas de función:

  • Llamar a una función de inicialización que establece todos los ajustes necesarios, las preferencias, etc. para la aplicación.
  • Arranque del "controlador" principal de la aplicación
  • Esperando a que termine el controlador principal, y luego llamar a una función de Terminación que limpia todo lo que necesita ser limpiado en "principal" (aunque el controlador tendrá ya se encargó de la mayor parte de la limpieza).

Cualquier aplicación considerable se dividirá en fragmentos de funcionalidad, generalmente con cierta jerarquía. El controlador principal puede tener varios controladores secundarios para funciones específicas.

Haciéndolo de esta manera hace que sea mucho más fácil localizar la funcionalidad específica, y la separación de las preocupaciones es mejor.

Por supuesto, como han dicho otras respuestas, realmente no hay una bala de azúcar en el desarrollo de software. Para un proyecto corto, podría poner todo en orden para que las cosas funcionen rápidamente. Creo que también depende del idioma: algunas opciones pueden ser más sencillas que otras en determinados idiomas.

0

Creo que el método principal debería explicar lo que hace el programa al iniciarse. Por lo tanto, puede llamar a métodos de inicialización, pero la lógica debe extraerse en métodos.

En su ejemplo, no crearía un método Main(), sino que lo colocaría en el original.

4

Lo que flote su bote, como dicen. :) Deberías concentrarte en hacer que el código sea simple, fácil de leer y eficiente, usando las herramientas que necesites para lograrlo. Si se requiere poner muchos códigos en main, hazlo. Si crees que los objetos harían las cosas más organizadas, ve por allí.

Haciendo una sola instancia de class Main y llamando al método de instancia Main() que hace todo el trabajo es tan bueno como escribir todo en el método principal directamente.

0

El diseño de su programa decidirá la forma de su "principal".

Tener una "regla" que diga cómo debe ser su función principal, es - en mi humilde opinión - un sinsentido.

2

Yo diría que no es lo que está en tu función principal, sino lo que no. Dependiendo de la complejidad de su proyecto, deseará dividirlo en secciones funcionales, como "Funciones de base de datos", "Funciones de visualización", "Té alto con el vicario", etc.

Todo se basa en la legibilidad de código. ¿Puede alguien más, que nunca ha visto su programa antes de encontrarlo, y obtener al principio, una buena idea generalizada de lo que hace?

¿Entonces puede ver fácilmente dónde ir para profundizar un poco más en el mecanismo?

¿Cada sección funcional que utiliza solo hace un bloque lógico de procesos? No tiene que hacer solo una cosa, pero no debería estar haciendo todo más el fregadero de la cocina.

Divida su código de una manera que sea mantenible por una fuente externa.

cielos Causa sabe, cuando se trata a fin de cuentas, si alguien -else- puede corregir el error, es todos los mejores =)

Como respuesta directa a su pregunta, me gustaría poner las llamadas a funciones a cada uno de los componentes principales en main, la configuración, el proceso y el acabado, para que cualquiera que lo mire obtenga una visión general rápida de cómo funciona el programa. Luego pueden profundizar más si lo necesitan.

Código
17

en la función principal:

  • No puede ser la unidad probada.
  • No se pueden recibir dependencias por inyección.
  • No puede ser reutilizado por otras aplicaciones similares a la primera que escribe.

Por lo tanto código de la función principal:

  • debe ser tan simple que usted es feliz con sólo las pruebas funcionales/sistema.
  • Debe ser responsable de establecer el progreso de las dependencias utilizadas por todos sus otros códigos (es decir, actúa como una súper fábrica que crea su aplicación).
  • Solo debe hacer cosas que sean particulares a la forma en que se configura su aplicación (es decir, nada que el código de prueba o la versión de demostración necesiten hacer exactamente de la misma manera).

En la práctica, esto significa que las aplicaciones reales no tienen mucho en principal. Las aplicaciones de juguete y los programas de un solo uso pueden tener bastante en main, porque de todos modos no planeas probarlos o reutilizarlos.

En realidad, algo de lo que digo anteriormente es específico de C++. Por supuesto, los métodos principales de Java se pueden invocar mediante código de prueba o aplicaciones variantes. Pero todavía no toman objetos como parámetros, solo argumentos de línea de comandos, por lo que el grado en que pueden aislarse bajo prueba o comportarse bien en términos de reutilización es bastante bajo. Supongo que podría pasarles nombres de clases para que crearan instancias y los usen para crear el resto de la aplicación.

[Editar: alguien ha eliminado las etiquetas "C++, Java" de esta pregunta. Entonces, lo que digo arriba es específico de C++ y Java.Otros lenguajes pueden tratar main de una manera menos especial, en cuyo caso puede que no haya un motivo particular para tratarlo de manera especial.]

2

Mire, el contenido y la forma del método "principal" son muy importantes y dependiente del ambiente En Java, cada clase puede tener un método public static void main(), por lo que es completamente posible tener más de uno.

Pero ahora, pensemos en esto a través de la ley de modularización de parnas: "cada módulo oculta un secreto, y ese secreto es algo que puede cambiar". El "secreto" del módulo que se llama inicialmente son los detalles de la interconexión del proceso con el sistema operativo: cosas como obtener los argumentos y manejar terminaciones irregulares. En Python, esto lleva a algo como esto:

def main(args=None): 
    #argument processing 
    #construct instances of your top level objects 
    #do stuff 

if __name__ == "__main__": 
    try: 
     main(Sys.Argv) 
    except: # everything 
     # clean up as much as you can 
    else: 
     # normal cleanup, no exceptions 

El punto es que usted consigue todo, desde el medio ambiente puede, a continuación, llamar a la función main() aquí; captas todas las excepciones no detectadas y haces algo inteligente con ellas antes de que el programa muera.

0

Recuerde que si alguien quiere hacerse una idea de cómo funciona su programa, el primer lugar en el que probablemente se verá es en main (al menos yo lo haría). Por lo tanto, no creo que sea una buena idea poner tan poco como sea posible. Pero yo diría que pongas tan poco como sea necesario para obtener una visión general de cómo funciona tu programa.

Por lo tanto, creo que su mayor preocupación en la implementación de una función principal debe ser la legibilidad.