Esercizio - Creare metodi riutilizzabili
- 10 minuti
Durante lo sviluppo di applicazioni, è possibile che si scriva codice per eseguire la stessa operazione più volte. Invece di scrivere codice duplicato, l'uso di un metodo per eseguire la stessa attività abbrevia il codice e consente di sviluppare applicazioni più velocemente. In questo esercizio si identifichi il codice ripetuto e lo si sostituirà con un metodo riutilizzabile. È ora di iniziare.
Identificare il codice duplicato
In questa attività si esaminerà un'applicazione che tiene traccia dei tempi dei farmaci in fusi orari diversi. L'utente immette il fuso orario corrente e il fuso orario di destinazione. Il loro programma di farmaci viene visualizzato e quindi regolato per il nuovo fuso orario.
Nell'editor di Visual Studio Code eliminare qualsiasi codice esistente dagli esercizi precedenti.
Copiare e incollare il codice seguente nell'editor di 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();Si noti che sono presenti diversi cicli
forripetuti con codice identico.Sono presenti due cicli
foreachche formattano e visualizzano gli orari di assunzione. Esistono altri dueforcicli che regolano gli orari in base alla differenza di fuso orario.Durante la scrittura di codice, potresti trovarti a ripetere blocchi di codice per eseguire la stessa attività. Si tratta di un'opportunità perfetta per consolidare il codice usando un metodo per eseguire l'attività. Facciamo pratica!
Creare metodi per eseguire le attività ripetute
Dopo aver identificato codice ripetuto, è possibile creare un metodo per contenere il codice e rimuovere i duplicati. L'uso dei metodi offre il vantaggio di abbreviare il codice e migliorare la leggibilità. I foreach cicli formattano e visualizzano i valori dell'ora, in modo da poter assegnare al metodo un nome che rifletta chiaramente tale attività. È possibile eseguire la stessa operazione con il for ciclo che regola i tempi. È ora di iniziare.
Immettere una nuova riga di codice vuota alla fine del codice precedente.
Nella nuova riga di codice vuota creare una firma del metodo immettendo il codice seguente:
void DisplayTimes() { }Per definire il corpo del metodo, aggiornare il
DisplayTimesmetodo copiando e incollando ilforeachblocco nel modo seguente: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(); }In questo metodo si include la chiamata a
Console.WriteLinealla fine per aggiungere una nuova riga dopo la visualizzazione degli orari. Successivamente, si creerà un altro metodo per regolare gli orari in base alla differenza di fuso orario.Immettere una nuova riga di codice vuota alla fine del codice precedente.
Nella nuova riga di codice vuota creare una firma del metodo immettendo il codice seguente:
void AdjustTimes() { }Aggiornare il
AdjustTimesmetodo copiando e incollando ilforciclo nel modo seguente: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; } }
Passaggio 3: Chiamare i metodi
In questa attività si elimineranno i blocchi ripetuti di codice e li si sostituirà con le chiamate ai metodi creati.
Individuare la prima istanza del ciclo ripetuto
foreachnel commento "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");Sostituire il codice identificato con una chiamata al
DisplayTimesmetodo . La sostituzione dovrebbe comportare il codice seguente:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");Successivamente, si sostituirà la seconda istanza del codice ripetuto.
Individuare la seconda istanza del ciclo
foreachnel commento "Format and display medicine times":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Sostituire il codice identificato con una chiamata al
DisplayTimesmetodo . La sostituzione dovrebbe comportare il codice seguente:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Si noti che l'uso di un metodo al posto di un blocco di codice di grandi dimensioni offre maggiore chiarezza e semplifica la comprensione del codice. Si eseguirà la stessa operazione con il
AdjustTimesmetodo creato.Individuare il codice seguente con i cicli
forduplicati: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; } }Sostituire le istanze di codice ripetute sotto il commento "Regolare i tempi aggiungendo la differenza" con chiamate al metodo
AdjustTimes. La sostituzione dovrebbe comportare il codice seguente: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(); }Ora tutto il codice duplicato è stato sostituito dal nuovo metodo. Si noti quanto sia più leggibile e conciso l'aspetto del codice.
Controllare il lavoro svolto
In questa attività si eseguirà l'applicazione dal terminale integrato e si verificherà che il codice funzioni correttamente. Iniziamo.
Confrontare il codice con quanto segue per assicurarsi che sia corretto:
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; } }Salvare il lavoro usando CTRL + S o il menu File di Visual Studio Code.
Se necessario, aprire il pannello Terminale integrato di Visual Studio Code.
Nel pannello EXPLORER, per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.
Al prompt dei comandi del terminale immettere dotnet run
Immettere -6 e +6 per le richieste GMT.
Verificare che il codice produca l'output seguente:
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:00Se il codice visualizza risultati diversi, è necessario esaminarlo per trovare l'errore e apportare aggiornamenti. Eseguire di nuovo il codice per verificare se il problema è stato risolto. Continuare ad aggiornare ed eseguire il codice finché non produce i risultati previsti.