Słowo kluczowe ‚is’. Code review

Używanie is w kodzie często można zastąpić czymś innym. Ma ono mało dobrych zastosowań. Ok, przesadzam, są miejsca gdzie trzeba tego użyć. Jednak może być „nadużywane”.

(this is Startpage)

Przykład kodu, gdzie raczej nie powinniśmy porównywać jakiego typu „jesteśmy” (this).

class Page
{
    public string PageTitle
    {
        get
        {
            if (this is StartPage) // niezbyt fortunne użycie 'is'
            {
                // more code ...
                return "StartPage";
            }

            // more code ...
            return "anything";
        }
    }
}

class StartPage : Page {}

Zamiast tego możemy korzystać z przeciążenia (overriding). Będzie to zwłaszcza bardziej czytelne gdy hierarchia dziedziczenia się wydłuży.

class Page
{
    public virtual string PageTitle
    {
        get
        {
            // more code ...
            return "anything";
        }
    }
}

class StartPage : Page
{
    public override string PageTitle // korzystamy z przeciążenia
    {
        get
        {
            // more code ...
            return "StartPage";
        }
    }
}

Użycie is zamiast as

Programowałem raz z programistą który uważał, że kod najpierw sprawdzający jest bardziej czytelny (ciężko to nazwać – przykład poniżej).

Ja uważam, że poniższy przykładowy kod jest wystarczająco dobrze napisany.

public void Foo(object service, object data)
{
    var sendingService = service as ISendingService;
    if (sendingService != null)
    {
        sendingService.Send(data);
    }
}

Kolega wolał natomiast explicite sprawdzać za pomocą nazwanej funkcji IsSendingService(). Dla lepszej czytelności.

public void Bar(object service, object data)
{
    if (IsSendingService(service))
    {
        var sendingService = (ISendingService)service;
        sendingService.Send(data);
    }
}

private static bool IsSendingService(object service)
{
    return service is ISendingService;
}

Może nie do końca przekonany, ale jednak wcommitowałem drugą wersję kodu. Przecież po to jest pair programming, czyż nie?

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

4 odpowiedzi na „Słowo kluczowe ‚is’. Code review

  1. Ja korzystam z is tylko wtedy, gdy chcę sprawdzić czy obiekt implementuje interfejs lub dziedziczy z porządanej klasy.

    Choć gdzieś czytałem/słyszałem/widziałem, że lepsze (może wydajniejsze?) jest rzutowanie, np: (IMyInterface)someObject != null.
    ReSharper podpowiada powyższą składnię.

  2. Podobnie jak Twój kolega wolę drugi sposób z IsSendingService(sender) bo kontekstowo wiadomo o co chodzi, sender ma być SendingService a to jak to jest realizowane czy sprwadzane nie obchodzi mnie. Nie musze zgłębiać czy sprawdzasz za pomocą Is czy rzutowaniem i sprawdzniem z nullem czy przez jakiś marker czy inny attrybut.

  3. kmorawski pisze:

    Gdzie trzech Polaków tam trzy wersje kodu 😉 Ja bym zaproponował taką, w której metoda Bar po prostu przyjmuje „ISendingService service” zamiast „object service”. Bo po to właśnie mamy typy argumentów, żeby nie musieć opakowywać całego ciała metody w „if (service is X)”.

  4. Zbytnio uprościłeś 😉 Sygnatury Foo() czy Bar() są nieistotne – chodziło tylko o pokazanie że jest jakiś service. Może na przyszłość nie będę tego, co chcę pokazać, opakowywał w metody.

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