Silvia Corrales
Principio DRY
DRY: Don’t Repeat Yourself (No te repitas) .
El objetivo de este principio es evitar la duplicación de partes de código en nuestro código. Andy Hunt y Dave Thomas formularon en su libro «The Pragmatic Programmer: From Journeyman to Master» el siguiente principio:
«Every piece of knowledge must have a single, unambiguous, authoritative representation within a system»
Que en español se traduciría como:
«Cada pieza de conocimiento debe tener una única representación autorizada, sin ambigüedades, dentro de un sistema».
El código duplicado no siempre es fácil de reconocer o para poder eliminarlo puede que resulte más compleja la solución. una regla de oro en el refactoring es la Regla de tres: repetir una vez el mismo código puede ser aceptable, pero la tercera vez que utilizamos el mismo código, es señal inequívoca de que hay que refactorizar y solucionar la duplicación.
Miguel Andres Rendon Reyes
La regla de tres es algo muy común para saber si estás "Fucked up", si les interesa, busquen la guía de estilo de Linux y los programadores "Never nester".
Luis Jacobo Hernandez Campuzano
¡Excelente aporte!
Javi Llinares
Así quedaría la función:
public static void ShowTaskList() { for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); }
Hans González
Yo he replicado tu codigo, y he hice lo mismo pero , la aplicacion se cierra automaticamente, no se si debo de colocar dentro de la funcion un stop o que retorne un readline para que no se cierre , saludos
Carlos Ruiz Bustillo
El problema del cerrado automático es porque en el do-while en el método main. Se supone que nosotros queremos que al presionar ++4++, este salga, pero el código entiende que mientras no haya un valor igual a ++4 ++en el bucle este va a terminar el bucle en cualquier opción.
Para solucionarlo solo debemos cambiar la condición de "igual" a "diferente de", así el programa va a entender que al presionar 4 el bucle se va a detener.
Bryan Steven Gaitan Echeverry
Analizando un poco, me fije que quizas no es necesario crear otra funcion que lista, ya que su funcion principal es listar y si no hay tarear, pues basicamente diria "No hay tareas por realizar", por lo que no habria nada por borrar, yo solo le puse ShowTaskList(), es descriptivo y no repito codigo.
Carlos Zacarías
Concuerdo con tu comentario
Bernardo Ayala Montezuma
Otra parte del codigo que se esta repitiendo con los Console.WriteLine que imprimen las lineas de separacion. Eso tambien puede convertirse en un metodo que podriamos reutilizar.
Asi no tendriamos que copiar y pegar esa linea de codigo cada ve que queramos agregar una linea de separacion. Ademas si en el futuro queremos hacer esa linea mas larga o corta, o si queremos cambiar los guiones por algun otro simbolo, solo tendriamos que cambiarlo en un solo lugar.
private static void PrintSeparator() { Console.WriteLine("----------------------------------------"); }
Miguel Angel Reyes Moreno
Reto conseguido:
using System; using System.Collections.Generic; namespace ToDo { internal class Program { public static List<string> TaskList { get; set; } static void Main(string[] args) { TaskList = new List<string>(); int menuOption = 0; do { menuOption = ShowMainMenu(); if ((Menu)menuOption == Menu.Add) { AddTask(); } else if ((Menu)menuOption == Menu.Remove) { RemoveTask(); } else if ((Menu)menuOption == Menu.List) { ShowTaskList(); } } while ((Menu)menuOption != Menu.Exit); } /// <summary> /// Show the main menu /// </summary> /// <returns>Returns menuOption indicated by user</returns> public static int ShowMainMenu() { Console.WriteLine("----------------------------------------"); Console.WriteLine("Ingrese la opción a realizar: "); Console.WriteLine("1. Nueva tarea"); Console.WriteLine("2. Remover tarea"); Console.WriteLine("3. Tareas pendientes"); Console.WriteLine("4. Salir"); // Read taskIndex string taskIndex = Console.ReadLine(); return Convert.ToInt32(taskIndex); } public static void RemoveTask() { try { Console.WriteLine("Ingrese el número de la tarea a remover: "); // Show current taks ListTasks(); string taskIndex = Console.ReadLine(); // Remove one position int indexToRemove = Convert.ToInt32(taskIndex) - 1; if (indexToRemove > -1) { if (TaskList.Count > 0) { string taskToRemove = TaskList[indexToRemove]; TaskList.RemoveAt(indexToRemove); Console.WriteLine("Tarea " + taskToRemove + " eliminada"); } } } catch (Exception) { } } public static void AddTask() { try { Console.WriteLine("Ingrese el nombre de la tarea: "); string taskToAdd = Console.ReadLine(); TaskList.Add(taskToAdd); Console.WriteLine("Tarea registrada"); } catch (Exception) { } } public static void ShowTaskList() { if (TaskList == null || TaskList.Count == 0) { Console.WriteLine("No hay tareas por realizar"); } else { ListTasks(); } } public static void ListTasks() { Console.WriteLine("----------------------------------------"); for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); } } public enum Menu { Add = 1, Remove = 2, List = 3, Exit = 4 } }
Leandro Cosme Tomassini
Principio DRY (Don't Repeat Yourself)
¿Qué es?
DRY es una filosofía de desarrollo de software que busca evitar la duplicación de código. Se basa en la idea de que cada pieza de información o lógica debe existir en un único lugar.
¿Por qué es importante?
La duplicación de código puede generar varios problemas:
¿Cómo aplicar el principio DRY?
Ejemplos de aplicación en C#:
Julian Alzate Gonzalez
StringBuilder menu = new StringBuilder(); menu.AppendLine("Seleccione una opción:"); menu.AppendLine("1. Nueva tarea"); menu.AppendLine("2. Remover tarea"); menu.AppendLine("3. Tareas pendientes"); menu.AppendLine("4. Salir");
Console.WriteLine(menu);
Luis Alvarez
Mi Aporte ;$
using System; using System.Collections.Generic; namespace ToDo { internal class Program { private static List<string> taskList { get; set; } public static List<string> GetTaskList() { return taskList; } public static void SetTaskList(List<string> value) { taskList = value; } // Función para mostrar la lista de tareas public static void ShowTaskList() { Console.WriteLine("----------------------------------------"); for (int i = 0; i < GetTaskList().Count; i++) { Console.WriteLine((i + 1) + ". " + GetTaskList()[i]); } Console.WriteLine("----------------------------------------"); } static void Main(string[] args) { SetTaskList(new List<string>()); int menuSelected = 0; do { menuSelected = ShowMainMenu(); if ((Menu)menuSelected == Menu.add) { ShowMenuAdd(); } else if ((Menu)menuSelected == Menu.remove) { ShowMenuRemove(); } else if ((Menu)menuSelected == Menu.List) { ShowTaskList(); // Llamada al método ShowTaskList en lugar de ShowMenuTaskList } } while ((Menu)menuSelected != Menu.Exit); } public static int ShowMainMenu() { Console.WriteLine("----------------------------------------"); Console.WriteLine("Ingrese la opción a realizar: "); Console.WriteLine("1. Nueva tarea"); Console.WriteLine("2. Remover tarea"); Console.WriteLine("3. Tareas pendientes"); Console.WriteLine("4. Salir"); // Read line string taskIndex = Console.ReadLine(); return Convert.ToInt32(taskIndex); } public static void ShowMenuRemove() { try { Console.WriteLine("Ingrese el número de la tarea a remover: "); ShowTaskList(); string taskIndex = Console.ReadLine(); // Remove one position int indexToRemove = Convert.ToInt32(taskIndex) - 1; if (indexToRemove > -1) { if (GetTaskList().Count > 0) { string taskToRemove = GetTaskList()[indexToRemove]; GetTaskList().RemoveAt(indexToRemove); Console.WriteLine("Tarea " + taskToRemove + " eliminada"); } } } catch (Exception) { } } public static void ShowMenuAdd() { try { Console.WriteLine("Ingrese el nombre de la tarea: "); string task = Console.ReadLine(); GetTaskList().Add(task); Console.WriteLine("Tarea registrada"); } catch (Exception) { } } public static void ShowMenuTaskList() { if (GetTaskList() == null || GetTaskList().Count == 0) { Console.WriteLine("No hay tareas por realizar"); } else { ShowTaskList(); } } } public enum Menu { add = 1, remove = 2, List = 3, Exit = 4 } }
Pablo Andres Muñoz Martinez
muy buena clase, ahora ultimo se ven muchos códigos con muchas funciones repetidas.
Gilberto Alejandro Monroy Morales
No se si lo comprendí al 100% pero lo que pidieron era que se renombrara la función sin decir que venia del menú. Entonces hice eso en todo el código que contuviera "ShowMenuTaskList". Espero estar en lo correcto, de lo contrario también espero su retroalimentación.
public static void ShowMenuRemove() { try { Console.WriteLine("Ingrese el número de la tarea a remover: "); // Show current taks ShowTaskList(); string deleteTask = Console.ReadLine(); // Remove one position int indexToRemove = Convert.ToInt32(deleteTask) - 1; if (indexToRemove > -1) { if (TaskList.Count > 0) { string deletedTask = TaskList[indexToRemove]; TaskList.RemoveAt(indexToRemove); Console.WriteLine("Tarea " + deletedTask + " eliminada"); } } } catch (Exception) { } }
public static void ShowTaskList() { if (TaskList == null || TaskList.Count == 0) { Console.WriteLine("No hay tareas por realizar"); } else { Console.WriteLine("----------------------------------------"); for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); } }
Jonathan Harley Sabogal toro
public static void ShowTaskList() { <u>Console</u>.WriteLine("----------------------------------------"); for (int i = 0; i < taskList.Count; i++) { <u>Console</u>.WriteLine((i + 1) + ". " + taskList[i]); } <u>Console</u>.WriteLine("----------------------------------------"); }
Jonathan Harley Sabogal toro
public static void ShowTaskList()
{
Console``.WriteLine("----------------------------------------");
for (int i = 0; i < taskList.Count; i++)
{
Console``.WriteLine((i + 1) + ". " + taskList[i]); }
Console``.WriteLine("----------------------------------------");
}
Yan Harold Muñoz Dominguez
public static void ViewList() { Console.WriteLine("----------------------------------------"); for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); } ```Creo que si queremos algo sencillo sería así
Juliana Ramirez M
Excelente clase
Juan Pablo Ruiz
Albert Johanson
using System;
using System.Collections.Generic;
using System.Linq;
namespace ToDo
{
internal class Program
{
public static List<string> TaskList { get; set; }
static void Main(string[] args)
{
TaskList = new List<string>();
int selectedOption = 0;
do
{
selectedOption = MainMenu();
if ((Menu)selectedOption == Menu.Add)
{
NewTask();
}
else if ((Menu)selectedOption == Menu.Remove)
{
RemoveTask();
}
else if ((Menu)selectedOption == Menu.PendingTask)
{
PendingTask();
}
} while ((Menu)selectedOption != Menu.Exit);
}
/// <summary>
/// Show the main menu
/// </summary>
/// <returns>Returns option indicated by user</returns>
public static int MainMenu()
{
Separator();
ShowMessage("Ingrese la opción a realizar: ");
ShowMessage("1. Nueva tarea");
ShowMessage("2. Remover tarea");
ShowMessage("3. Tareas pendientes");
ShowMessage("4. Salir");
// Read line
string option = Console.ReadLine();
return Convert.ToInt32(option);
}
public static void NewTask()
{
try
{
ShowMessage("Ingrese el nombre de la tarea: ");
string task = Console.ReadLine();
TaskList.Add(task);
Console.WriteLine("Tarea registrada");
}
catch (Exception)
{
}
}
public static void RemoveTask()
{
try
{
ShowMessage("Ingrese el número de la tarea a remover: ");
// Show current taks
PrintTasks();
Separator();
string taskNumber = Console.ReadLine();
// Remove one position
int taskToRemove = Convert.ToInt32(taskNumber) - 1;
if (taskToRemove > -1)
{
if (TaskList.Count > 0)
{
string task = TaskList[taskToRemove];
TaskList.RemoveAt(taskToRemove);
ShowMessage("Tarea " + task + " eliminada");
}
}
}
catch (Exception)
{
}
}
public static void PendingTask()
{
if (TaskList == null || TaskList.Count == 0)
{
ShowMessage("No hay tareas por realizar");
}
else
{
Separator();
PrintTasks();
Separator();
}
}
public static void PrintTasks()
{
for (int i = 0; i < TaskList.Count; i++)
{
Console.WriteLine((i + 1) + ". " + TaskList[i]);
}
}
public static void Separator()
{
Console.WriteLine("----------------------------------------");
}
public static void ShowMessage(string message)
{
Console.WriteLine(message);
}
}
public enum Menu
{
Add = 1,
Remove = 2,
PendingTask = 3,
Exit = 4
}
}
Mi aporte agregue 3 metodos el que se hizo en clase con el profe que es para mostrar las listas, unos para imprimir el separador y otro para motrar los distintos mensajes asi no se llama al Console.WriteLone en todos los metodo.
Guido Quispe Quispe
using System; using System.Collections.Generic; namespace ToDo { internal class Program { public static List<string> TaskList { get; set; } static void Main(string[] args) { TaskList = new List<string>(); int MenuSelect = 0; do { MenuSelect = ShowMainMenu(); if ((Menu)MenuSelect == Menu.Add) { ShowMenuAdd(); } else if ((Menu)MenuSelect == Menu.remove) { ShowMenuRemove(); } else if ((Menu)MenuSelect == Menu.List) { ShowMenuList(); } } while ((Menu)MenuSelect != Menu.Exit); } /// <summary> /// Show the main menu /// </summary> /// <returns>Returns option indicated by user</returns> public static int ShowMainMenu() { Console.WriteLine("----------------------------------------"); Console.WriteLine("Ingrese la opción a realizar: "); Console.WriteLine("1. Nueva tarea"); Console.WriteLine("2. Remover tarea"); Console.WriteLine("3. Tareas pendientes"); Console.WriteLine("4. Salir"); // Read line string line = Console.ReadLine(); return Convert.ToInt32(line); } public static void ShowMenuRemove() { try { Console.WriteLine("Ingrese el número de la tarea a remover: "); // Show current taks Show(); string line = Console.ReadLine(); // Remove one position int indexToRemove = Convert.ToInt32(line) - 1; if (indexToRemove > -1) { if (TaskList.Count > 0) { string task = TaskList[indexToRemove]; TaskList.RemoveAt(indexToRemove); Console.WriteLine("Tarea " + task + " eliminada"); } } } catch (Exception) { } } public static void ShowMenuAdd() { try { Console.WriteLine("Ingrese el nombre de la tarea: "); string task = Console.ReadLine(); TaskList.Add(task); Console.WriteLine("Tarea registrada"); } catch (Exception) { } } public static void ShowMenuList() { if (TaskList == null || TaskList.Count == 0) { Console.WriteLine("No hay tareas por realizar"); } else { Show(); } } public static void Show() { Console.WriteLine("----------------------------------------"); for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); } } public enum Menu { Add = 1, remove = 2, List = 3, Exit = 4 } } ```using System; using System.Collections.Generic; namespace ToDo {   internal class Program   {   public static List\<string> TaskList { get; set; }   static void Main(string\[] args)   {   TaskList = new List\<string>();   int MenuSelect = 0;   do   {   MenuSelect = ShowMainMenu();   if ((Menu)MenuSelect == Menu.Add)   {   ShowMenuAdd();   }   else if ((Menu)MenuSelect == Menu.remove)   {   ShowMenuRemove();   }   else if ((Menu)MenuSelect == Menu.List)   {   ShowMenuList();   }   } while ((Menu)MenuSelect != Menu.Exit);   }   /// \<summary>   /// Show the main menu    /// \</summary>   /// \<returns>Returns option indicated by user\</returns>   public static int ShowMainMenu()   {   Console.WriteLine("----------------------------------------");   Console.WriteLine("Ingrese la opción a realizar: ");   Console.WriteLine("1. Nueva tarea");   Console.WriteLine("2. Remover tarea");   Console.WriteLine("3. Tareas pendientes");   Console.WriteLine("4. Salir");   // Read line   string line = Console.ReadLine();   return Convert.ToInt32(line);   }   public static void ShowMenuRemove()   {   try   {   Console.WriteLine("Ingrese el número de la tarea a remover: ");   // Show current taks   Show();   string line = Console.ReadLine();   // Remove one position   int indexToRemove = Convert.ToInt32(line) - 1;   if (indexToRemove > -1)   {   if (TaskList.Count > 0)   {   string task = TaskList\[indexToRemove];   TaskList.RemoveAt(indexToRemove);   Console.WriteLine("Tarea " + task + " eliminada");   }   }   }   catch (Exception)   {   }   }   public static void ShowMenuAdd()   {   try   {   Console.WriteLine("Ingrese el nombre de la tarea: ");   string task = Console.ReadLine();   TaskList.Add(task);   Console.WriteLine("Tarea registrada");   }   catch (Exception)   {   }   }   public static void ShowMenuList()   {   if (TaskList == null || TaskList.Count == 0)   {   Console.WriteLine("No hay tareas por realizar");   }    else   {   Show();   }   }   public static void Show()   {   Console.WriteLine("----------------------------------------");   for (int i = 0; i < TaskList.Count; i++)   {   Console.WriteLine((i + 1) + ". " + TaskList\[i]);   }   Console.WriteLine("----------------------------------------");   }   }   public enum Menu   {   Add = 1,   remove = 2,   List = 3,   Exit = 4   } }
hector leonardo achucarro
using System;
using System.Collections.Generic;
using System.Text;
namespace ToDo
{
internal class ToDo
{
public static List<string> TaskList { get; set; }
static void Main(string[] args)
{
TaskList = new List<string>();
Menu menuSelected;
do
{
menuSelected = ShowMainMenu();
switch (menuSelected)
{
case Menu.AddOnList:
ShowMenuTaskAdd();
break;
case Menu.RemoveTask:
ShowMenuRemoveTask();
break;
case Menu.ListOnScreen:
ShowMenuTaskOnScreen();
break;
}
} while (menuSelected != Menu.ExitMenu);
}
public static Menu ShowMainMenu()
{
var menu = new StringBuilder()
.AppendLine("----------------------------------------")
.AppendLine("Ingrese la opción a realizar: ")
.AppendLine("1. Nueva tarea")
.AppendLine("2. Remover tarea")
.AppendLine("3. Tareas pendientes")
.AppendLine("4. Salir");
Console.WriteLine(menu);
if (int.TryParse(Console.ReadLine(), out int selectedOption) && Enum.IsDefined(typeof(Menu), selectedOption))
{
return (Menu)selectedOption;
}
else
{
Console.WriteLine("Opción inválida. Por favor, intente de nuevo.");
return ShowMainMenu();
}
}
public static void ShowMenuRemoveTask()
{
ShowMenuTaskOnScreen();
if (int.TryParse(Console.ReadLine(), out int indexToRemove))
{
indexToRemove--;
if (indexToRemove > -1 && TaskList.Count > 0)
{
string task = TaskList[indexToRemove];
TaskList.RemoveAt(indexToRemove);
Console.WriteLine($"Tarea {task} eliminada");
}
}
else
{
Console.WriteLine("Entrada inválida. Por favor, intente de nuevo.");
ShowMenuRemoveTask();
}
}
public static void ShowMenuTaskAdd()
{
Console.WriteLine("Ingrese el nombre de la tarea: ");
string task = Console.ReadLine();
TaskList.Add(task);
Console.WriteLine("Tarea registrada");
}
public static void ShowMenuTaskOnScreen()
{
if (TaskList == null || TaskList.Count == 0)
{
Console.WriteLine("No hay tareas por realizar");
}
else
{
var taskList = new StringBuilder()
.AppendLine("----------------------------------------");
for (int i = 0; i < TaskList.Count; i++)
{
taskList.AppendLine($"{i + 1}. {TaskList[i]}");
}
taskList.AppendLine("----------------------------------------");
Console.WriteLine(taskList);
}
}
}
public enum Menu
{
AddOnList = 1,
RemoveTask = 2,
ListOnScreen = 3,
ExitMenu = 4
}
}
Alfredo Olmedo
Encima, si lo vas usar varias veces conviertelo en Función
Felipe Naranjo
así me quedó la función xd
public static void ShowTaskList()
{
ShowMenuTaskList();
}