Tuple struktura podataka u c#
- Posted in:
- Web dev
Tuple je struktura podataka možda nepoznata dijelu .NET programerske publike, ali je svakako važan dio matematičke teorije i teorije struktura podataka. Pitajte Donalda Knutha ako mi ne vjerujete! Naime, radi se o nepromjenjivoj (immutable) listi elemenata enkapsuliranih u objekt. Tuple tip podataka je dosta korišten u Pythonu, dolazi sa .NET Frameworkom 4, ali u .NET 2/3.5 se moramo sami pobrinuti napraviti ga, što je vrlo jednostavan posao.
O čemu se tu radi uopće; sjetite se TryParse metode objekta Int32:
int value=0; bool pretvorba = Int32.TryParse(“7”, out value); // moglo bi se pisati i ovako: // [bool] [int] = Int32.TryParse(“7”)
TryParse vraća dva podataka, bool vrijednost koja govori dali je string uspješno parsiran, i int vrijednost parsiranog stringa. Ovo je primjer gdje se može iskoristiti Tuple, pošto s njime možemo vratiti više enkapsuliranih objekata:
Tuple<bool,int> result = Int32.TryParse(“7”); Assert.AreEqual(true, result.Item1); Assert.AreEqual(7, result.Item2);
kao se može vidjeti iz primjera, kreirali smo Tuple koji sadrži bool i int objekte, i preko propertya Item1 i Item2 im pristupamo. Ovakvih primjera vjerojatno ima još mnogo, a meni osobno se je prvo palo na pamet kao zamjena za mnoge DTO (data transfer objects) koje moram pisati za MVC aplikaciju kada šaljem podatke iz controllera u view. Ako sam do sada morao kreirati klasu koja enkapsulira List<Articles> i string Title, sada mogu preskočiti izradu klase i samo poslati Tuple<List<Article>,string).
Glavni nedostatak ovakvog pristupa upotrebe kao DTO objekta je što se apsolutno ne zna što taj Tuple sadrži, osim tipa podatka. Prije sam imenovao varijable u DTO klasi prema opisu njihove uloge u domeni, a sada samo znam da imam tri stringa, dva integera i slično, koje pozivam preko propertya Item1, Item2, itd. Čista programerska ljenost! Stoga koliko god njegova upotreba zvuči pimamljivo, i skrati par (desetaka) minuta posla, kod imalo većih projekata može zadati glavobolje i prouzrokovati brojne bugove. Upozoreni ste!
Slijedi jednostavna implementacija Tuplea za .NET Framework 2/3.5: [more]
public class Tuple<T1> { public Tuple(T1 item1) { Item1 = item1; } public T1 Item1 { get; set; } } public class Tuple<T1, T2> : Tuple<T1> { public Tuple(T1 item1, T2 item2) : base(item1) { Item2 = item2; } public T2 Item2 { get; set; } } public class Tuple<T1, T2, T3> : Tuple<T1, T2> { public Tuple(T1 item1, T2 item2, T3 item3) : base(item1, item2) { Item3 = item3; } public T3 Item3 { get; set; } } public static class Tuple { public static Tuple<T1> Create<T1>(T1 item1) { return new Tuple<T1>(item1); } public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) { return new Tuple<T1, T2>(item1, item2); } public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) { return new Tuple<T1, T2, T3>(item1, item2, item3); } }
i par primjera upotrebe:
Tuple<int> t1=Tuple.Create(7); Tuple<string,int,List<Product>> t2=Tuple.Create("Naslov", repository.Count(),repository.Products);