Jednořádkové metody

1 min

TLDR: Obalit jeden řádek kódu metodou může být někdy užitečné.

Dokážete na první pohled říct, co tento kód dělá?

public IEnumerable<Products> GetProducts()
{
  //...
  var orderedProducts = products.OrderBy(x => !x.IsDisabled);
  //...
}    

products.OrderBy(x => !x.IsDisabled) přesune deaktivované produkty na konec seznamu. Není to nijak složité, ale na první pohled si nemusíme uvědomit, jak funguje řazení bool proměnných – dává se true na začátek a false na konec? Nebo je to naopak?

Abychom čtení kódu zjednodušili, můžeme použít jednořádkovou metodu:

public IEnumerable<Product> PlaceDisabledProductsAtTheEnd(
  this IEnumerable<Product> products)
{
  return products.OrderBy(x => !x.IsDisabled);
}

// Použití
var orderedProducts = products.PlaceDisabledProductsAtTheEnd();

Nyní kód lépe vystihuje, co se snažíme udělat.

Příklad 2: Házení kostkou

Programujeme hru, ve které se postavy pohybují podle hodu kostkou. Někde v aplikaci máme následující kód:

public void DoMove()
{
  //...
  var step = random.Next(1,7);
  //...
}

V tomto případě bychom také mohli generování čísla nahradit jednořádkovou metodou:

public int ThrowADice()
{
  return random.Next(1,7);
}

Touto metodou navádíme čtenáře, aby si představil reálné házení kostkou a tím i hru, kterou programujeme.

Smalltalk od Martina Fowlera

Další příklad uvádí Martin Fowler: “Smalltalk in those days ran on black-and-white systems. If you wanted to highlight some text or graphics, you would reverse the video. Smalltalk’s graphics class had a method for this called ‘highlight’, whose implementation was just a call to the method ‘reverse’. The name of the method was longer than its implementation - but that didn’t matter because there was a big distance between the intention of the code and its implementation.”

V C# by mohl tento příklad vypadat následovně:

public void Main()
{
  ///...
  _graphic.Reverse(text);
  ///...
}

Kentu Beckovi se tento kód nezdál dostatečně čitelný, a proto přidal následující metodu:

public void Highlight(string text)
{
  _graphic.Reverse(text);
}

Závěr

Nebojte se jednořádkových metod. V některých případech mohou zjednodušit čtení kódu.