Lepiej zwracać pustą kolekcję czy null?

Piszę w C#, ale wydaje mi się, że to pytanie dość ogólne: Czy gdy funkcja zwracająca kolekcję nie znajduje żadnych obiektów do zwrócenia, lepiej jest zwracać pustą kolekcję czy null? Czy jest jakaś ogólna, wynikająca z praktyki, zasada?

  • Jak to mówią, są dwie szkoły gotowania na gazie - Otwocka i Falenicka.

    Otwocka w tej sytuacji mówi - zwracaj pustą kolekcję, to nie będziesz musiał się później troszczyć o sprawdzanie czy nie dostałeś czasem nulla, po prostu się przebiegniesz po kolekcji. Jak będzie pusta to się nie przebiegniesz. Mniej kodu, mniej warunków logicznych, przejrzyściej. I nie musisz wiedzieć jak działa Twoja metoda wywołując ją - spodziewasz się kolekcji i zawsze ją dostaniesz.

    Falenicka mówi tak - zwracaj nulla, bo po co tworzyć zbędne byty. Prosty warunek po stronie konsumenta rozwiąże problem. W rezultacie mniej będziesz obciążał pamięć, zyskasz na czasie inicjalizacji obiektu kolekcji itd.

    Ja się zdecydowanie skłaniam ku pierwszej opcji. Jest przejrzystsza, stwarza mniej szans do wprowadzenia błędu do kodu, a zysk wydajnościowy jest tak niewielki, że w ogóle nie usprawiedliwia kodowania które każe Ci się troszczyć częściej o więcej.

  • Niemal zawsze najlepszym rozwiązaniem jest pusta kolekcja. Daje to duże szanse na to, że nie będzie trzeba pisać dodatkowego kodu obsługującego przypadek, gdy funkcja zwróciła null. Program, który pracuje ze zwróconą kolekcją najczęściej przegląda jej zawartość w pętli foreach lub podobnej. Pusta kolekcja w takim przypadku "nie szkodzi" - program nie robi nic. Null wymusza pisanie dodatkowego kodu.

    Są oczywiście wyjątki, np. gdy UI nie powinien wyświetlać pustej tabeli albo jakoś specjalnie zareagować na brak danych.

  • Moim zdaniem, wszystko zależy jak wykorzystujesz potem tę kolekcję. Tak czy siak będzie musiał sprawdzić czy kolekcja jest różna od nulla, lub czy count wykonany na tej kolekcji jest większy od zera. Ja, np. gdy pobieram dane z bazy danych, najpierw tworzę kolekcję i potem przetwarzam zwrócone wiersze i dodaje do kolekcji. Jeśli okaże się, że nic nie zostało dodane, to zwracam pustą kolekcję i we właściwym kodzie sprawdzam czy nie jest pusta. A jeszcze co do nulli to jest to zawsze ryzykowne, bo można przez przypadek natknąć się na słynny błąd "object reference not set to an instance of an object"

Zaloguj się, aby dodać swoją odpowiedź