Code review – DateTime, TimeStamp

Kod:

response.Cache.SetExpires(DateTime.Now.AddMinutes(60 * 24));
response.Cache.SetMaxAge(new TimeSpan(0, 24, 0));
response.AddHeader("Last-Modified", DateTime.Now.Date.ToString());

Ustawiamy nagłówki Http aby cachować obrazek na 1 dzień.

DateTime.Now.AddMinutes(60 * 24)

Można by powiedzieć, że nawet fajnie, bo sam często korzystam z mnożenia (w językach niskiego poziomu jest to konieczność). W .NET wykorzystuję to najczęściej, gdy chodzi o ustawianie timera w milisekundach (ale tylko takiego, który nie akceptuje TimeStamp), np:

timer.SetInterval(10 * 1000);

W .NET zamiast mnożenia sekund dla dat mamy metody, które zrobią dokładnie to co chcemy czyli

DateTime.Now.AddDays(1);

Powiedzmy, że wykona się dokładnie to samo, ale jednak czytelność jest ważna. A dodatkowo „Poznaj swój framework”.

new TimeSpan(0, 24, 0)

Można by powiedzieć, że kod sam się komentuje bo 24 jest specjalną, samokomentującą się, magiczną 😉 liczbą, która oznacza 24 godziny w dobie. Rzeczywistość wygląda tak:

TimeSpan, minutes instead of hours, bug

TimeSpan, minuty zamiast godzin

Jakoś tak się stało, że argumenty wylądawały w złej kolejności 😉 Rozwiązaniem jest znowu odpowiednia funkcja z frameworku:

TimeStamp.FromDays(1)

Znowu „Poznaj swój framework” 🙂

AddHeader(…)

Dotychczas korzystaliśmy z strongly typed DateTime, czy TimeStamp. Teraz dodajemy nagłówek jako para klucz-wartość (string-string). A może jest jakaś przeładowana metoda, które pobierze instancję DateTime?
Jest:

response.Cache.SetLastModified(DateTime.Now);

Spróbujmy jednak ugryźć to bez powyższej metody. Long story short:

response.AddHeader("Last-Modified", DateTime.UtcNow.ToString("R"));

Niestety trzeba jeszcze wiedzieć dlaczego dajemy UtcNow zamist Now oraz że odpowiednim formatem jest „R”.

Podsumowanie

Wbudowane metody są pewniejsze i .NET to całkiem fajny framework.

Reklamy
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

3 odpowiedzi na „Code review – DateTime, TimeStamp

  1. Mad pisze:

    Na mnożenie 10 * 1000 też jest sposób:
    TimeSpan.FromSeconds(10).TotalMilliseconds;

    Zgadzam się z tym co napisałeś, poprawia to znacznie czytelność kodu oraz zmiejsza prawdopodobieństwo błędów. Jeżeli często stosujemy takie konwersje jednostek to warto zrobić swój wrapper i extensions methods. Ja na przykład napisałem sobie coś takiego:

    5.As(Unit.MB).To(Unit.kB); // zwraca ulong, samo As() zwraca obiekt własnej klasy konwertera
    Problem może pojawić się w drugą stronę, bo wtedy konwersja może być stratna:
    jakaśZmienna.As(Unit.kB).To(Unit.MB, Rounding.Down); // zwraca ulong, jawne podanie typu zaokrąglenia
    jakaśZmienna.As(Unit.kB).ToExactly(Unit.MB); // zwraca double

    To tylko przykład, który można zastosować podobnie dla czasu lub innych przypadków.

  2. TimeSpan.FromSeconds(10).TotalMilliseconds; – fajny trick, przyda się.

    Masz gdzieś publicznie kod tych extension methods? Wygląda na sensowne, gdybym kiedyś znowu potrzebował to warto wiedzieć gdzie tego szukać.

  3. Mad pisze:

    Niestety nie mam, kod został w poprzedniej pracy.

Możliwość komentowania jest wyłączona.