Thursday, 18 December 2008

Luktfri kod

För någon vecka sedan fick jag boken Clean Code – A Handbook of Agile Software Craftmanship skriven av Robert C. Martin, eller Uncle Bob som han även kallas. Boken handlar alltså om att skriva ren och fin kod utan en massa code smells.

Efter att ha läst förord och inledning av boken tänkte jag försöka läsa några kapitel per vecka och anamma detta i kodningen av Invitational Tour systemet.  De tre första kapitlen heter Clean Code, Meaningful Names och Functions. Det första kapitlet, Clean Code handlar om bra och dålig kod, och några personer är intervjuade och får berätta om sin syn på saken. Det andra kapitlet redogör för att egentligen behövs ju inga kommentare i koden längre, eftersom nuförtiden kan man döpa variabel namn och funktioner till små uppsatser, i princip. Jag tycker i och för sig att man ska tänka på att inte skriva allt för långa namn, men en bra regel som nämns i boken är att döpa en variabel är som att döpa sitt barn. Nu har inte jag några barn, men jag kan nog förstå den vånda som föräldrar går igenom när dom ska komma på ett namn till sitt barn, och poängen är att variabelnamn verkligen ska tänkas igenom.

Att skriva en for-loop och använda det vanlig i:t som index är faktiskt förkastligt.

for (int i = 0; i < User.Count; i++)

Varför inte byta ut ‘i’ mot en förklarande variabel? Det blir ju så mycket snyggare

for (int userIndex = 0; i < User.Count; userIndex++)

Något annar som beskrivs i kapitel 3, Functions, är att en funktion ska göra en sak, och endast en sak. Detta tänkte jag nu implmentera i systemet, det gör det ju så mycket enklare och unit testa, och koden blir mer hanterbar och överskådlig.

I ett fönster där man ska redigera en golfspelare vill jag sätta texten på fönstret till “Ny spelare - [Spelarnamn]” alternativt “Redigera spelare [Spelarnamn]. Tidigare skrev jag funktionen för det enligt nedan:

   1:  private void setWindowTitle()
   2:          {
   3:              if(CurrentUser.IsNew)
   4:              {
   5:                  this.Title = String.Format("Ny spelare - {0}{1}", CurrentUser.Name, CurrentUser.IsDirty ? "*" : "");
   6:              }
   7:              else
   8:              {
   9:                  this.Title = String.Format("Reigera spelare - {0}{1}", CurrentUser.Name, CurrentUser.IsDirty ? "*" : "");
  10:              }
  11:          }

Denna funktion gör ju faktiskt tre saker!
1) Den avgör om spelaren är ny eller befintlig
2) Om den är  ny sätter den texten för ny spelare
3) Om det en befintlig spelare sätter den texten för en befintlig spelare.

Alltså skapar jag iställer tre funktioner, som var och en utför en av ovanstående listade åtgärder.

   1:  private void setWindowTitle()
   2:          {
   3:              if(CurrentUser.IsNew)
   4:              {
   5:                  setWindowTitleForNewUser();
   6:              }
   7:              else
   8:              {
   9:                  setWindowTitleForUserInEditMode();
  10:              }
  11:          }
  12:          private void setWindowTitleForNewUser()
  13:          {
  14:              this.Title = String.Format("Ny spelare 
- {0}{1}"
, CurrentUser.Name, CurrentUser.IsDirty ? "*" :
"");
  15:          }
  16:          private void setWindowTitleForUserInEditMode()
  17:          {
  18:              this.Title = String.Format
("Redigera spelare - {0}{1}", CurrentUser.Name,
CurrentUser.IsDirty ? "*" : "");
  19:          }

Kapitel fyra och fem handlade om kommentarer och formattering, och där tycker jag sunt förnuft räcker långt, i kombination med vettig namngivning. Ovanstående funktioner behöver väl inga kommentarer? Varje funktion med String.Format kommer att refaktoreras!

Nästa kapitel heter Objects and Data structures, hoppas jag får tid att läsa om det snart!

Labels: ,

kick it on DotNetKicks.com

0 Comments:

Post a Comment

Links to this post:

Create a Link

<< Home