Øvelse – Opret metoder, der kan genbruges
- 10 minutter
Når du udvikler applikationer, kan du finde dig selv i at skrive kode for at gøre det samme igen og igen. I stedet for at skrive duplikeret kode, forkorter brug af en metode til at udføre den samme opgave din kode og hjælper dig med at udvikle applikationer hurtigere. I denne øvelse skal du identificere gentagen kode og erstatte den med en genanvendelig metode. Lad os komme i gang!
Identificer duplikeret kode
I denne opgave skal du tage et kig på et program, der sporer medicintider på tværs af forskellige tidszoner. Brugeren indtaster sin aktuelle tidszone og sin destinationstidszone. Deres medicinplan vises og justeres derefter til den nye tidszone.
Slet eventuel eksisterende kode fra de forrige øvelser i Visual Studio Code Editor.
Kopiér og indsæt følgende kode i Visual Studio Code Editor:
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();Bemærk, at der er flere
for-løkker, der gentages med identisk kode.Der er to
foreachsløjfer, der formaterer og viser medicintiderne. Der er yderligere toforsløjfer, der justerer tiderne i henhold til tidszoneforskellen.Når du skriver kode, kan du finde dig selv i at gentage kodeblokke for at udføre den samme opgave. Det er en perfekt mulighed for at konsolidere din kode ved at bruge en metode til at udføre opgaven i stedet. Lad os øve!
Opret metoder til at udføre de gentagne opgaver
Nu, hvor du har identificeret gentagen kode, kan du oprette en metode til at indeholde koden og fjerne dubletterne. Brug af metoder har den ekstra bonus, at det forkorter din kode og forbedrer læsbarheden! Sløjferne foreach formaterer og viser tidsværdierne, så du kan give metoden et navn, der tydeligt afspejler den pågældende opgave. Du kan gøre det samme med løkken for , der justerer tiderne. Lad os komme i gang!
Angiv en ny tom kodelinje i slutningen af den forrige kode.
Opret en metodesignatur på den nye tomme kodelinje ved at angive følgende kode:
void DisplayTimes() { }Hvis du vil definere metodeteksten, skal du opdatere
DisplayTimesmetoden ved at kopiere og indsætte blokkenforeachpå følgende måde: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(); }I denne metode medtager du opkaldet til
Console.WriteLinei slutningen for at tilføje en ny linje, når tiderne er vist. Dernæst opretter du en anden metode til at justere tiderne i henhold til tidszoneforskellen.Angiv en ny tom kodelinje i slutningen af den forrige kode.
Opret en metodesignatur på den nye tomme kodelinje ved at angive følgende kode:
void AdjustTimes() { }Opdater
AdjustTimesmetoden ved at kopiere og indsætte løkkenforpå følgende måde: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; } }
Trin 3: Kald metoderne
I denne opgave skal du slette de gentagne kodeblokke og erstatte dem med kald til de metoder, du har oprettet.
Find den første forekomst af den gentagne
foreachsløjfe under kommentaren "Formater og vis medicintider":Console.WriteLine("Current Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine(); Console.WriteLine("Enter new GMT");Erstat den kode, du har identificeret, med et kald til
DisplayTimesmetoden. Udskiftningen skal resultere i følgende kode:Console.WriteLine("Current Medicine Schedule:"); DisplayTimes(); Console.WriteLine("Enter new GMT");Derefter skal du erstatte den anden forekomst af den gentagne kode.
Find den anden forekomst af løkken
foreachunder kommentaren "Formater og vis medicintider":Console.WriteLine("New Medicine Schedule:"); /* Format and display medicine times */ foreach (int val in times) { ... } Console.WriteLine();Erstat den kode, du har identificeret, med et kald til
DisplayTimesmetoden. Udskiftningen skal resultere i følgende kode:Console.WriteLine("New Medicine Schedule:"); DisplayTimes();Bemærk, hvordan brug af en metode i stedet for en stor kodeblok giver mere klarhed og gør koden lettere at forstå. Lad os gøre det samme med den metode,
AdjustTimesdu oprettede.Find følgende kode med de duplikerede
for-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; } }Erstat forekomsterne af gentaget kode under kommentaren "Juster tiderne ved at tilføje forskellen" med opkald til din
AdjustTimesmetode. Udskiftningen skal resultere i følgende kode: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(); }Nu er al den duplikerede kode blevet erstattet af din nye metode. Læg mærke til, hvor meget mere læsbar og kortfattet din kode ser ud!
Kontrollér dit arbejde
I denne opgave skal du køre dit program fra den integrerede terminal og kontrollere, at din kode fungerer korrekt. Lad os komme i gang.
Sammenlign din kode med følgende for at sikre, at den er korrekt:
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; } }Gem dit arbejde ved hjælp af Ctrl + S eller ved hjælp af menuen Filer i Visual Studio Code.
Åbn om nødvendigt Visual Studio Codes integrerede terminalpanel.
Højreklik på TestProjecti panelet EXPLORER for at åbne en Terminal på mappen TestProject, og vælg derefter Åbn i integreret terminal.
I kommandoprompten Terminal skal du angive dotnetkørsel
Indtast -6 og +6 for GMT-prompterne.
Kontrollér, at din kode producerer følgende output:
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:00Hvis din kode viser forskellige resultater, skal du gennemse din kode for at finde fejlen og foretage opdateringer. Kør koden igen for at se, om du har løst problemet. Fortsæt med at opdatere og køre din kode, indtil din kode giver de forventede resultater.
Test din viden
Feedback
Var denne side nyttig?
No
Har du brug for hjælp til dette emne?
Vil du prøve at bruge Ask Learn til at tydeliggøre eller guide dig gennem dette emne?