Cvičení – vytváření opakovaně použitelných metod
- 10 min
Při vývoji aplikací se může stát, že píšete kód, abyste to udělali znovu a znovu. Místo psaní duplicitního kódu se pomocí metody ke stejnému úkolu zkracuje kód a pomáhá rychleji vyvíjet aplikace. V tomto cvičení identifikujete opakovaný kód a nahradíte ho opakovaně použitelnou metodou. Pojďme začít!
Identifikace duplicitního kódu
V této úloze se podíváte na aplikaci, která sleduje dobu léčby v různých časových pásmech. Uživatel zadá aktuální časové pásmo a cílové časové pásmo. Jejich plán léků se zobrazí a pak se upraví pro nové časové pásmo.
V editoru Visual Studio Code odstraňte veškerý existující kód z předchozích cvičení.
Zkopírujte a vložte následující kód do editoru 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();Všimněte si, že existuje několik
forsmyček -, které se opakují s identickým kódem.Existují dvě
foreachsmyčky, které formátují a zobrazují časy léku. Existují další dvěforsmyčky, které upravují časy podle rozdílu časového pásma.Při psaní kódu se může stát, že opakujete bloky kódu, abyste udělali stejný úkol. To je dokonalá příležitost ke konsolidaci kódu pomocí metody k provedení úlohy. Pojďme si to procvičit!
Vytvoření metod pro provádění opakovaných úloh
Teď, když jste identifikovali opakovaný kód, můžete vytvořit metodu, která bude obsahovat kód a odebrat duplicity. Použití metod má přidaný bonus pro zkrácení kódu a zlepšení čitelnosti! Smyčky foreach formátují a zobrazují časové hodnoty, takže můžete metodě dát název, který jasně odráží daný úkol. To samé můžete udělat se smyčkou for , která časy upravuje. Pojďme začít!
Zadejte nový prázdný řádek kódu na konci předchozího kódu.
Na novém prázdném řádku kódu vytvořte podpis metody zadáním následujícího kódu:
void DisplayTimes() { }Chcete-li definovat tělo metody, aktualizujte metodu
DisplayTimeszkopírováním a vloženímforeachbloku následujícím způsobem: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(); }V této metodě zahrnete volání
Console.WriteLinena konec pro připojení nového řádku po zobrazení časů. V dalším kroku vytvoříte další metodu, která upraví časy podle rozdílu časového pásma.Zadejte nový prázdný řádek kódu na konci předchozího kódu.
Na novém prázdném řádku kódu vytvořte podpis metody zadáním následujícího kódu:
void AdjustTimes() { }Aktualizujte metodu
AdjustTimeszkopírováním a vloženímforsmyčky následujícím způsobem: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: Volání metod
V tomto úkolu odstraníte opakované bloky kódu a nahradíte je voláními metod, které jste vytvořili.
Vyhledejte první instanci opakované
foreachsmyčky pod komentářem "Formát a zobrazení doby medicíny":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Nahraďte kód, který jste identifikovali voláním
DisplayTimesmetody. Nahrazení by mělo mít za následek následující kód:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");V dalším kroku nahradíte druhou instanci opakovaného kódu.
Vyhledejte druhou instanci
foreachsmyčky pod komentářem "Formát a zobrazení doby medicíny":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Nahraďte kód, který jste identifikovali voláním
DisplayTimesmetody. Nahrazení by mělo mít za následek následující kód:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Všimněte si, že použití metody místo velkého bloku kódu poskytuje lepší přehlednost a usnadňuje pochopení kódu. Pojďme to udělat stejně s metodou,
AdjustTimeskterou jste vytvořili.Vyhledejte následující kód s duplicitními
forsmyčkami -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; } }Nahraďte instance opakovaného kódu pod komentářem "Upravit čas přidáním rozdílu" voláním metody
AdjustTimes. Nahrazení by mělo mít za následek následující kód: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(); }Nyní byl veškerý duplicitní kód nahrazen novou metodou. Všimněte si, kolik čitelnějších a stručných informací váš kód vypadá!
Kontrola práce
V této úloze spustíte aplikaci z integrovaného terminálu a ověříte, že váš kód funguje správně. Pojďme začít.
Porovnejte kód s následujícím kódem, abyste měli jistotu, že je správný:
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; } }Uložte práci pomocí ctrl + S nebo pomocí nabídky Soubor editoru Visual Studio Code.
V případě potřeby otevřete integrovaný panel terminálu editoru Visual Studio Code.
Na panelu PRŮZKUMNÍK otevřete terminál v umístění složky TestProject, klikněte pravým tlačítkem myši na TestProject a pak vyberte Otevřít v integrovaném terminálu.
Na příkazovém řádku terminálu zadejte příkaz dotnet run.
Zadejte -6 a +6 pro výzvy GMT.
Ověřte, že váš kód vytvoří následující výstup:
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:00Pokud váš kód zobrazuje různé výsledky, budete muset zkontrolovat kód, abyste našli chybu a aktualizovali ji. Spusťte kód znovu, abyste zjistili, jestli jste problém vyřešili. Pokračujte v aktualizaci a spouštění kódu, dokud váš kód nevygeneruje očekávané výsledky.