TDD
Det är verkligen svårt att komma ihåg principerna med Testdriven utveckling (Test Driven Development, TDD), jag får påminna mig själv hela tiden, men det är det absolut värt, som jag skrev i förra bloggposten.
Nu har jag startat med formuläret för att skapa en golfspelare. Layouten är simpel, det enda jag vill kunna spara till databasen, just nu, är namn, hcp, kön, golf-id, e-post och en bild.
Så vad är det första som ska hända när man klickar på spara? Jo, fälten ska valideras. Första fältet ut är namn, och det är här jag märker att jag får påminna mig om att tänka TDD.
Det första jag gjorde var att skapa ett test som heter CanValidateThatUserNameIsEntered enligt nedan.
[Test]
public void CanValidateThatUserNameIsEntered()
{
string userName = "";
Assert.That (Desktop.ViewHandlers.UserViewHandler.IsUserNameValid(userName), Is.EqualTo(false));
}
Detta skapade såklart ett kompileringsfel, eftersom funktionen IsUserNameValid inte finns, så jag skapar den och skriver följande kod.
public static bool IsUserNameValid(string userName)
{
if(userName.Trim().Length> 0 && userName.Trim().Length < 101)
return true;
return false;
}
Och det är här jag gör mitt första fel, bland fler. Koden kollar att namnet är längre än 0 (noll) tecken, men min vana trogen kollar den även att den inte är mindre än 101 tecken, dvs. max 100 tecken. (Maxlängd i databasen för namn.) Det är inte rätt, och inte TDD! Enligt TDD ska man koda tillräckligt för att klara testet! Alltså ska if-satsen skrivas som
if(userName.Trim().Length> 0)
return true;
Om jag vill testa att den inte är längre än 100 tecken så skriver jag ett nytt test som kontrollerar ENBART maxlängden, sen kan jag skriva en funktion som anropar båda dessa valideringar. Och vips har jag refaktorerat bort det andra felet! Originalfunktionen, enligt ovan, gör två saker, inte enbart EN sak. En funktion ska utföra EN sak och bara en sak!. Jag skrev om detta tidigare här
Det tredje felet upptäcker jag när jag skriver denna bloggpost. Funktionen heter IsUserNameValid, vilket jag inte tycker är ett bra funktionsnamn. Det luktar property lååååång väg! Funktionen kommer jag att döpa om till ValidateUserName.
Labels: Refaktorering, Ren kod, TDD
