Month: November 2015

Żeby do czegoś dojść …

Posted on

Jeśli chodzi o bycie naprawdę dobrym Developerem (Ninja, Wymiatacz, etc) bez stosowania się do tego treściwego przesłania się nie obędzie.

a to trochę rozszerzona (choć w połowie już nuży) wersja:

Dzielenie z resztą bez rzutowania na float

Posted on Updated on

Aby dzielenie odbyło się z resztą operacja musi się odbyć na typach double a nie na int, czyli żeby wynik nie był zaokrąglony do inta. W praktyce dzielenie na intach:

int result = 4/3; // result == 1
Kiedyś rzutowałem w ten sposób:
int rowsNeeded = (int)Math.Ceiling((double)Sources.Count / 2);
A od dziś dzięki Grzesiowi będę zmieniał drugą liczbę na explicit double:

int rowsNeeded = (int)Math.Ceiling(Sources.Count / 2D);

Null-coalescing (??) operator działa też dla typów nullable

Posted on Updated on

Metoda pobierająca ale też od razu cachująca jakieś dane mogłaby wygladać tak:

private CustomerData _data; // assigned null by default

public CustomerData Data
{
    get
    {
        // Retrieve data that is expensive to get only at first contact
        _data = _data ?? GetValue(); 

        return _data;
    }
}

Korzystamy z operatora ?? który zwróci albo vartość po lewej stronie (gdy jest ona nie nullem) albo wartość po prawej stronie (gdy ta po lewej jest nullem).

Czy typy nullable (double?) też tak można skracać? Kiedyś napisałbym tak:

private double? _value;

public double Value
{
    get
    {
        if (!_value.HasValue)
        {
            _value = CalculateValue();
        }

        return _value.Value;
    }
}

Teraz jednak wiem że operator ?? zadziała też tutaj:

private double? _value;

public double Value
{
    get
    {
        _value = _value ?? CalculateValue();

        return _value.Value;
    }
}

Jak castować na właściwy Enum

Posted on

Napiszę jak to robię bo .NET udostępnia parę fajnych rzeczy do tego.

Głównie chodzi o parsowanie ze stringa.

FileMode fileMode = (FileMode)Enum.Parse(typeof(FileMode), stringValue, true);

Trzeci argument nazywa się ignoreCase i zazwyczaj ustawiam na true czyli wielkość liter nie muszi się zgadzać, żeby zwrócić właściwy enum.

Jeśli może się nie powieść to korzystam z analogicznej funkcji TryParse()

FileMode fileMode;
if (Enum.TryParse(stringValue, true, out fileMode))
{
    return fileMode;
}
else
{
    // ..
}

Najczęściej wrzucam do projektów coś na wzór tych rozkmin z StackOverflow:
http://stackoverflow.com/questions/16100/how-do-i-convert-a-string-to-an-enum-in-c/16104#16104
http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum/79903#79903

public class EnumHelper
{
    public static TEnum GetEnumFromString<TEnum>(string value) where TEnum : struct, IComparable
    {
        if (!typeof(TEnum).IsEnum)
        {
            throw new ArgumentException(string.Format("{0} must be an enumerated type", typeof(TEnum).FullName));
        }

        return (TEnum)Enum.Parse(typeof(TEnum), value, true);
    }
}

Code Review a spacje i inne pierdoły

Posted on Updated on

Chodzi o taką sprawę:

couple random spaces in Code Review

Te ciemno zielone to kilka dodatkowych spacji, które się pojawiło (a nie było ich wcześniej). (Inne to np, dodatkowo zbędna, podwójna linia, brak pustej linii, brak spacji w parametrach lub zbyt duża ich liczba, itp, itd.)

Przypadkowo podczas pracy nad kodem gdzieś się pojawiło kilka spacji za dużo lub za mało. Czy chcielibyśmy przypieprzać się do takich rzeczy na Code Review? – nie bardzo, są ciekawsze rzeczy do kminienia. Jak unikać takich przeszkadzajek.

  • Formatować kod przed commitem, a najlepiej na bieżąco, skrót Ctrl+k, Ctrl+d.
  • Jeśli powyższego nie możemy zrobić, bo ogólnie cały kod jest syfiasty gdy chodzi o wcięcią/formatowani to możemy formatować tylko kod który dodaliśmy. Zaznaczamy kod i ten sam skrót. To akurat robię rzadko.
  • Jeśli już nie możemy (albo nie chcemy) korzystać z automatycznego formatowania to przed pushowaniem do centralnego repozytorium powinniśmy oczyścić commity z takich przeszkadzajem (git rebase interactive)
  • Już naprawdę w ostateczności gdy nic z powyższych nie podziałało to podczas tworzenia pull requesta (obszerny opis o co w tym biega na przykładzie Git/BitBucketa) zobaczmy wszystkie nasze zmiany. Na tym etapie wyłapiemy te pierdoły, na które będzie tracił czas każdy robiący Code Review (a czasem jest to kilka osób, których czas byśmy zmarnowali).

Innym podejściem jest włączeniem do projektu StyleCopa. Dzięki temu wymusimy pewne standardy formatowania, czyli brudną robotę odwali za nas narzędzie.

Nieużywane argumenty lambd

Posted on

ScrollView.ViewForZoomingInScrollView += x => PageImageView;

Jest tutaj nieużywany argument. Gdyby był potrzebny i wyglądało to np tak:

ScrollView.ViewForZoomingInScrollView += x => PageImageView(x);

to wszystko byłoby w porządku. Jeśli jednak mamy taki nieużywany możemy go sprytnie ominąć korzystając z podkreślenia (podłogi)

ScrollView.ViewForZoomingInScrollView += _ => PageImageView;

Dzięki temu od razu widzimy, że ten argument jest nieistotny i czytając nie musimy się na nim skupiać.