Trice i kučine »

[11 pro 2009 | 0 Comments]

Prije koji dan sam bio pozvan na ATD5 konferenciju da kažem nekoliko riječi o MVC v2. Prezentacija je trajala punih 25min, minus 5 minuta zbog tehničkih poteškoća spajanja sve te prezentacijske opreme, ali na kraju je 20 minuta bilo dovoljno da ispričam baš sve, od '79 do '09, od nastanka patterna do implementacije u naš dragi framework i sve to demonstriram kroz par demo aplikacija. Uz to, trebalo je i spomenuti novosti u verziji 2, kao da ljudi već aktivno rade i razvijaju u verziji 1! Ne moram niti napisati, ali na kraju su me svi gledali u čudu, i pitali se od kuda je ovaj došao i što to on priča uopće. Već sam bio pomislio da su mi sve lađe potonule, kad ono evo trojica sudionika konferencije sa pitanjima glede te čudne tehnologije! To mi je bilo dovoljno da ne počinim ritualni harakiri, i slobodno odputujem doma mirne savjesti da sam uspio (možda) spasiti barem jednu ili dvije izgubljene duše u moru proceduralnog špageti ala bolonjez ASP.NET koda. Što bi tek bilo da sam počeo pričati o Uncle Bobovim SOLID principima, proglasili bi me mesijom!? Malo si umišljam, oprostiti će te mi?
Pred kraj konferencije, dokle sam sjedio u foajeu hotela i pućkao lulu (ili da ne lažem: jeo pizza cut i pio colu, ipak sam ja white&nerdy:), prišao mi je Domagoj Pavlešić, tvorac Bugovog portala i Foruma (da, Bug odnosno Domagoj je sam isprogramirao svoj forum engine sa ASP.NET, to mi je baš kul), i zamolio me da održim punu prezentaciju MVC frameworka na novoj user grupi! Moja prezentacija je tu nebitna, puno važnija je vijest osnivanja nove microsoft user grupe koja će se baviti isključivo webom i razvojem web stranica i aplikacija. Izuzetno mi je drago što je Domagoj prepoznao potrebu okupljanja .NET web developera preuzeo inicijativu osnivanja grupe, svaka mu pohvala za to. Prvi sastanak je 15.12.2009, za daljnje aktivnosti su već najavljene na službenom webu.

Nedugo potom konferencije, dobio sam jedan email koji me jako obradovao. Ne samo zbog pošiljatelja koji ima MVP status (da, jedan MVP je MENE kontaktirao!), nego i zbog sadržaja maila, gdje me poziva na suradnju oko novog web portala za ASP.NET MVC zajednicu Hrvatske, Bosne, Srbije  i Slovenije! Ne samo da imamo MS Community grupu, nego smo dobili i web portal za MVC! Stoga, sljedeću godinu proglašavam godinu renesanse ASP.NETa; šire prihvačanje MVCa, osnivanje web user grupe i portala će svakako učiniti 2010 zanimljivom za ASP.NET developere. Dali bi tražio previše kada bi od Djeda Mraza/Božićnjaka/Svetog Nikole zaželio i da se malo više okreneo i Silverlightu? Neka, mora nešto ostati i za kasnije.
Sve koji žele sudjelovati u djelovanju portala i user grupe, pozivam da im se obrate jer iza stoje jako dobri ljudi i veliki stručnjaci:)

Web Dev »

[6 pro 2009 | 0 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: Više...

quick thoughts »

[28 kol 2009 | 0 Comments]

Što nam novoga donosi MVC 2:

Web Dev »

[10 kol 2009 | 0 Comments]

U izradi sučelja jedne ASP.NET MVC aplikacije morao sam dobiti listu radio buttona, sa jednim defaultnim odabirom. Jednostavno, pomislih, postoji HtmlHelper za to. Pogledah po spisku u Intellisense autocomplete dialogu, i stvarno je tamo, Html.RadioButtonList(). Tu je moj sreća završila, jer taj helper ništa ne radi, odnosno ja nisam uspio dokučiti što da radim sa njime! Dobijem array stringova, sa zapisima input type="radio" /> , koje bi ja trebao sa foraech petljom ispisivati, plus dodavati labele jer njih helper nije napravio. Iz vjerskih uvjerenja nisam htio odrađivati posao helpera, pa mi nije ostali ništa drugo nego da napravim svoj. I konačno malo prilike da se poigram sa Reflectionom, tim mracnim djelom frameworka kojim me baka plašila kada sam bio mali ;)
Cilj je dobiti ovakav kod:




Html Helper kao extension metoda na HtmlHelper klasu:

namespace Microsoft.Web.Mvc
{
	public static class HelperExtMethods
	{
		public static string MyRadioButtonList(this HtmlHelper helper,string name, SelectList list)
		{
			PropertyInfo DataInfo = null;
			PropertyInfo ValueInfo = null;
			StringBuilder builder=new StringBuilder();
			string pattern = "";
			foreach (var item in list.Items)
			{
                if (DataInfo == null)
				{
                    DataInfo = item.GetType().GetProperty(list.DataTextField);
					ValueInfo = item.GetType().GetProperty(list.DataValueField);
				}
                string data = DataInfo.GetValue(item, null).ToString();
				string value = ValueInfo.GetValue(item, null).ToString();
				if(list.SelectedValue==value)
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"checked");
				else
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"");
			}
			return builder.ToString();
		}
	}
}

Glupo ime helper, ali poslužiti će dokle ne smislim nešto bolje (RadioButtonListTurboDiesel npr?).
Upotreba helpera:

<%= Html.MyRadioButtonList("GodisnjeDoba",new SelectList(Model.ListaDoba,"Id","Naziv",Model.SelectedDoba)) %>
Doba (u Model.Doba) je klasa koja ima dva propertya, Id i Naziv. Pomoću refleksija u foreach petlji čitamo njihov sadržaj i kreiramo potrebni Html. Iako su refleksije najsporiji način dohvata vrijednosti u objektima, mislim da za ovih nekoliko objekata koje čitamo preko refleksija ne utječemo previše na vrijeme učitavanja stranice. Ako znate bolji (brži) način čitanja propertya, ostavite komentar pa ću prepraviti ovaj kod i dati drugu verziju!

Oprez: ovaj kod ne sadrži nikakve provjere valjanosti ulaznih parametra; što znači da ako mu ne pošaljete na primjer defaultnu vrijednost za selektirani radio button, dobiti će te za nagradu asp.net-ov yellow screen of death. Upozoreni ste!

Web Dev, Trice i kučine »

[3 kol 2009 | 0 Comments]

Sa par dana zakašnjenja objavještavam o izlasku prve preview verzije asp.net mvc 2 frameworka.

Neke bitne značajke Preview 1 verzije:

Areas: logičko grupiranje kontrolera i View-ova. Svaki Area (prijevod?) može biti u zasebnom projektu. Pomaže u radu na većim projektima, gdje svaki tim ili programer može biti zadužen za svoj dio projekta, odnosno Area

DataAnnotation: iskorištavanje podrške za validaciju predstavljene u .NET SP1 (System.CompomentModel.DataAnnotation namespace), od prije poznate iz upotrebe unutar DynamicData i RIA Services frameworka. Radi se o dodavanju atributa na entitete, čime model binder iz MVCa automatski može izvršiti potrebne validacije.

Novi UI helperi, Templated Helpers. Mogućnost automatskog asociranja UI elementa na određeni tip podatka. Npr. tip podatka DataTime automatski prikaže kalendar (date ui picker ako hoćete). Predlošci se dodaju u za to predviđeni folder, a unutar View se koristi Html.EditorFor, Html.LabelFor i Html.DisplayFor helper

Pogledajte video prezentaciju Scott Hanselmana:

http://channel9.msdn.com/posts/Glucose/Hanselminutes-on-9-ASPNET-MVC-2-Preview-1-with-Phil-Haack-and-Virtual-Scott/

Skinite mvc 2 preview 1:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d34f9eaa-fcbe-4e20-b2fd-a9a03de7d6dd#tm