Ćwiczenie — tworzenie metod wielokrotnego użytku
- 10 min
Podczas opracowywania aplikacji możesz pisać kod, aby wykonać to samo. Zamiast pisać zduplikowany kod, użyj metody , aby wykonać to samo zadanie, skraca kod i pomaga w szybszym tworzeniu aplikacji. W tym ćwiczeniu zidentyfikujesz powtarzający się kod i zastąp go metodą wielokrotnego użytku. Zaczynamy!
Identyfikowanie zduplikowanego kodu
W tym zadaniu przyjrzysz się aplikacji, która śledzi czasy leków w różnych strefach czasowych. Użytkownik wprowadza bieżącą strefę czasową i docelową strefę czasową. Ich harmonogram leków jest wyświetlany, a następnie dostosowywany do nowej strefy czasowej.
W edytorze programu Visual Studio Code usuń dowolny istniejący kod z poprzednich ćwiczeń.
Skopiuj i wklej następujący kod do edytora programu 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();Zwróć uwagę, że istnieje kilka
forpętli powtarzanych przy użyciu identycznego kodu.Istnieją dwie
foreachpętle, które formatują i wyświetlają czasy medycyny. Istnieją kolejne dwieforpętle, które dopasowują czasy zgodnie z różnicą strefy czasowej.Podczas pisania kodu możesz samodzielnie powtarzać bloki kodu, aby wykonać to samo zadanie. Jest to idealna okazja do skonsolidowania kodu przy użyciu metody do wykonania zadania. Przećwiczmy!
Tworzenie metod wykonywania powtarzających się zadań
Po zidentyfikowaniu powtarzającego się kodu możesz utworzyć metodę zawierającą kod i usunąć duplikaty. Użycie metod ma dodatkowy bonus za skrócenie kodu i zwiększenie czytelności! Pętle foreach formatuje i wyświetlają wartości czasu, dzięki czemu można nadać metodzie nazwę, która wyraźnie odzwierciedla to zadanie. Można to zrobić za pomocą for pętli, która dostosowuje czasy. Zaczynamy!
Wprowadź nowy pusty wiersz kodu na końcu poprzedniego kodu.
W nowym pustym wierszu kodu utwórz podpis metody, wprowadzając następujący kod:
void DisplayTimes() { }Aby zdefiniować treść metody, zaktualizuj metodę
DisplayTimes, kopiując i wklejającforeachblok w następujący sposób: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(); }W tej metodzie dołącz wywołanie metody na
Console.WriteLinekońcu, aby dołączyć nowy wiersz po wyświetleniu czasu. Następnie utworzysz inną metodę, aby dostosować czasy zgodnie z różnicą strefy czasowej.Wprowadź nowy pusty wiersz kodu na końcu poprzedniego kodu.
W nowym pustym wierszu kodu utwórz podpis metody, wprowadzając następujący kod:
void AdjustTimes() { }Zaktualizuj metodę,
AdjustTimeskopiując i wklejając pętlęforw następujący sposób: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; } }
Krok 3. Wywoływanie metod
W tym zadaniu usuniesz powtarzające się bloki kodu i zastąpisz je wywołaniami utworzonych metod.
Znajdź pierwsze wystąpienie powtarzanej
foreachpętli w komentarzu "Format and display medicine times":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Zastąp kod zidentyfikowany wywołaniem
DisplayTimesmetody . Zastąpienie powinno spowodować następujący kod:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");Następnie zastąpisz drugie wystąpienie powtarzającego się kodu.
Znajdź drugie wystąpienie
foreachpętli w komentarzu "Format and display medicine times":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Zastąp kod zidentyfikowany wywołaniem
DisplayTimesmetody . Zastąpienie powinno spowodować następujący kod:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Zwróć uwagę, że użycie metody zamiast dużego bloku kodu zapewnia większą przejrzystość i ułatwia zrozumienie kodu. Zróbmy to samo za pomocą utworzonej
AdjustTimesmetody.Znajdź następujący kod ze zduplikowanymi
forpętlami -loops: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; } }Zastąp wystąpienia powtarzającego się kodu w komentarzu "Dostosuj czasy, dodając różnicę" wywołaniami metody
AdjustTimes. Zastąpienie powinno spowodować następujący kod: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(); }Teraz cały zduplikowany kod został zastąpiony przez nową metodę. Zwróć uwagę na to, ile bardziej czytelnego i zwięzłego wyglądu kodu.
Sprawdź swoją pracę
W tym zadaniu uruchomisz aplikację ze zintegrowanego terminalu i sprawdzisz, czy kod działa poprawnie. Zacznijmy.
Porównaj kod z następującymi elementami, aby upewnić się, że jest on poprawny:
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; } }Zapisz swoją pracę przy użyciu Ctrl + S lub za pomocą menu Plik programu Visual Studio Code.
W razie potrzeby otwórz panel Zintegrowanego Terminala Visual Studio Code.
W panelu EKSPLORATOR, aby otworzyć terminal w lokalizacji folderu TestProject, kliknij prawym przyciskiem myszy pozycję TestProject, a następnie wybierz polecenie Otwórz w zintegrowanym terminalu.
W wierszu polecenia terminalu wprowadź polecenie dotnet run
Wprowadź -6 i +6, aby wyświetlić monity GMT.
Sprawdź, czy kod generuje następujące dane wyjściowe:
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:00Jeśli kod wyświetla różne wyniki, musisz przejrzeć kod, aby znaleźć błąd i wprowadzić aktualizacje. Uruchom ponownie kod, aby sprawdzić, czy problem został rozwiązany. Kontynuuj aktualizowanie i uruchamianie kodu, dopóki kod nie generuje oczekiwanych wyników.