Home » Web Dev

Tuple struktura podataka u c#

6. prosinac 2009 by Hudo 0 Komentari

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:

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);
Bookmark and Share


Komentari

Dodaj komentar




Click to change captcha
biuquote
  • Komentar
  • Preview
Loading