Tuple – dobro czy zło?

Tuple. Dobro czy zło? Subiektywizm każe mi powiedzieć, że straszne zło. Obiektywizm – zło umiarkowane/neutralność.

Zamysłem przy tworzeniu Tuple było ułatwienie zagnieżdżania struktur. Na papierze wygląda nieźle, natomiast jest bardzo  nadużywane w projektach, co czyni je nieczytelnymi. Osobiście uważam, że Tuple może być wykorzystany przy tworzeniu prototypów, kiedy chcemy zobaczyć, czy dany kod robi dokładnie to, o co nam chodzi, inaczej mówiąc – do tworzenia działającej metody. Zaraz po tym, koniecznie należy zastanowić się nad tym, w jaki sposób nieszczęsny Tuple zamienić.

Ogromną wadą jest to, że właściwości są nazwane po prostu Item1, Item2, Item3 etc. Wyobraźmy sobie, że ktoś po nas siada do kodu, który zazwyczaj jest źle skomentowany (albo w ogóle) – zazwyczaj jest to katorga, ponieważ tracimy cenny czas na zrozumienie. Poniżej jeden z mniej skomplikowanych przykładów:

class Program
    {
        static void Main(string[] args)
        {
            Tuple<int, int, string, string, bool, bool> tuple
                = new Tuple<int, int, string, string, bool, bool>(1, 2, "hi", "bye", true, false);

            if (tuple.Item1 == 1)
            {
                //do something
            }

            if (tuple.Item2 == 2)
            {
                //do something
            }

            if (tuple.Item5)
            {
                //do something
            }

        }
    }

Jak widać, kod wygląda paskudnie. A to dopiero początek – co, jeśli ktoś wpadnie na pomysł zagnieżdżania słowników? Ostatnimi czasy widziałem coś podobnego:

 

Tuple<int, Dictionary<int, string>, Dictionary<int, string>, string, bool, bool, int, string, Dictionary<int, string>, int> tuple
                = new Tuple<int, Dictionary<int, string>, Dictionary<int, string>, string, bool, bool, int, string, Dictionary<int, string>, int>(...);

TO jest już totalna rozpierducha. Analiza 1 linii kodu zajmie mnóstwo czasu, a korzystanie z tego to już kompletna katorga.

Nie bądź leniem!

7 uwag do wpisu “Tuple – dobro czy zło?

  1. Dla mnie Tuple to jedynie ukłon w kierunku programistów wywodzących się, ze świata funkcyjnego. Ciężko znaleźć sensowne i pozytywne aspekty używania tupla w świecie obiektowym.

    1. Zgadzam się, aczkolwiek pod pozytywy można jeszcze podciągnąć (naciągając) ułatwienie przy tworzeniu prototypów. Po za tym nic dobrego w tym rozwiązaniu nie widzę 🙂

  2. Czasem potrzebny jest obiekt jakieś klasy tylko po to żeby przekazać go jako parametr dla wątku lub po to żeby zwrócić wartość z wątku, np. w BackgroundWorker dla wartości e.Result lub dla taska dla ContinueWith -> wówczas można stworzyć jakąś klasę private lub internal lub stworzyć listę/tablicę obiektów klasy object – po co? Przecież są Tuple – w tym przypadku dla mnie do ma sens.

  3. Mnie też Tuples się nie podobają w C#. Nazwy Item1, Item2 itd. nic nie mówią jak się czyta kod. W F# to mega feature, bo tam przynajmniej jest pod to składnia. Fajnie jakby przenieśli to do C#, ale to osobny temat 🙂 Poza tym nie podoba mi się to, że jest to typ referencyjny, a nie wartościowy. Gdy przychodziło mi do głowy użycie Tuples to prawie zawsze były to przypadki danych typu immutable. Typ referencyjny + nic nie mówiące nazwy? Oj nie 🙂 Wolałem stworzyć własne struktury z polami readonly.

    1. Cieszy mnie, że nie jestem sam w tym przekonaniu. Wydaje mi się, że Tuple zostało stworzone przez programistów z własnego lenistwa, niestety stało się tak popularne, że jest cholernie nadużywane w projektach.

  4. Dopóki nie ma Tuple w publicznym API oraz liczba elementów jest ograniczona (2/3/4) można przymknąć oko. Można także podać kilka dobrych semantycznych przykładów „par” obiektów lub jako zamiennik wzorca TryGetXXX. Jednakże wg mnie nawet jeżli Tuple zostanie zastosowany w miarę poprawny sposób to i tak zasieje więcej zamieszania niż da pożytku (chyba że projekt jest jedno-, kilku osobowy). Tuple błyszczy w F# gdzie składnia umożliwia dokompozycję takich i podobnych typów i przekazywanie odpowiednich elementów podczas kalkulacji. Nie jestem też za przenoszeniem kolejnych elementów języka F# do C#. I tak jego nadchodząca 6 wersja aż roi się od takich „zapożyczeń”, na szczęście większość z nich jeszcze można zrozumieć. Mamy dwa dobre języki na platformę więc wykorzystujmy odpowiednie do odpowiednich celów (ja oprócz tych dwóch w pracy muszę się jeszcze dodatkowo pałować z VB i VBScript w projektach bardzo legacy :/)

Zostaw komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s