Artykuł

sty 20 2013
0

Tuple - prosty sposób na małe klasy

Tworząc duże projekty niejednokrotnie musiałem stworzyć szereg małych klas, których głównym zadaniem było chwilowe przechowywanie określonych danych i przekazywanie ich pomiędzy obiektami. Nie niosły one więc ze sobą żadnej wartości dodanej, a sam ich żywot był raczej krótki.

Kilka, kilkanaście klas tego typu, potrafi dość w skuteczny sposób zabałaganić nawet najlepiej zorganizowany projekt. Jeśli wrócimy do niego za jakiś czas, zaczniemy sobie z pewnością zadawać pytanie - po co ta, czy tamta klasa?

Począwszy od wersji 4.0 frameworka, można ten problem w sposób dość znaczący zminimalizować wykorzystując bardzo przyjemną klasę Tuple.

Jeśli programujesz we wcześniejszej wersji frameworka, to dla Ciebie również mam pewne rozwiązanie:)

Tuple w C# w praktyce

Tuple to klasa, która wykorzystuje możliwości generyczne języka w tworzeniu klas. Dzięki temu możliwe jest tworzenie struktury posiadającej do 8 parametrów dowolnego typu. Klasy Tuple posiadają automatyczne właściwości get dla wszystkich swoich parametrów.

Aby utworzyć nowy obiekt tego typu klasy, musimy określić typy wszystkich jej parametrów i podać wartości w konstruktorze. Poniższy przykład reprezentuje obiekt posiadający 3 parametry generyczne:

Tuple<string, string, int> oPerson = 
    new Tuple<string, string, int>("Jan", "Kowalski", 26);

W prosty sposób zbudowaliśmy obiekt przechowujący podstawowe dane osobowe. Pobieranie danych z klas Tuple jest banalnie proste:

Console.WriteLine("Imię: {0}, Nazwisko: {1}, Wiek: {2}.",
    oPerson.Item1, oPerson.Item2, oPerson.Item3);

Warunkiem koniecznym w tym przypadku jest oczywiście zapamiętanie kolejności parametrów. Nieodzowna w tym momencie będzie dobra dokumentacja kodu.

Tak jak wspomniałem we wstępie, możemy stworzyć klasy o maksymalnie 8 generycznych parametrach. Kolejne parametry dodajemy po przecinku wewnątrz ostrych nawiasów, a ich wartości w wywołaniu konstruktora.

Rozwiązanie dla wcześniejszych wersji frameworka

W wersjach starszych niż 4.0, nie było oczywiście klasy Tuple, ale w pewnym sensie idzie sobie również poradzić z tym problemem - niestety wiąże się to z napisaniem dodatkowego kodu (zawsze taki kod możemy umieścić w jakiejś zmyślnej bibliotece):

class MyTuple<T1, T2, T3>
{
    public MyTuple(T1 oItem1, T2 oItem2, T3 oItem3)
    {
        Item1 = oItem1;
        Item2 = oItem2;
        Item3 = oItem3;
    }

    public T1 Item1
    {
        get;
        private set;
    }

    public T2 Item2
    {
        get;
        private set;
    }

    public T3 Item3
    {
        get;
        private set;
    }
}

Ten prosty wycinek kodu, obrazuje w jaki sposób możemy wykorzystać klasy generyczne (znane większości z Was za sprawą kolekcji) do stworzenia imitacji klasy Tuple. Parametry T1, T2, T3 to tak naprawdę typy nieokreślone, które definiuje użytkownik. Wykorzystaliśmy w tym przypadku prywatne właściwości set, do ograniczenia wielkości tworzonego kodu. Wartości tej klasy definiujemy w konstruktorze, w identyczny sposób jak ma to miejsce w przypadku klasy Tuple:

MyTuple<string, string, int> oPerson = 
    new MyTuple<string, string, int>("Jan", "Kowalski", 26);
Console.WriteLine("Imię: {0}, Nazwisko: {1}, Wiek: {2}.",
    oPerson.Item1, oPerson.Item2, oPerson.Item3);

Jeśli potrzebujemy innej liczby parametrów, wystarczy tylko dodać nową klasę (nawet o tej samej nazwie). Przy zmienionej liczbie parametrów generycznych, jest ona dla kompilatora zupełnie innym typem.

Wadą takiego rozwiązanie jest oczywiście większy narzut kodu. Jednak jeśli w naszym projekcie tworzymy dużo tego typu małych klas, wydaje mi się, że jest to rozwiązanie godne rozpatrzenia.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus