No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Principio DRY

7/14
Recursos

Aportes 12

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Principio DRY

DRY: Don鈥檛 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.

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("----------------------------------------");
        }

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 鈥淣o hay tareas por realizar鈥, por lo que no habria nada por borrar, yo solo le puse ShowTaskList(), es descriptivo y no repito codigo.

StringBuilder menu = new StringBuilder();
menu.AppendLine(鈥淪eleccione 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);
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. ```c# private static void PrintSeparator() { Console.WriteLine("----------------------------------------"); } ```
## 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: * **Mantenimiento ineficiente:** Dificultad para realizar cambios en el c贸digo. * **Errores repetitivos:** Mayor probabilidad de errores en diferentes partes del c贸digo. * **C贸digo dif铆cil de entender:** Dificultad para comprender el prop贸sito del c贸digo. **驴C贸mo aplicar el principio DRY?** * **Extraer c贸digo com煤n a m茅todos o clases.** * **Utilizar bucles y condicionales para evitar repeticiones.** * **Aprovechar las bibliotecas y frameworks existentes.** **Ejemplos de aplicaci贸n en C#:** * **Extraer un m茅todo para calcular el IVA.** * **Utilizar un bucle para recorrer una lista de elementos.** * **Utilizar una biblioteca para realizar operaciones matem谩ticas.**

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
    }
}

muy buena clase, ahora ultimo se ven muchos c贸digos con muchas funciones repetidas.

Encima, si lo vas usar varias veces conviertelo en Funci贸n
as铆 me qued贸 la funci贸n xd `public static void ShowTaskList() ` `{` ` ShowMenuTaskList(); ` `}`
````c# using System; using System.Collections.Generic; namespace ToDo { internal class Program { public static void ListTask(){ Console.WriteLine("----------------------------------------"); for (int i = 0; i < TaskList.Count; i++) { Console.WriteLine((i + 1) + ". " + TaskList[i]); } Console.WriteLine("----------------------------------------"); } public static List<string> TaskList { get; set; } static void Main(string[] args) { TaskList = 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) { ShowMenuTaskList(); } } while ((menu)menuSelected != 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 optionSelected = Console.ReadLine(); return Convert.ToInt32(optionSelected); } public static void ShowMenuRemove() { try { Console.WriteLine("Ingrese el n煤mero de la tarea a remover: "); // Show current taks ListTask(); string optionSelected = Console.ReadLine(); // Remove one position int indexToRemove = Convert.ToInt32(optionSelected) - 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 ShowMenuTaskList() { if (TaskList == null || TaskList.Count == 0) { Console.WriteLine("No hay tareas por realizar"); } else { ListTask(); } } } public enum menu { Add = 1, Remove = 2, List = 3, Exit = 4 } } ```using System;using System.Collections.Generic; namespace ToDo{聽 聽 internal class Program聽 聽 {聽 聽 聽 聽 public static void ListTask(){聽 聽 聽 聽 聽 聽 Console.WriteLine("----------------------------------------");聽 聽 聽 聽 聽 聽 聽 聽 for (int i = 0; i < TaskList.Count; i++)聽 聽 聽 聽 聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Console.WriteLine((i + 1) + ". " + TaskList\[i]);聽 聽 聽 聽 聽 聽 聽 聽 }聽 聽 聽 聽 聽 聽 聽 聽 Console.WriteLine("----------------------------------------");聽 聽 聽 聽 }聽 聽 聽 聽 public static List\<string> TaskList { get; set; } 聽 聽 聽 聽 static void Main(string\[] args)聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 TaskList = 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)聽 聽 聽 聽 聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ShowMenuTaskList();聽 聽 聽 聽 聽 聽 聽 聽 }聽 聽 聽 聽 聽 聽 } while ((menu)menuSelected != 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 optionSelected = Console.ReadLine();聽 聽 聽 聽 聽 聽 return Convert.ToInt32(optionSelected);聽 聽 聽 聽 } 聽 聽 聽 聽 public static void ShowMenuRemove()聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 try聽 聽 聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 聽 聽 Console.WriteLine("Ingrese el n煤mero de la tarea a remover: ");聽 聽 聽 聽 聽 聽 聽 聽 // Show current taks聽 聽 聽 聽 聽 聽 聽 聽 ListTask(); 聽 聽 聽 聽 聽 聽 聽 聽 string optionSelected = Console.ReadLine();聽 聽 聽 聽 聽 聽 聽 聽 // Remove one position聽 聽 聽 聽 聽 聽 聽 聽 int indexToRemove = Convert.ToInt32(optionSelected) - 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 ShowMenuTaskList()聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 if (TaskList == null || TaskList.Count == 0)聽 聽 聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 聽 聽 Console.WriteLine("No hay tareas por realizar");聽 聽 聽 聽 聽 聽 } 聽 聽 聽 聽 聽 聽 else聽 聽 聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 聽 ListTask(); 聽聽 聽 聽 聽 聽 聽 }聽 聽 聽 聽 }聽 聽 }聽 聽 public enum menu聽 聽 {聽 聽 聽 聽 Add = 1,聽 聽 聽 聽 Remove = 2,聽 聽 聽 聽 List = 3,聽 聽 聽 聽 Exit = 4聽 聽 }} ````

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
    }
}