Webbserverprogrammering 1 · område 2 · lektion 9
Tre kodstycken med fel
Tre metoder. Alla tre kompilerar. Två av dem ger fel svar utan att säga något, och den tredje fungerar tills någon skickar in ett värde den inte tänkt på. Din uppgift är att hitta felen genom att jämföra vad koden säger med vad den borde säga.
Klassen arbetade i par i tjugo minuter innan något avslöjades. Ge dig själv lika lång tid. Rättningarna ligger dolda i tabeller du klickar på – de är inte värda mycket förrän du har ett eget svar att jämföra med.
Vill du köra koden: lägg filen nedan i ditt projekts
Components/Pages/ och gå till /fel.
1. Koden
Hela filen, som den ser ut. Läs den innan du läser avsnitten under.
@page "/fel"
<h1>Tre kodstycken</h1>
<h2>A</h2>
<p>14 år: @A(14) · 15 år: @A(15) · 16 år: @A(16)</p>
<h2>B</h2>
<p>Betyg 5: @B(5) · Betyg 3: @B(3) · Betyg 1: @B(1)</p>
<h2>C</h2>
<p>Dag 1: @C(1) · Dag 5: @C(5)</p>
@code {
private string A(int alder)
{
if (alder > 15)
{
return "får se filmen";
}
else
{
return "för ung";
}
}
private string B(int betyg)
{
string svar = "";
if (betyg >= 4) { svar = "bra"; }
if (betyg >= 2) { svar = "godkänt"; }
if (betyg >= 1) { svar = "svagt"; }
return svar;
}
private string C(int nr) => nr switch
{
1 => "måndag",
2 => "tisdag",
3 => "onsdag",
4 => "torsdag",
5 => "fredag"
};
}
Sidan visar det här:
| Metod | Vad sidan skriver ut |
|---|---|
| A | 14 år: för ung · 15 år: för ung · 16 år: får se filmen |
| B | Betyg 5: svagt · Betyg 3: svagt · Betyg 1: svagt |
| C | Dag 1: måndag · Dag 5: fredag |
2. A – gränsfallet
Åldersgränsen är 15 år. Den som fyllt 15 ska få se filmen.
Kompilatorn säger ingenting, och två av tre testvärden ger rätt svar. Det är precis därför felet överlever. Vilket testvärde avslöjar det?
| Fråga | Svar |
|---|---|
| Vilket testvärde avslöjar felet? | 15. Det är det enda som ligger precis på gränsen. |
| Vad är fel? | Villkoret är alder > 15. Det släpper bara igenom 16 och uppåt. |
| Rättningen | >= i stället för >. |
3. B – tre if som alla kör
Alla tre anropen ger samma svar. Resultatet är så uppenbart fel att ingen tror på koden – men orsaken är inte uppenbar alls.
Frågan att svara på först: varför blev det just "svagt", och inte "bra"?
| Fråga | Svar |
|---|---|
| Varför blir svaret alltid detsamma? | Villkoren överlappar. Betyg 5 uppfyller alla tre. |
| Varför just "svagt"? | Varje if skriver över svar. Den sista tilldelningen vinner. |
| Rättningen | else if, så att kedjan slutar vid första sanna villkoret. Eller return direkt i varje gren i stället för att tilldela. |
4. C – switchen som inte täcker allt
Den här är annorlunda: kompilatorn varnar.
warning CS8509: The switch expression does not handle all possible values of its input type (it is not exhaustive). For example, the pattern '0' is not covered.
Sidan fungerar ändå, så länge bara 1–5 skickas in. Ändra ett anrop till
C(9) och ladda om.
| Fråga | Svar |
|---|---|
Vad händer vid C(9)? | Sidan svarar 500 och terminalen säger System.Runtime.CompilerServices.SwitchExpressionException. |
| Vad saknas? | Grenen för allt annat. |
| Rättningen | Lägg till _ => "okänd dag". |
5. Poängen
Ordningen är avsiktlig. A ger fel svar i ett enda gränsfall. B ger fel svar alltid. C ger rätt svar tills det inte gör det. Tillsammans täcker de tre olika sorters buggar.
C är den enda kompilatorn försökte varna för. Den hade redan sagt exakt vad som skulle hända, i förväg, och det gick att bygga ändå. Hur många varningar har du i ditt eget projekt just nu?
På provet kommer en fråga av typen vad är fel – ett kodstycke som kompilerar men gör fel sak. De tre här är mönstret för den frågetypen. Se vad provet prövar.