2 Comments

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);

2 Comments
Advanced technology day 5 logo

Svečano objavljujem, najavljujem i obavještavam svekolikom Microsoft tehnologiji naklonjenom pučanstvu (bogu mili, a niti vragu nisu mrski), da će se 1.12 u Zagrebu održati Advanced Technology Day konferencija na kojoj će biti prezentirane umotvorine gomile štrebera zatvorene u prostorije sa gomilom kompjutera. Da ne spominjem nemali iznosi tekućih racuna tih istih štrebera, koji su ne samo dobro plaćeni, nego im još i titraju na radnom mjestu sa bespatnim kavama, jeftinim jelika iz 57 svjetskih kuhinja, izvrsnim zdravstvenim, i još par sitnica. To je kao da plaćate crnogorca da spava (figurativno rečeno, bez nacinalnih konotacija molim!). Taj višegodišnji proces, ili eksperiment, je rezultirao sa nekoliko izvrsnih softwareskih alata i frameworka koji će biti prezentirani od strane stručnjaka iz Microsofta i par renomiranih domaćih tvrtki.
Izdvojio bi neke naslone redom:

  • ASP.NET 4: nakon godina zanovjetanja puritanaca konačno će stranice prolaziti W3C validaciju. To znači mogučnost potpunog isključivanja ViewState input taga, kontrole nad ID-evima serverskih kontrola. itd. Ali to je samo manji dio novosti!
  • Entity Framework 4- skok sa verzije 1 u .net 3.5 na verziju 4 u .net 4. Uvođenje POCO, Lazy loading i još mnogo toga. Dali će nHibernate konačno dobiti dostojnu konkurenciju?
  • Silverlight 3 – RIA platforma postala još bolja: 3D perspektiva, validacija podataka, nove mogučnosti streaminga,…
  • .NET 4 – dynamic objekti - statički c# dobiva dinamičke tipove, asinkrono izvršavanje, poboljšanje Garbage Collectora za višejezgrene sustave
  • MVC 2 – probajte pogoditi tko će prezentirati novu verziju MVC-a? Tako je, autor ovog bloga, glavom i brkovima! Od bitnih novosti u trenutnoj beta 2 verziji: Area, predlošci, klijent/server validacija podataka. Nešto su mi malo vremena dali, valjda ih nisam naljutio necim? Svejedno, nadam se da ću zaintrigirati barem nekolicinu koja nebude spavala, i spasiti pokoju dušu izgubljenu u WebForms moru isprepletene logike i nepreglednog code-behindea
  • Windows 7 – što donosi novoga za developere
  • Web platform installer – zgodni programčić za instalaciju drugih programa, od CMSova preko SDKova do IDEa
  • IE8 – razvoj pluginova, predpostavljam

Na službenim stranicama možete pronaći prijavu. Nadam se da se vidimo!