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 reduz 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ê examinará um aplicativo que controla os tempos de medicação em diferentes fusos horários. O usuário insere o fuso horário atual e o fuso horário de destino. Seu agendamento de medicamentos é exibido e ajustado para o novo fuso horário.
No Editor do Visual Studio Code, exclua qualquer código existente dos exercícios anteriores.
Copie e cole o seguinte código no Editor do 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();Observe que há vários
forloops que são repetidos com código idêntico.Há dois
foreachloops que formatar e exibir os tempos de medicina. Há outros doisforloops que ajustam os horários de acordo com a diferença de fuso horário.Ao escrever código, você pode se encontrar 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 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 reduzir 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 horários. 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 o bloco daforeachseguinte 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 ao
Console.WriteLinefinal para acrescentar uma nova linha após a exibição dos horários. 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 o loop daforseguinte 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 repetidos de código e os substituirá por chamadas aos 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 que você identificou 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
foreachloop sob o comentário "Formatar e exibir tempos de medicina":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Substitua o código que você identificou 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 no comentário "Ajustar os horários adicionando a diferença" por chamadas ao 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 novo método. Observe a aparência mais legível e concisa do código!
Verificar seu trabalho
Nesta tarefa, você executará o aplicativo no Terminal Integrado e verificará se o código está funcionando corretamente. Vamos começar.
Compare o código com o seguinte para garantir que ele 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 do Visual Studio Code.
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, insira dotnet run
Insira -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 exibir resultados diferentes, você precisará examinar 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.