Saltar al pie de página
Iron Academy Logo
Aplicación C#
Aplicación C#

Otras categorías

Solicitud de datos al usuario - Spectre Console Series

Tim Corey
10m 10s

Las aplicaciones de consola en C# siempre han sido la forma más sencilla de aprender cómo un programa lee la entrada del usuario y muestra la salida. En su serie Spectre.Console, Tim Corey muestra cómo ir mucho más allá del simple símbolo del sistema en blanco y negro. En este artículo examinaremos detenidamente su vídeo "Requesting Data from the User - Spectre Console Series" para ver cómo recopila entradas, gestiona valores numéricos, realiza comprobaciones de errores y da a su programa un aspecto más amigable, todo ello sin modificar manualmente código repetitivo. Se incluyen marcas de tiempo para que puedas saltar al punto correcto del vídeo.

Introducción: La entrada en la línea de comandos más fácil

Nada más empezar, Tim nos recuerda que Spectre.Console puede transformar la entrada ordinaria de la línea de comandos de C en algo visualmente atractivo. En lugar de escribir un método estático Main(string[] args) y luego leer manualmente desde el flujo de entrada estándar con Console.ReadLine(), analizarlo y lidiar con las excepciones, Spectre.Console lo hace por usted.

En palabras de Tim (0:17), esta sesión mostrará cómo "pedir información al usuario, validar los datos y convertirlos en el tipo de datos adecuado", una habilidad fundamental para cualquier desarrollador que trabaje con una consola o un símbolo del sistema.

Leyendo valores enteros con Ask

El primer ejemplo de Tim (0:35) es familiar: preguntar al usuario su edad. Tradicionalmente, en C# se escribiría:

static void Main(string[] args)
{
    Console.Write("Enter integer age: ");
    string input = Console.ReadLine();
    int age = int.Parse(input);
}
static void Main(string[] args)
{
    Console.Write("Enter integer age: ");
    string input = Console.ReadLine();
    int age = int.Parse(input);
}

Aquí se muestra el punto de entrada clásico de un programa en C#, la función principal, y cómo se recibe un parámetro de entrada desde el teclado a través de la consola. También debe utilizar int.Parse o Convert.ToInt32 para convertir la entrada de cadena en una edad int. Tim señala que debes manejar entradas no válidas y lanzar o capturar excepciones tú mismo.

Con Spectre.Console, simplemente escribe:

int age = AnsiConsole.Ask<int>("What is your age?");
int age = AnsiConsole.Ask<int>("What is your age?");

Esta línea lee la entrada, la convierte en un valor entero y muestra un mensaje de error en rojo si el usuario escribe caracteres no numéricos, sin necesidad de código adicional de comprobación de errores. Cuando el usuario pulsa Intro, el método lee la entrada, la convierte en un tipo numérico y la almacena en la variable de edad.

Entrada booleana y por qué Prompt es mejor

A continuación (1:14) Tim demuestra cómo pedir un booleano:

bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");

Si el usuario introduce "verdadero" o "falso", funciona. Pero si escriben "sí", Spectre.Console muestra un error en rojo. Esto demuestra que, aunque Ask maneja los tipos de datos de forma automática, no siempre es lo más natural para la entrada del usuario.

Spectre Console Requesting Data User 1 related to Entrada booleana y por qué Prompt es mejor

Aquí es donde Tim se pasa a una API más flexible, Prompt, que se comporta más como una miniclase que se puede personalizar.

Usando TextPrompt para Elecciones

A las 3:02 Tim cambia de Ask a Prompt con un TextPrompt. En lugar del booleano incorporado, crea una nueva instancia de un indicador de texto que ofrezca al usuario opciones reales:

var happyText = AnsiConsole.Prompt(
    new TextPrompt<string>("Are you happy?")
        .AddChoice("Yes")
        .AddChoice("No"));
var happyText = AnsiConsole.Prompt(
    new TextPrompt<string>("Are you happy?")
        .AddChoice("Yes")
        .AddChoice("No"));

Cuando se ejecuta el programa (4:48), la consola muestra [Yes/No] después de la pregunta. Esto es Spectre.Console decorando la línea de comandos para que el usuario pueda ver fácilmente las respuestas aceptables. Si escribe algo más, el método lo recibe, lo compara con la lista y muestra un mensaje amigable que le indica que seleccione una opción disponible.

Spectre Console Requesting Data User 2 related to Usando TextPrompt para Elecciones

Añadir un valor por defecto

A continuación, Tim añade un defecto (5:16):

.DefaultValue("Yes")
.DefaultValue("Yes")

Ahora, cuando se ejecuta el programa, el usuario puede simplemente pulsar Intro -un retorno de carro sin texto- y el método asigna automáticamente "Sí" a la variable. Esto es ideal cuando se desea almacenar un valor predeterminado razonable sin código adicional en el método principal.

Promoción de números enteros con validación

A las 6:01 Tim muestra un ejemplo más rico con entrada de enteros. Utiliza un nuevo TextPrompt para volver a pedir la edad, pero añade lógica de validación justo dentro del prompt:

int age = AnsiConsole.Prompt(
    new TextPrompt<int>("What is your age?")
        .Validate(x =>
        {
            return x switch
            {
                < 0   => ValidationResult.Error("[red]You were not born yet[/]"),
                > 120 => ValidationResult.Error("[red]You are too old[/]"),
                _     => ValidationResult.Success(),
            };
        }));
int age = AnsiConsole.Prompt(
    new TextPrompt<int>("What is your age?")
        .Validate(x =>
        {
            return x switch
            {
                < 0   => ValidationResult.Error("[red]You were not born yet[/]"),
                > 120 => ValidationResult.Error("[red]You are too old[/]"),
                _     => ValidationResult.Success(),
            };
        }));

En este caso, el prompt no solo convierte los valores de cadena del flujo de entrada estándar en un tipo numérico, sino que también realiza una comprobación de errores basada en reglas de negocio, como no permitir edades negativas. Tim lo prueba en directo (8:31): introducir -1 desencadena "Aún no has nacido" Introducir 150 desencadena "Eres demasiado viejo" Sólo las entradas válidas permiten al programa pasar a la línea siguiente.

Spectre Console Requesting Data User 3 related to Promoción de números enteros con validación

Esta validación integrada elimina la necesidad de escribir manualmente sentencias if en la función principal, llamar a métodos de análisis sintáctico y gestionar excepciones.

Preguntar vs Preguntar: Cuándo usar cada una

A las 9:00 Tim hace un resumen:

  • Ask: Rápido y simple. Perfecto cuando su programa solo necesita leer un parámetro de entrada y convertirlo a un tipo conocido.

  • Prompt: Más potente. Permite añadir opciones, valores predeterminados y validaciones. Es ideal cuando se está construyendo una aplicación de consola más rica o se está integrando con otros programas que llaman a su archivo ejecutable con argumentos de línea de comandos.

Ambos enfoques encajan perfectamente en su punto de entrada static void Main(string[] args) o incluso public static void Main(string[] args). También puede acceder a args para leer los argumentos de la línea de comandos que se pasan durante la ejecución del programa, combinarlos con los mensajes de Spectre.Console y generar una cadena con un formato ordenado mediante string.Format o interpolación.

Por qué es importante para los desarrolladores de consolas

Tim concluye (9:19) señalando cómo este enfoque "lleva tu capacidad de pedir la opinión del usuario al siguiente nivel" Con Spectre.Console ya no tendrás que escribir código repetitivo para leer la entrada del teclado, convertirla con la clase Convert y mostrar mensajes predeterminados. En su lugar obtendrá:

  • Salida enriquecida en color en el símbolo del sistema.

  • Análisis sintáctico automático de tipos numéricos, valores dobles o valores de cadena.

  • Gestión de errores amigable para entradas no válidas.

  • La capacidad de combinar avisos con argumentos de línea de comandos tradicionales para modelos de entrada híbridos.

De este modo, resulta más fácil enseñar a los principiantes el método principal, los tipos de datos y los parámetros de entrada sin dejar de escribir aplicaciones de consola de nivel profesional en Visual Studio o cualquier otro editor.

Conclusión

Siguiendo el tutorial de Tim Corey en el vídeo, aprenderás:

  • Cómo usar Ask de Spectre.Console para leer y convertir la entrada del usuario.

  • Cómo usar TextPrompt para presentar elecciones, valores predeterminados y validación.

  • Cómo estas instrucciones encajan de forma natural en su punto de entrada Main(string[] args) junto con los argumentos de la línea de comandos.

  • Cómo reducir la comprobación de errores repetitiva y hacer más amigables las aplicaciones de línea de comandos.

Todo lo que Tim muestra se sigue compilando en un único archivo ejecutable que se puede ejecutar desde el símbolo del sistema, al que se le pueden pasar argumentos o que se puede incrustar en aplicaciones o herramientas Windows Forms más grandes. Se trata de una forma moderna de manejar las entradas del usuario manteniendo la sencillez de la consola de C# y su conocida función principal.

Hero Worlddot related to Solicitud de datos al usuario - Spectre Console Series
Hero Affiliate related to Solicitud de datos al usuario - Spectre Console Series

Gana más compartiendo lo que te gusta

¿Creas contenidos para desarrolladores que trabajan con .NET, C#, Java, Python o Node.js? ¡Convierte tu experiencia en un ingreso extra!

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame