Ejercicio: Crear métodos reutilizables
- 10 minutos
A medida que desarrolle aplicaciones, es posible que escriba código para hacer lo mismo de nuevo. En lugar de escribir código duplicado, el uso de un método para realizar la misma tarea acorta el código y le ayuda a desarrollar aplicaciones más rápido. En este ejercicio, identificará el código repetido y lo reemplazará por un método reutilizable. ¡Comencemos!
Identificación del código duplicado
En esta tarea, echará un vistazo a una aplicación que realiza un seguimiento de los tiempos de medicación en diferentes zonas horarias. El usuario escribe su zona horaria actual y su zona horaria de destino. Su programación de medicamentos se muestra y luego se ajusta para la nueva zona horaria.
En el editor de Visual Studio Code, elimine cualquier código que haya de los ejercicios anteriores.
Copie y pegue el código siguiente en el Editor de Visual Studio Code:
using System; int[] times = {800, 1200, 1600, 2000}; int diff = 0; Console.WriteLine("Enter current GMT"); int currentGMT = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { string time = val.ToString(); int len = time.Length; if (len >= 3) { time = time.Insert(len - 2, ":"); } else if (len == 2) { time = time.Insert(0, "0:"); } else { time = time.Insert(0, "0:0"); } Console.Write($"{time} "); } Console.WriteLine(); Console.WriteLine("Enter new GMT"); int newGMT = Convert.ToInt32(Console.ReadLine()); if (Math.Abs(newGMT) > 12 || Math.Abs(currentGMT) > 12) { Console.WriteLine("Invalid GMT"); } else if (newGMT <= 0 && currentGMT <= 0 || newGMT >= 0 && currentGMT >= 0) { diff = 100 * (Math.Abs(newGMT) - Math.Abs(currentGMT)); /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } } else { diff = 100 * (Math.Abs(newGMT) + Math.Abs(currentGMT)); /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } } Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { string time = val.ToString(); int len = time.Length; if (len >= 3) { time = time.Insert(len - 2, ":"); } else if (len == 2) { time = time.Insert(0, "0:"); } else { time = time.Insert(0, "0:0"); } Console.Write($"{time} "); } Console.WriteLine();Observe que hay varios
forbucles que se repiten con código idéntico.Hay dos
foreachbucles que formatear y mostrar los tiempos de medicina. Hay otros dosforbucles que ajustan las horas según la diferencia de zona horaria.A medida que escribe código, es posible que se repitan bloques de código para realizar la misma tarea. Esa es una oportunidad perfecta para consolidar el código mediante un método para realizar la tarea en su lugar. ¡Vamos a practicar!
Creación de métodos para realizar las tareas repetidas
Ahora que ha identificado código repetido, puede crear un método para contener el código y quitar los duplicados. El uso de métodos tiene la ventaja adicional de acortar el código y mejorar la legibilidad! Los foreach bucles dan formato y muestran los valores de hora, por lo que puede asignar al método un nombre que refleje claramente esa tarea. Puede hacer lo mismo con el for bucle que ajusta las horas. ¡Comencemos!
Escriba una nueva línea de código en blanco al final del código anterior.
En la nueva línea de código en blanco, escriba el código siguiente para crear una firma de método:
void DisplayTimes() { }Para definir el cuerpo del método, actualice el
DisplayTimesmétodo copiando y pegando el bloque de laforeachsiguiente manera:void DisplayTimes() { /* Format and display medicine times */ foreach (int val in times) { string time = val.ToString(); int len = time.Length; if (len >= 3) { time = time.Insert(len - 2, ":"); } else if (len == 2) { time = time.Insert(0, "0:"); } else { time = time.Insert(0, "0:0"); } Console.Write($"{time} "); } Console.WriteLine(); }En este método, se incluye la llamada a
Console.WriteLineal final para anexar una nueva línea después de que se muestren las horas. A continuación, creará otro método para ajustar las horas según la diferencia de zona horaria.Escriba una nueva línea de código en blanco al final del código anterior.
En la nueva línea de código en blanco, escriba el código siguiente para crear una firma de método:
void AdjustTimes() { }Actualice el
AdjustTimesmétodo copiando y pegando el bucle de laforsiguiente manera:void AdjustTimes() { /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } }
Paso 3: Llamar a los métodos
En esta tarea, eliminará los bloques repetidos de código y los reemplazará por llamadas a los métodos que creó.
Busque la primera instancia del bucle repetido
foreachbajo el comentario "Dar formato y mostrar tiempos de medicina":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Reemplace el código que identificó por una llamada al
DisplayTimesmétodo . El reemplazo debe dar lugar al código siguiente:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");A continuación, reemplazará la segunda instancia del código repetido.
Busque la segunda instancia del
foreachbucle en el comentario "Dar formato y mostrar tiempos de medicina":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Reemplace el código que identificó por una llamada al
DisplayTimesmétodo . El reemplazo debe dar lugar al código siguiente:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Observe cómo el uso de un método en lugar de un bloque grande de código proporciona más claridad y facilita la comprensión del código. Vamos a hacer lo mismo con el
AdjustTimesmétodo que ha creado.Busque el código siguiente con los bucles -loop duplicados
for:else if (newGMT <= 0 && currentGMT <= 0 || newGMT >= 0 && currentGMT >= 0) { diff = 100 * (Math.Abs(newGMT) - Math.Abs(currentGMT)); /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } } else { diff = 100 * (Math.Abs(newGMT) + Math.Abs(currentGMT)); /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } }Reemplace las instancias de código repetido en el comentario "Ajustar las horas agregando la diferencia" por las llamadas al
AdjustTimesmétodo. El reemplazo debe dar lugar al código siguiente:else if (newGMT <= 0 && currentGMT <= 0 || newGMT >= 0 && currentGMT >= 0) { diff = 100 * (Math.Abs(newGMT) - Math.Abs(currentGMT)); AdjustTimes(); } else { diff = 100 * (Math.Abs(newGMT) + Math.Abs(currentGMT)); AdjustTimes(); }Ahora todo el código duplicado se ha reemplazado por el nuevo método. Observe el aspecto más legible y conciso del código.
Comprobación del trabajo
En esta tarea, ejecutará la aplicación desde el terminal integrado y comprobará que el código funciona correctamente. Comencemos.
Compare el código con lo siguiente para asegurarse de que es correcto:
int[] times = {800, 1200, 1600, 2000}; int diff = 0; Console.WriteLine("Enter current GMT"); int currentGMT = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT"); int newGMT = Convert.ToInt32(Console.ReadLine()); if (Math.Abs(newGMT) > 12 || Math.Abs(currentGMT) > 12) { Console.WriteLine("Invalid GMT"); } else if (newGMT <= 0 && currentGMT <= 0 || newGMT >= 0 && currentGMT >= 0) { diff = 100 * (Math.Abs(newGMT) - Math.Abs(currentGMT)); AdjustTimes(); } else { diff = 100 * (Math.Abs(newGMT) + Math.Abs(currentGMT)); AdjustTimes(); } Console.WriteLine("New Medicine Schedule:"); DisplayTimes(); void DisplayTimes() { /* Format and display medicine times */ foreach (int val in times) { string time = val.ToString(); int len = time.Length; if (len >= 3) { time = time.Insert(len - 2, ":"); } else if (len == 2) { time = time.Insert(0, "0:"); } else { time = time.Insert(0, "0:0"); } Console.Write($"{time} "); } Console.WriteLine(); } void AdjustTimes() { /* Adjust the times by adding the difference, keeping the value within 24 hours */ for (int i = 0; i < times.Length; i++) { times[i] = ((times[i] + diff)) % 2400; } }Guarde el trabajo con Ctrl + S o con el menú Archivo de Visual Studio Code.
Si es necesario, abra el panel del terminal integrado de Visual Studio Code.
En el panel EXPLORER, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y, a continuación, seleccione Abrir en terminal integrado.
En la línea de comandos de Terminal, escriba dotnet run
Escriba -6 y +6 para los mensajes GMT.
Compruebe que el código genera la salida siguiente:
Enter current GMT -6 Current Medicine Schedule: 8:00 12:00 16:00 20:00 Enter new GMT +6 New Medicine Schedule: 20:00 0:00 4:00 8:00Si el código muestra resultados diferentes, deberá revisarlo para encontrar el error y realizar las actualizaciones correspondientes. Vuelva a ejecutar el código para ver si ha corregido el problema. Continúe actualizando y ejecutando el código hasta que genere los resultados esperados.