Упражнение. Создание повторно используемых методов
- 10 мин
При разработке приложений вы можете найти себя написать код, чтобы сделать то же самое снова и снова. Вместо написания дубликата кода метод для выполнения той же задачи сокращает код и помогает быстрее разрабатывать приложения. В этом упражнении вы определите повторяющийся код и замените его повторно используемым методом. Давайте приступим!
Определение дублированного кода
В этой задаче вы изучите приложение, которое отслеживает время лечения в разных часовых поясах. Пользователь вводит текущий часовой пояс и часовой пояс назначения. Их расписание лекарств отображается, а затем корректируется для нового часового пояса.
В редакторе Visual Studio Code удалите существующий код из предыдущих упражнений.
Скопируйте и вставьте следующий код в редактор 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();Обратите внимание, что существует несколько
forциклов, повторяющихся с одинаковым кодом.Существует два
foreachцикла, которые форматируются и отображают время медицины. Существует еще дваforцикла, которые корректируют время в соответствии с разницей часового пояса.При написании кода можно найти повторяющиеся блоки кода для выполнения той же задачи. Это идеальная возможность консолидировать код с помощью метода для выполнения задачи. Давайте практикуем!
Создание методов для выполнения повторяющихся задач
Теперь, когда вы определили повторяющийся код, можно создать метод для хранения кода и удаления дубликатов. Использование методов дает дополнительный бонус за сокращение кода и улучшение удобочитаемости! Циклы foreach форматирует и отображает значения времени, поэтому можно дать методу имя, которое четко отражает эту задачу. Вы можете сделать то же самое с циклом for , который корректирует время. Давайте приступим!
Введите новую пустую строку кода в конце предыдущего кода.
В новой пустой строке кода создайте сигнатуру метода, введя следующий код:
void DisplayTimes() { }Чтобы определить текст метода, обновите
DisplayTimesметод путем копирования и вставкиforeachблока следующим образом: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(); }В этом методе вы включаете вызов
Console.WriteLineв конец, чтобы добавить новую строку после отображения времени. Затем вы создадите другой метод для настройки времени в соответствии с разницей часового пояса.Введите новую пустую строку кода в конце предыдущего кода.
В новой пустой строке кода создайте сигнатуру метода, введя следующий код:
void AdjustTimes() { }AdjustTimesОбновите метод путем копирования и вставкиforцикла следующим образом: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; } }
Шаг 3. Вызов методов
В этой задаче вы удалите повторяющиеся блоки кода и замените их вызовами созданных методов.
Найдите первый экземпляр повторяющегося
foreachцикла в комментарии "Формат и отображение времени медицины":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Замените код, который вы определили вызовом
DisplayTimesметода. Замена должна привести к следующему коду:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");Затем вы замените второй экземпляр повторяющегося кода.
Найдите второй экземпляр
foreachцикла под комментарием "Формат и отображение времени медицины":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Замените код, который вы определили вызовом
DisplayTimesметода. Замена должна привести к следующему коду:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Обратите внимание, что использование метода вместо большого блока кода обеспечивает более четкость и упрощает понимание кода. Давайте сделаем то же самое с созданным методом
AdjustTimes.Найдите следующий код с повторяющимися
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; } }Замените экземпляры повторяющегося кода в комментарии "Изменить время, добавив разницу" вызовами
AdjustTimesметода. Замена должна привести к следующему коду: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(); }Теперь все повторяющиеся коды заменены новым методом. Обратите внимание, сколько более читаемого и краткого вида кода!
Проверка работы
В этой задаче вы запустите приложение из интегрированного терминала и убедитесь, что код работает правильно. Давайте начнем.
Сравните код со следующими способами, чтобы убедиться, что это правильно:
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; } }Сохраните работу с помощью ctrl + S или с помощью меню "Файл Visual Studio Code".
При необходимости откройте панель интегрированного терминала Visual Studio Code.
На панели обозревателя откройте терминал в папке TestProject, щелкните правой кнопкой мыши TestProject и выберите "Открыть в интегрированном терминале".
В командной строке терминала введите dotnet run
Введите -6 и +6 для запросов GMT.
Убедитесь, что код создает следующие выходные данные:
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:00Если код отображает различные результаты, необходимо просмотреть код, чтобы найти ошибку и внести обновления. Запустите код еще раз, чтобы узнать, устранена ли проблема. Продолжайте обновлять и запускать код, пока код не выдает ожидаемые результаты.