Tuple - prosty sposób na małe klasy
- Kategoria: Programowanie, autor: Jerzy Piechowiak
- Tagi: C#, .Net, Szybkie porady, HOWTO
- Odsłony: 7950
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.
Rekomendowane
Cena: 0,00 zł
Komentarze