2009-05-03 9 views
7

Recientemente programé una aplicación de consola y he experimentado mucho dolor al diseñarla en muchos aspectos, particularmente en C#, dado su paradigma OO puro. Las preguntas que he enfrentado incluyen desde cómo pasar las opciones a cómo devolver los problemas a la clase de punto de entrada, entre muchos, muchos otros.Consideraciones arquitectónicas en el diseño de aplicaciones de consola?

Mi pregunta es: ¿alguno de ustedes sabe de buenos diseños de aplicaciones de consola en un paradigma OO para que pueda aprender de ellos? El código de buenas implementaciones es particularmente welcome.

EDIT: No estoy después de las API de línea de comandos, pero después de los buenos principios de diseño y, en particular, las buenas implementaciones que pude aprender.

EDIT 2: Hay una interacción simple del usuario en la aplicación, pero no es una ordenación CLI/REPL con todas las de la ley. Piense en ello como el comando TeX, más o menos. Curiosamente, a pesar de que hay una buena teoría flotando (no diferente de X, usa el patrón Y, debes saber los principios OO ... [¡tu profesor de informática estaría tan orgulloso!]), No hay un código real que pueda tomar. mira para ver estos conceptos en acción. De nuevo, ¿dónde debería buscar (¡código!) Una buena aplicación de línea de comandos en un paradigma de OO puro.

+0

Las aplicaciones de consola son generalmente utilitaria en la naturaleza. Es posible que tengas una mejor experiencia de aprendizaje y encuentres muchas más aplicaciones de muestra, conectando con widgets a las aplicaciones de escritorio de WinForms. – DOK

+0

consola schmonsole. Se trata de aprender OO antes de programar OO. Un punto de partida decente es leer Code Complete. – Will

Respuesta

7

Parece que está creando una interfaz que realiza una de varias operaciones distintas con cada invocación. No estoy seguro si se refiere a una aplicación de "línea de comando" (que hace una acción, luego sale) o una aplicación de CLI (que muestra un mensaje y responde repetidamente a la entrada del usuario). En general, el primero será mucho más simple de construir que el segundo; Creo que tiene sentido utilizar una CLI si su aplicación requiere un estado persistente que evoluciona en varios comandos. Si estás abordando algo como esto, entonces alphaZero es correcto; probablemente deberías aprender sobre REPLs y copiar uno bueno.

En cualquier caso, la operación se realice dependerá de los argumentos que se pasan en la línea de comandos, así que voy a una lluvia de ideas acerca de esa parte ...

Es a pensar sensible de la aplicación como un conjunto de distintas " Comando "objetos", uno para cada tipo de operación. El punto de entrada a la aplicación debería ser, por lo tanto, un tipo de objeto CommandLineDispatcher que distribuye solicitudes al objeto Command correspondiente.

Para ser modular, el despachador se debe configurar con un mapeo abstraído (por ejemplo, una Hashtable) para asociar cada token de comando (generalmente la primera palabra de la cadena de línea de comando) al objeto Command que lo maneja. El despachador también puede manejar opciones comunes de análisis, probablemente usando alguna biblioteca "getopts" estándar para hacer el trabajo pesado.

Para empezar simple, cada objeto de comando podría implementar una interfaz coherente para hacer su trabajo; tal vez algo como esto:

public void execute(List<String> args) 

De esta manera, el despachador de punto de entrada solo se solicita se encuentra el Comando, y executes ella.

En cuanto a la gestión de errores: el método execute() podría arrojar una excepción para comunicar errores ... Excepción podría ser capturada y procesada por el despachador, o simplemente iniciar sesión en la pantalla. Alternativamente, los Comandos fallidos podrían invocar alguna función de usage compartida para combinar un mensaje de error con instrucciones generales. No creo que el "punto de entrada" deba ser necesariamente consciente de los problemas que sugiera; si necesita un manejo robusto de errores (por ejemplo, para las capacidades de registro o alerta), parece que pertenece a un componente separado que podría proporcionarse al objeto Command.

En general, una aplicación de línea de comandos no es diferente de cualquier otra aplicación que responda a la entrada del usuario; necesitará un despachador para analizar y enrutar la entrada y controladores (también conocidos como "controladores") para ejecutar el operaciones compatibles. Si necesita otros servicios (registro, alertas, conectividad de base de datos, etc.), hará bien en crear componentes separados para aislar esta lógica y exponerla con interfaces limpias.

3

Una aplicación de consola hay forma diferente de una forma de ganar regulares o aplicación web cuando se trata de problemas transversales clave como la tala, el error y el manejo de excepciones, seguridad, etc.,

Una vez dicho esto puede usted por favor detallar nuestra pregunta sobre dónde están las áreas clave de preocupación?

Puede dibujar en muchos patrones desde App Architecture Guide de Microsoft.

+1

+1 para el puntero a la útil Guía de Arquitectura de aplicaciones! –

+0

Lo mismo aquí. +1 para la guía, excelente enlace. –

+0

¿Alguien puede abrir la Guía de arquitectura de la aplicación con Vista previa en una Mac con 10.5.6? – msi

1

En Java a menudo uso Apache CLI, he buscado en Google "CLI for .NET" pero todavía no parece haber ninguna implementación. Tal vez le resulte útil leer el enfoque de Java para recibir los parámetros de la consola.

Para la arquitectura de su aplicación, no debe ser muy diferente de la arquitectura que usaría en una aplicación web, la diferencia es que la consola es la interfaz de su nivel de presentación. Tal vez pueda definir algunos 'ConsoleControllers' para recibir el modelo desde el nivel empresarial a la consola y viceversa. Piense en cada entrada del usuario como una solicitud;).

+0

nice pointer - Debería prestar más atención a las bibliotecas de apache commons – msi

1

En su (extremo) sentido general la mayoría, una aplicación de consola es un tipo de REPL:

http://en.wikipedia.org/wiki/REPL

Obviamente, un (consola) aplicación específica de dominio no está apoyando un lenguaje Turing completo, pero muchos de los problemas se superponen, y un buen REPL debe ser una aplicación de línea de comandos muy robusta. Estoy seguro de que puedes aprender mucho estudiando el diseño y la implementación de un REPL típico. (La mayoría de los REPL son de código abierto. (Pruebe ruby ​​o python para OO REPL))

0

Para que un programa tenga un buen diseño arquitectónico, especialmente en C# debe estar familiarizado con los conceptos de diseño orientado a objetos para tener plenamente advanage de OO paradigmas

Cuestiones relacionadas