İlkay İlknur

just a developer...

Bir C# Developerının Windows Phone 8 SDK'inden Beklentileri ve Hayal Kırıklıkları

Geçenlerde Windows Phone 8 SDK'i ile beraber gelen yenilikleri didiklerken bir yandan da SDK'in release notlarina gözatiyordum. Listedeki maddelere bakarken gözüm bir anda programlama dili tarafindaki yenilklere takildi  ve notlar içerisinde C# 4.0 ve C# 5.0 ile beraber gelen yenilikleri kullanabilecegimizi gördüm. Ben de bu release notlarini okuduktan sonra kollari sivadim ve C# 4.0 ve C# 5.0 yeniliklerini nereye kadar kullanabildigimizi, SDK'in bu özelliklerin ne kadarini destekledigini incelemeye basladim. Bakalim SDK benim beklentilerimle ne kadar uyusmus :) Iste basliyoruz...

C# 4.0 dynamic Keywordü

C# 4.0'in temasi olan dinamik programlama çerçevesinde C# tarafinda yapilan en büyük yeniliklerden biri dynamic keywordünün dil içerisine eklenmesi. dynamic keywordü ile beraber bildigimiz gibi nesneler içerisindeki üye ve metot erisimlerinde compilerin derleme islemi sirasinda yaptigi tip kontrollerini de dogrudan derleme zamani yerine çalisma zamanina tasiyarak gerçeklestirebiliyoruz. Böylece çogu zaman reflection kullanarak 5-10 satirda yazacagimiz islemi dynamic keywordü sayesinde  1 satirda halledebiliyoruz.

Windows Phone tarafinda dynamic keywordü nerede etkin olarak isimize yarar diye düsündügümde aklima ilk sirada JSON islemleri geliyor. Dönen bir JSON'i deserialize ederek elimizdeki nesnedeki üyelere dinamik olarak erismek aklima ilk gelen senaryo.

Not : Bu islemi aslinda dönen JSON'in formatina uygun tipler hazirlayarak da gerçeklestirebiliriz. Böylece derleme zamaninda elimizde ilgili nesne formatlari olur ve buna uygun olarak kodumuzu yazariz. Ancak her dönen JSON formatina göre nesneler olusturmak bizim isimizi zorlastirir. Yoksa illa ki dynamic kullanacagiz diye bir sart yok :)

Ilk olarak bir console uygulamasi ile basit  bir JSON ürettim. Ürettigim JSON  içerisinde de  Customer tipinden bir array bulunmakta. Customer tipinin propertyleri ise asagidaki gibi.

[DataContract]
public class Customer
{
    [DataMember]
    public int Id { getset; }

    [DataMember]
    public string Name { getset; }
}

Sonrasinda ise yazdigim Console uygulamasindan asagidaki gibi içerisinde dummy elemanlar bulunduran bir JSON elde ettim.

[ { "Id":1, "Name":"Ilkay" }, { "Id":2, "Name":"Ahmet" }, { "Id":3, "Name":"Osman" } ]

Test için gerekli JSON'i elde ettikten sonra simdi sira geldi Windows Phone uygulamasina. Hemen yeni bir Windows Phone 8 uygulamasi yaratiyoruz ve projemize Nuget'ten asagidaki komutla JSON.NET kütüphanesini ekliyoruz.

Not : Nuget yerine JSON.NET projesinin codeplex sayfasina giderek ilgili dll'leri bilgisayariniza indiribilir ve indirdiginiz dll'i manuel olarak Windows Phone 8 projenize ekleyebilirsiniz.

JSON.NET Kütüphanesini Projeye Eklenmek Için Gereken Nuget komutu : PM> Install-Package Newtonsoft.JSON

Nuget paketini de projemize ekledikten sonra sira geldi kodlama asamasina.

public void DynamicJsonTest()
{
    string json = "[{\"Id\":1,\"Name\":\"Ilkay\"},{\"Id\":2,\"Name\":\"Ahmet\"},{\"Id\":3,\"Name\":\"Osman\"}]";

    dynamic list = JArray.Parse(json);

    foreach (dynamic customer in list)
    {
        var id = customer.Id;
        var name = customer.Name;
    }
}

Gördügünüz gibi test amaciyla oldukça basit bir kod yazdim. DynamicJsonTest isimli metot içerisinde ilk olarak json isimli degiskenin içerisine daha önceden elde ettigim JSON stringini attim. Sonrasinda ise JSON.NET içerisindeki JArray tipinin içerisinde bulunan static Parse metodunu kullanip buradan dönecek olan nesneyi de dynamic olarak tanimladim. Böylece bana gelecek olan nesne içerisindeki propertylere kolay bir bir sekilde dinamik olarak erisebilir olacagim. Sonrasinda ise elimde olan array içerisindeki elemanlari foreach ile dönerek yine dynamic olarak tanimladigim her bir elemanin içerisinde bulunan Id ve Name propertylerini okumaya çalistim.

Eger burada dynamic keywordünü kullanmasaydim zaten bu sekilde kod yazmam mümkün degildi. Ben dynamic kullanarak kodun derlenme asamasinda bu kisimlarda yapilacak olan type-check islemini compilerin çalisma zamanina birakmasini sagladim.

Simdi yazdigimiz metodu, uygulama içerisindeki page açildiginda çagirilacak sekilde düzenleyelim ve uygulamayi çalistiralim.

class MainPage
{
    public MainPage()
    {
        InitializeComponent();

        DynamicJsonTest();
    }
}

Olmadi :( Itiraf etmem gerekirse bu hayal kirikligi Microsoft ile ilgili degil. Yani bu noktada olmamis diyerek topu direkt MS'e atamiyorum. :) Bu exceptioni almamizin temel nedeni kullandigimiz JSON.NET kütüphanesinin Windows Phone SDK 7.1 için yazilmis olmasi. Özetle bu senaryoyu test edebilmemiz için JSON.NET'in tam anlamiyla Windows Phone 8 destekleyen sürümünü beklememiz gerekmekte. Ancak tabi ki Windows Phone tarafinda dynamic keywordünün eklenmesi, benim aklima ilk olarak JSON senaryosunu getirmisti. Ancak simdilik bu konuda basarili bir sonuç alamadik. Gelelim ikinci senaryomuza.

ExpandoObject

Windows Phone içerisinde dynamic keywordü denince aklima ikinci olarak nedense ExpandoObject geldi. :) ExpandoObject basit olarak dynamic keywordü ile kullanildiginda içerisine dinamik olarak property eklenebilen bir tip. Windows Phone tarafinda ne ise yarar, nerelerde kullanilir sorularina cevap bulamasam da acaba eklemisler mi diye SDK içerisine bakamadan edemedim. :) Bir de baktim ki ExpandoObject orada System.Dynamic namespace'i içerisinde duruyor :) Hemen hizli bir sekilde asagidaki gibi test kodumu yazdim ve testimi gerçeklestirdim.

public void ExpandoObjectTest()
{
    dynamic expando = new ExpandoObject();
    expando.Id = 1;
    expando.Name = "Ilkay";

    MessageBox.Show(String.Format("ExpandoObject Degerleri Id={0} Name={1}", expando.Id, expando.Name));
}

Yukaridaki kodu uygulama ilk açildiginda page içerisinde çalistirdigimizda bakalim ne olmus ?

Bu testimizde basarili olduk. Ancak dedigim gibi ExpandoObject Windows Phone tarafinda nerede isimize yarar ben bulamadim. Hatta normalde de nerede kullanabilirim sorusuna cevap bulmus degilim :)

Özetle C# 4.0 Özellikleri

Yukaridaki iki madde açikcasi dynamic programlama özelliginde aklima gelen spesifik senaryolar. Tabi ki dynamic kullanabilecegimiz pek çok senaryo Windows Phone içerisinde mevcut. Özellikle reflection kullanmamiz gereken yerlerde artik dynamic ile ilerleyecek olmamiz bile bizim için oldukça önemli. Simdi geçelim C# 5.0 kismina.

C# 5.0 Async

C# 5.0 diyince hepimizin aklina asenkron programlama geliyor. Bildigimiz üzere C# 5.0 ile beraber gelen async ve await keywordleri ile beraber asenkron çagrimlari çok kolay bir sekilde gerçeklestirebiliyoruz ve callback implementasyonlarindan bu sayede yirtabiliyoruz :) Windows Phone tarafinda da yeni SDK ile beraber async ve await keywordlerini kullanabiliyormusuz. Tabi burada aklima gelen bu keywordleri kullanmanin ötesinde SDK içerisinde bulunan tiplerin  task tabanli asenkron patternini ne kadar uyguladiklarini incelemek oldu. Bunun için aklima gelen ilk tip WebClient tipi ve dolayisiyla da DownloadStringAsync metodu oldu. Bakalim bekledigimiz implementasyonu görebilecek miyiz ?

Varan 1 :) Callbackler orada öylece durup duruyor :D Async & await kullanarak ben internetten bir content download edemeyeceksem ne anladim bu isten. :) Neyse moralimi bozmayayim dedim bakalim belki baska yerlerde bu özelligi kullanabiliyorumdur. Sonra aklima gelen ikinci yer ve bana göre de en kritik nokta olan webServis baglantilari. Özellikle Business appleri gelistirme senaryolarinda tüm business logiclerini webservis tarafina yiktigimizda yazdigimiz uygulamanin web servise olan bagimliligi oldukça fazla oluyor. Web servis çagrilarini asenkron olarak yaptigimizdan dolayi da tüm kod neredeyse callback çöplügüne dönüyor. Özellikle Windows 8 tarafinda web servis proxylerinin task-based olarak üretilmesiyle artik yaptigimiz asenkron web servis çagrilarinda async ve await'i hizli bir sekilde kullanabilmekteyiz. Bakalim Windows Phone 8 tarafinda bu durum nasilmis ?

Hemen Visual Studio üzerinden Add Service Reference'a tikladim ve oradan da sol alttaki Advanced butonuna tiklayarak karsima çikan ekrana öylesine uzun süre baktim :( Neden mi ?

Varan 2 :( Itiraf etmem gerekirse WebClient vs... neyse de web servisleri tarafinda durumun böyle olmasi bu konuda beni bayagi hayal kirikligina ugratti. Bunun üzerine son bir umut asenkron islemlerin yine sikça kullanildigi launchers and choosers kismini test etmek geldi aklima. Insanda bir umut iste :)

Sonuç ne mi oldu ?

Yine hayal kirikligi :(

Tüm bu yaptigim testlerden sonra anladgim kadariyla Microsoft mevcut Windows Phone API'larina hiç dokunmamis. Bunun yaninda yeni gelen API'larda ise asenkron islemler C# 5.0 ile beraber gelen async ve await keywordleri ile kullanilabilecek sekilde task-based olarak implemente edilmis.

Özetle C# 5.0 Özellikleri

Kagit üzerinde baktigimizda Windows Phone 8 SDK'i içerisinde C# 5.0 ile beraber gelen asenkron programlama yeniliklerini kullanabiliyoruz. Ancak bu yenilikleri kullanabilecegimiz senaryolara baktigimizda maalesef henüz ilgili destegin verilmedigini görüyoruz SDK içerisinde. Bu nedenle Windows Phone 8 SDK'i C# 5.0 yeniliklerini kullanabilme adina bence sinifta kaldi. Blog yazilarina islerim dolayisiyla bir süre ara verdikten sonra böyle bir inceleme yazisiyla dönmek istedim. Tabi biraz iç karartici oldu orasi ayri :) 2012'nin son blog postu olan bu yazim vesilesiyle hepinize iyi yillar dilerim !


Yorum Gönder


Yorumlar

  • profile

    Fevzi

    • 1
    • 1
    • 2013

    Harika , eline sağlık İlkay abi :)