Czytelny kod to przyjemna praca

Chlebem naszym powszednim jest kod zatem niech będzie on prosty, czytelny, po prostu smaczny. Czasem 3 minuty wystarczą aby kod był bardziej czytelny a co za tym idzie łatwiejszy do utrzymania w przyszłości. Do napisania tego wpisu natchnęła mnie poniższa linijka kodu*

[csharp]
var p = new CacheItemPolicy {
SlidingExpiration = new TimeSpan(0,0,2,0)
};
[/csharp]

Niby jest czytelnie, niby wiadomo o co chodzi… ale można lepiej:

[csharp]
var policy = new CacheItemPolicy{
SlidingExpiration = 2.Minutes();
}
[/csharp]

Czyta się lepiej. Dla uściślenia ten kawałek kodu znajduje się w funkcji

[csharp]
private void CacheViewResultForTwoMinutes(…..){

}
[/csharp]

i już wiadomo co autor miał na myśli. Nie potrzeba komentarza, ot nazwa funkcji jest wystarczającym komentarzem. Co ważne, to jest metoda prywatna więc mogę ją bezkarnie zmieniać choćby przy każdym buildzie; A wracając do meritum, Minutes to funkcja która konwertuje inta na odpowienią ilość minut zatem zaglądnijmy do środka:

[csharp]
namespace Rekord.ZOS.Lider2.Service.GatewayCommunication.Queries
{
public static class IntExtensions
{
private const int SecondsInMinute = 60;

public static int MinutesInSeconds(this int minute)
{
return minute*SecondsInMinute;
}

public static TimeSpan Minutes(this int value)
{
return TimeSpan.FromSeconds(value.MinutesInSeconds());
}
}
}
[/csharp]

Takie proste zabiegi powodują, że kod jest dużo bardziej czytelny niż początkowe new TimeSpan(0,0,2,0) od którego to się zaczęło. Prosta refaktoryzacja spowodowała, że teraz wszędzie gdzie mówimy o czasie możemy napisać 20.Minutes() i już wiadomo że chodzi o 20 mintu – bez wnikania co autor miał na myśli. Jakby ktoś kiedyś zapomniał co to minuta i ile ma sekund to też może sprawdzić 😉

A teraz najważniejsze, wszystko po to aby napisać w funkcji

[csharp]

CacheViewResultForTwoMinutes(…,…,…);

..

..

[/csharp]

zamiast powiększać funkcję zbędnymi detalami implementacyjnymi:

[csharp]

var p = new CacheItemPolicy {
SlidingExpiration = new TimeSpan(0,0,2,0)
};
MemoryCache.Default.AddOrGetExisting(key, view, p);

[/csharp]

*) tak, wiem, że można napisać TimeSpan.FromMinutes(2). Celowo nie zostało to tutaj użyte, żeby zobrazować pewien mechanizm.