Избавьтесь от дублирующегося кода “Списки дел”

У нас есть программа, которая представляет из себя список дел сгруппированных по трём категориям. Пользователь может добавлять во все три категории дела. Необходимо избавиться от дублирующегося кода.

using System;
using System.Threading;
 
namespace TODOList
{
    class Program
    {
        static void Main(string[] args)
        {
            string[]  goalsIndividual = new string[0], goalsWork = new string[0], goalsFamilly = new string[0];
 
            while (true)
            {
                Console.Clear();
                //поиск длинны самого длинного списка на данный момент
                int max = goalsIndividual.Length > goalsWork.Length ? goalsIndividual.Length : goalsWork.Length;
                max = max > goalsFamilly.Length ? max : goalsFamilly.Length;
 
                Console.WriteLine("Личный | Рабочий | Семейный");
                for (int i = 0; i < max; i++)
                {
                    if (goalsIndividual.Length > i)
                    {
                        Console.Write(goalsIndividual[i] + " | ");
                    }
                    else
                    {
                        Console.Write("Empty | ");
                    }
 
                    if (goalsWork.Length > i)
                    {
                        Console.Write(goalsWork[i] + " | ");
                    }
                    else
                    {
                        Console.Write("Empty | ");
                    }
 
                    if (goalsFamilly.Length > i)
                    {
                        Console.Write(goalsFamilly[i] + " | ");
                    }
                    else
                    {
                        Console.Write("Empty | ");
                    }
                    Console.WriteLine();
                }
 
                Console.WriteLine("Куда вы хотите добавить цель?");
                string listName = Console.ReadLine().ToLower(); //то что введёт пользователь переведённое в нижний регистр
                Console.WriteLine("Что это за цель?");
                string goal = Console.ReadLine();
 
                //Здесь нельзя использовать Array.Resize
                if (listName == "личный")
                {
                    string[] goalsIndividualNew = new string[goalsIndividual.Length + 1];
                    for (int j = 0; j < goalsIndividual.Length; j++)
                    {
                        goalsIndividualNew[j] = goalsIndividual[j];
                    }
                    goalsIndividualNew[goalsIndividualNew.Length - 1] = goal;
                    goalsIndividual = goalsIndividualNew;
                }
                else if (listName == "рабочий")
                {
                    string[] goalsWorkNew = new string[goalsWork.Length + 1];
                    for (int j = 0; j < goalsWork.Length; j++)
                    {
                        goalsWorkNew[j] = goalsWork[j];
                    }
                    goalsWorkNew[goalsWorkNew.Length - 1] = goal;
                    goalsWork = goalsWorkNew;
                }
                else if (listName == "семейный")
                {
                    string[] goalsFamillyNew = new string[goalsFamilly.Length + 1];
                    for (int j = 0; j < goalsFamilly.Length; j++)
                    {
                        goalsFamillyNew[j] = goalsFamilly[j];
                    }
                    goalsFamillyNew[goalsFamillyNew.Length - 1] = goal;
                    goalsFamilly = goalsFamillyNew;
                }
            }
        }
 
    }
}

Решение:

P.S. Обратите внимание, как я поступил с запутанным кодом определения самого длинного списка.

using System;

namespace TODOList
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] goalsIndividual = new string[0], goalsWork = new string[0], goalsFamilly = new string[0];

            while (true)
            {
                Console.Clear();

                DrawTable(goalsIndividual, goalsWork, goalsFamilly);

                ShowAddNewGoalForm(ref goalsIndividual, ref goalsWork, ref goalsFamilly);
            }
        }

        private static void ShowAddNewGoalForm(ref string[] goalsIndividual, ref string[] goalsWork, ref string[] goalsFamilly)
        {
            Console.WriteLine("Куда вы хотите добавить цель?");
            string listName = Console.ReadLine().ToLower(); //то что введёт пользователь переведённое в нижний регистр
            Console.WriteLine("Что это за цель?");
            string goal = Console.ReadLine();

            if (listName == "личный")
            {
                AddGoal(ref goalsIndividual, goal);
            }
            else if (listName == "рабочий")
            {
                AddGoal(ref goalsWork, goal);
            }
            else if (listName == "семейный")
            {
                AddGoal(ref goalsFamilly, goal);
            }
        }

        private static void DrawTable(string[] goalsIndividual, string[] goalsWork, string[] goalsFamilly)
        {
            int max = GetMaxLength(goalsIndividual, goalsWork, goalsFamilly);

            Console.WriteLine("Личный | Рабочий | Семейный");
            for (int i = 0; i < max; i++)
            {
                TryDrawGoal(goalsIndividual, i);
                TryDrawGoal(goalsWork, i);
                TryDrawGoal(goalsFamilly, i);

                Console.WriteLine();
            }
        }

        private static void AddGoal(ref string[] category, string goal)
        {
            string[] categoryNew = new string[category.Length + 1];
            for (int j = 0; j < category.Length; j++)
            {
                categoryNew[j] = category[j];
            }
            categoryNew[categoryNew.Length - 1] = goal;
            category = categoryNew;
        }
        
        private static void TryDrawGoal(string[] category, int index)
        {
            if (category.Length > index)
            {
                Console.Write(category[index] + " | ");
            }
            else
            {
                Console.Write("Empty | ");
            }
        }

        private static int GetMaxLength(params string[][] arrays)
        {
            int max = 0;
            foreach (var array in arrays)
            {
                if (array.Length > max)
                {
                    max = array.Length;
                }
            }

            return max;
        }
    }
}

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *