Exercício - Criar métodos reutilizáveis
- 10 minutos
À medida que você desenvolve aplicativos, você pode se encontrar escrevendo código para fazer a mesma coisa repetidamente. Em vez de escrever código duplicado, usar um método para executar a mesma tarefa encurta seu código e ajuda você a desenvolver aplicativos mais rapidamente. Neste exercício, você identificará o código repetido e o substituirá por um método reutilizável. Vamos começar!
Identificar código duplicado
Nesta tarefa, você dará uma olhada em um aplicativo que rastreia os tempos de medicação em diferentes fusos horários. O usuário insere seu fuso horário atual e seu fuso horário de destino. O seu horário de medicação é apresentado e, em seguida, ajustado para o novo fuso horário.
No Editor de Códigos do Visual Studio, exclua qualquer código existente dos exercícios anteriores.
Copie e cole o seguinte código no Editor de Códigos do Visual Studio:
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();Observe que há vários
for-loops que são repetidos com código idêntico.Existem dois
foreachloops que formatam e exibem os tempos do medicamento. Existem outros doisforloops que ajustam os horários de acordo com a diferença de fuso horário.Ao escrever código, você pode se ver repetindo blocos de código para fazer a mesma tarefa. Essa é uma oportunidade perfeita para consolidar seu código usando um método para executar a tarefa. Vamos praticar!
Criar métodos para executar as tarefas repetidas
Agora que você identificou o código repetido, você pode criar um método para conter o código e remover as duplicatas. Usar métodos tem o bônus adicional de encurtar seu código e melhorar a legibilidade! Os foreach loops formatam e exibem os valores de tempo, para que você possa dar ao método um nome que reflita claramente essa tarefa. Você pode fazer o mesmo com o for loop que ajusta os tempos. Vamos começar!
Insira uma nova linha de código em branco no final do código anterior.
Na nova linha de código em branco, crie uma assinatura de método inserindo o seguinte código:
void DisplayTimes() { }Para definir o corpo do método, atualize o
DisplayTimesmétodo copiando e colando oforeachbloco da seguinte maneira: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(); }Nesse método, você inclui a chamada para
Console.WriteLineno final para acrescentar uma nova linha depois que os horários são exibidos. Em seguida, você criará outro método para ajustar os horários de acordo com a diferença de fuso horário.Insira uma nova linha de código em branco no final do código anterior.
Na nova linha de código em branco, crie uma assinatura de método inserindo o seguinte código:
void AdjustTimes() { }Atualize o
AdjustTimesmétodo copiando e colando oforloop da seguinte maneira: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; } }
Etapa 3: Chamar os métodos
Nesta tarefa, você excluirá os blocos de código repetidos e os substituirá por chamadas para os métodos criados.
Localize a primeira instância do loop repetido
foreachsob o comentário "Formatar e exibir tempos de medicina":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Substitua o código identificado por uma chamada para o
DisplayTimesmétodo. A substituição deve resultar no seguinte código:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");Em seguida, você substituirá a segunda instância do código repetido.
Localize a segunda instância do loop sob o comentário "Formatar e exibir tempos de
foreachmedicina":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Substitua o código identificado por uma chamada para o
DisplayTimesmétodo. A substituição deve resultar no seguinte código:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Observe como usar um método no lugar de um grande bloco de código fornece mais clareza e torna o código mais fácil de entender. Vamos fazer o mesmo com o
AdjustTimesmétodo que você criou.Localize o seguinte código com os -loops duplicados
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; } }Substitua as instâncias de código repetido sob o comentário "Ajustar os tempos adicionando a diferença" por chamadas para o seu
AdjustTimesmétodo. A substituição deve resultar no seguinte código: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(); }Agora, todo o código duplicado foi substituído pelo seu novo método. Observe o quão mais legível e conciso é o seu código!
Verifique o seu trabalho
Nesta tarefa, você executará seu aplicativo a partir do Terminal Integrado e verificará se seu código está funcionando corretamente. Vamos começar.
Compare seu código com o seguinte para garantir que esteja correto:
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; } }Salve seu trabalho usando Ctrl + S ou usando o menu Arquivo de código do Visual Studio.
Se necessário, abra o painel Terminal integrado do Visual Studio Code.
No painel EXPLORER, para abrir um Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.
No prompt de comando do Terminal, digite dotnet run
Digite -6 e +6 para os prompts GMT.
Verifique se o código produz a seguinte saída:
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 o código apresentar resultados diferentes, terá de rever o código para encontrar o erro e fazer atualizações. Execute o código novamente para ver se você corrigiu o problema. Continue atualizando e executando seu código até que seu código produza os resultados esperados.