TypeScript nedir?

31 Ara

Anders Hejlsberg yine sahnede ve yeni bir dilin tanıtımını yapıyor. Karşımızda TypeScript. Javascript ile tanışanların kafasında bu dil ile nesnel bir yapıda kodlamanın nasıl yapabileceği sorusu yatabilir. Çünkü javascript ile kodlama yapmak biraz zordur. Sonuçta javascript bir programlama dili değil bir scritpt dilidir. Bu sebeple nesnel programlamanın temellerini oluşturan class, interface ve modüller gibi bazı kavramların kullanılamamasından doğan zorluklar yaşanmaktadır. Javascript’in büyük uygulamalara yön verir hale geldiği günümüzde bu gibi zorlukların aşılması için, bazı geliştiriciler tarafından JQury, script# gibi çeşitli amaçlara hizmet eden ve kodlama kolaylığı sağlayan kütüphaneler oluşturulmuştur. Bu kütüphaneler yardımıyla kod geliştirme ortamlarında (IDE) intellisense kullanımı ve hazır bir takım kodlanmış yapılar sunulmuştur. Ancak bu artık javascript’te programlama mantığı değiştiğini göstermemektedir. Tam da bu noktada bünyesinde javascript’in özelliklerini barındıran ve yazılan kodları düz javascript kodlarına çeviren TypeScript dili Microsoft tarafında duyurulmuştur.

TypeScript dili Visual Studio geliştirme ortamında kullanılabilmekte ve intellisense özelliği sayesinde kodlama kolaylığı sağlamaktadır. Class, interface, module gibi tipler oluşturulabilmekte ve kullanılabilmektedir. Typesctipt kodlama tecrübesini denemek için online ortamda dilin resmi web sitesinde buradan faydalabilirsiniz.

Typescritp örnek kodlamalarını ileriki yazılarımızda incelemeye çalışacağız. Tekrar görüşmek dileğiyle.

Asp.Net MVC 4 ve Jquery Datepicker uygulaması

26 Ara

Asp.Net MVC 4 uygulamalarında tarih biçimli form elemanlarını seçenekli bir şekilde kullanıcıya sunmak için en etkili yöntem JQuery datepicker UI elementini kullanmaktır. JQuery datepicker elementi ile detaylı bilgiye buradan ulaşabilirsiniz. Dil seçeneklerine kadar bir çok özelliği bu siteden bulabilrsiniz.

date1

Asp.net MVC 4 uygulamamızda tarih biçimindeki bir form elemanına nasıl datepicker özelliği eklendiğini incelemeye çalışacağız.

Hemen bir MVC 4 projesi oluşturarak işe başlayabiliriz. Uygulamımızda formu temsil etmek için rezervasyon adında bir Model tanımlıyoruz.


namespace DatepickerJQueryDemo.Models
{
     public class Reservation
     {
       public string Name { get; set; }
       public DateTime Date { get; set; }
     }
}

Modelimizi kullanmak adına ReservationController adında bir controller ekleyerek devam edebiliriz.


public class ReservationController : Controller
{
     public ActionResult Create()
     {
      return View();
     }
}

ReservationController sınıfımınız Create action metodu bir view döndürmektedir. Bu view içerisinde de create formu ve içierisinde de Name ve Date şeklinde iki metin kutusu olacaktır. Bundan sonraki adımınız Date şeklindeki metin kutusuna datepicker özelliğini katmak olacaktır.

editor

Yapacağımız ilk hamle SolutionExplorer penceresindeki projemizin Views dizinindebulunan Shared dizini içerisine EditorTemplates adında bir klasör ekleyip içerisine DateTime adında bir PartialView eklemek olacaktır.

partialview

EditorRemplates ve DisplayTemplates hakkında daha önceden yazılmış makaleleri buradan inceleyebilirsiniz. Bu işlemi yaptığımızda artık bütün view sayfalarındaki DateTime tipinde olan form elemanları (Html.EditorFor extension metodundan) tanımladığımız bu editör template dosyasını kullanır. Burada dikkat edecek olursak “model DateTime?” şeklinde modelin Nullable tipinde olduğunu belirtiyoruz. Bu belirtimi yapmadığımızda karşılaşacağımız hata mesajı şu şeklide olacaktır.

Hata: The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type ‘System.DateTime’.

Bu hatanın sebebi Create action metodunun view sayfası bir reservation modeline bağlı olamsı, ancak create view sayfasına herhangi bir model nesnesi gönderilmediğinden modelin null olmasıdır. Bu sebeple Datetime nesnesi null şeklinde bir hata mesajı karşımıza çıkar.

Bu ince noktayı belirttikten sonra artık ikinci hamleye geçebiliriz. Bu hamlemiz ise formumuzdaki Date tipindeki text kutusuna JQuery datepicker tarafından kullanılacak olan “data-datepicker” adında bir class eklemek olacaktır. JQuery UI scripti bir elementte bu sınıfı gördüğünde, o elemente datepicker özelliğini yapıştırır.

javascript

Bu javascript kodu, input tipinde olan ve “data-datepicker” sınıfını içieren elementlere datepicker özelliğini ekler. Bir önceki adımımızda TextBox tipine “new{data_datepicker=true}” şeklinde sınıf eklemesini yapmıştık.

Bu javascript kodunu bir js dosyasına kaydedip  Create viewe sayfasına refereans olarak gösterebilirsiniz. Ya da direk Create sayfası içerisine yazabilirsiniz.

Son adımda ise Create view sayfasına jquery.ui dosyasını referens olarak vermek gerekmektedir. Bu dosya isteğe göre _Layout.cshtml sayfasına da referans verebilirsiz. Jquery datepicker  elementinin rengi ve şekline bağlı görünüm özellikleri de Content/themes/base/ jquery-ui.css dosyasında bulunmaktadır. Bu dosyayı da refereans olarak eklemeliyiz.

<link href=”~/Content/themes/base/jquery-ui.css” rel=”stylesheet” />

<script src=”~/Scripts/myscripts.js”></script>

<script src=”~/Scripts/jquery-ui-1.8.20.js”></script>

son

Not: Eğer jquery-ui.js refereansını eklemeyi unutursanız aşağıdaki gibi javascript hataları alabilirsiniz.

Hata: 0x800a01b6 – Microsoft JScript çalışma hatası: Nesne, ‘datepicker’ özelliğini veya yöntemini desteklemez.

Çalışan örnek uygulamaya buradan ulaşabilirsiniz.

Bir sonraki yazıda görüşmek dileğiyle.

Kitap – Head First Object-Oriented Analysis & Design

25 Ara

Nesneye Dayalı Programlama (Object Oriented Programming) ile geliştirilen programların analizi ve tasarımı konusunda yol gösterici bir rehberdir. Yazdığınız programların kafa karıştırıcı ve sıkıcı hale dönüşmemesi için nasıl tasarımlar yapılması konusunda örnekler verir.

Kitapta bir taraftan da tasarım desenleri konusunda bilgiler verilmektedir. yazdığımız kodlarda tasarım desenlerinin kullanılması gerektiği konusu vurgulanmaktadır.

Kitaptaki örnekler Java programlama dilinde yazılmıştır. Bu nedenle kitaptan daha iyi faydalanmak için Java programlama diline aşina olmak gerekmektedir.

Kitap O’REILLY yayınlarından çıkmıştır. Orjinal sayfasına buradan ulaşabilirsiniz. Satın almak için amazon üzerinden sipariş verebilirsiniz.

Task Parallel Library TLP C#

24 Ara

İşlemci dünyasının gelişimi ve değişimi, işlemcilerin çekirdek sayısı transistör sayısını ne zaman yakalar diye düşündürüyor insana. Bilgisayarlarımızın işlemcileri geliştirkçe programlarımızın daha da hızlandığı aşikardır. Ancak programların hızlanması sadece bilgisayarların fiziksel özellikleriyle alakalı bir durum değildir. Diğer taraftan yazılımların da işlemcileri iyi kullanabilecek şekilde hazırlanmaları gerekmektedir.

İşlemci çekirdekleri arttıkça uzun sürebilecek işlemleri parçalar halinde bölüştürerek işlemcileri tam kapasitede kullanabilmek işimizi daha çok hızlandıracaka ve kolaylaştıracaktır.

Bu yazımızda da paralel işlemlerin alt yapısını oluşturan Task Parallel Library (TLP) konusunu incelemeye çalışacağız.

TPL kavramını .Net Framework 4.0 ile tanımaya başlıyoruz. Bu yapı, işlemlerin paralel bir şekilde yürütülmesini sağlamak amacıyla oluşturulmuştur. TLP’ye ait tipler System.Threading ve System.Threading.Tasks isim alanında bulunmaktadır.

TLP altyapısı aslında süreçlere, görevler olarak bakar ve tıpki insanların görevleri yütebildiği mantıkla organize edilebilmektedir.

  • Yeni görevler oluşturmak, bu görevleri başlatmak, duraklatmak ve sonlandırmak mümkündür.
  • Bir görevin bittiği yerden başka bir görevi başlatmak mümkündür.
  • Başarıyla yerine getirilen görevlerin sonucunda değerler döndürmek mümkündür.
  • Bir görev kendi içinde alt görevler başlatabilir.
  • Görevler aynı veya farklı thread’ler tarafından yerine getirilebilirler.

Task(görev), başarılı bir şeklide tamamlanmasını istediğimiz bir süreçtir. Süreç T1 zamanında başlar ve T2 zamanında sonlanır.

Bu sürecin tamamlanma süresi, işlemcimizin özelliklerine ve kod yazım biçimlerine göre değişebilir.

Thread(ler) ise görevleri yerine getiren işçilerdir. Bu işçiler bir veya birden fazla olabilir. Her görev ayrı bir thread tarafından yürütülmek zorunda değildir. Bir thread birden fazla görevi yerine getirebilir. Ya da bir görev birden fazla thread(multithread) yardımıyla yapılabilmektedir.

Paralel programlama her problemin çözümü için hızlı bir çözüm olmayabilir. Paralel işlemler ile çözüme birden fazla thread yardımıyla yaklaşmış oluyoruz. Örneğin bir apartmanın en üst katına 2 tuğla çıkarmak için bört kişi çağırıp 1 tuğlayı iki kişiye tutturup çıkartmak mantıklı değildir ve maliyetlidir. Bu işi bir kişi gayet seri bir şeklide yapabilir ve uzucdur. Ancak 100 tuğla olduğunda bir kişi  bu işte çok yorulacağından maliyet fazladır. Bu durumda 100 tuğla için dört kişi çağırmak mantıklıdır ve maliyetleri azaltır.

Yazılımsal olarak gelişmiş bir örnek üzerinden giderek sonuca bakacak olursak, paralel ve seri işlemlerin farkını daha rahat görebiliriz.

Bu örneğimizin senaryosu istatistiksel bir formül olan Standart Normal Dağılım’ın matematiksel formülünü döngü yardımıyla farklı sürelerde hesaplatmaya çalışalım. Burada seçilen formülün Standat Normal Dağılım olmasının hiç bir önemi yoktur. İsterseniz x=2y formülünü de kullanabilirsiniz. Ben işlemler uzun sürmesi açısından bu formülü seçtim.

Formülümüz şu şekildedir:

Bu formülü for döngüsünü 10, 100, 1.000, 10.000, 30.000, … şeklinde farklı değerlere kadar seri ve paralel şeklide hesaplattırıp sonucu bir tabloda incelemeye çalışalım.

İşlemi öncelikler seri işlemler mantığı ile yaparak sonuca bakacak olursak, bir işlemin bitmeden diğerinin başlamadığını göreceğiz. Döngümüz işlemi 10000’e kadar 30 kez yapacak.

For döngüsü adımsal işlem gerçekleştirmekte ve  her döngüyü aynı thread gerçekleştirmektedir. Tüm işlemler 1 numaralı thread tarafından gerçekleştirilmektedir.

Şimdi de işlemi paralel olarak gerçekleştirelim. Aynı şeklide işlemi 10000’e kadar 30 kez yapacak.

Paralel işlemlerde kullandığımız tip System.Threading.Tasks.Parallel olacaktır. Paralel for kullanımı şeklideki gibi basitçe ifade edilmektedir ancak arka planda Task tipleri hemen görevleri bölüşürler.

Paralel işlemi incelediğimizde işlemin 4 farklı thread tarafından yapıldığını ve sürenin seri işlemlerden daha uzun sürdüğünü görmekteyiz. Ancak döngü sayısını arttırdığımızda şu şeklide bir tablo karşımıza çıkacaktır.

Döngü sayısı arttıkça paralel işlemlerin adımsal işlemlerden daha kısa sürede gerçekleştiğini görmekteyiz. Örneğimizde kritik sınır 30.000 olarak görünmektedir.

Senaryonun grafiksel ifadesinden de durumu bu şeklide inceleyebiliriz. Bu sistemi test ederken kullandığım laptop biraz eski olduğundan işlemler uzun sürdü. Intel Centrino Core 2 işlemci üzerinde sonuçları bu şeklide aldım. Farklı işlemcilerde sonuçları test edebilirsiniz. Yorumlara yazabilirseniz karşılaştırma yapabiliriz. Ancak benim deneme yaptığım işlemci modelinden kimsede kalmadığından emin gibiyim. Nesli tükendi artık.

Bir sonraki yazıda görüşmek dileğiyle.

C# Action ve Action ön tanımlı delege türü

22 Ara

Delegeler ile ilgili yazımızda delegeleri tanımlamayı ve kullanmayı incelemiştik. Delegelerin metodları temsil ettiğini ve hangi tür metodların temsil edileceğini ise delegeler oluşturulurken belirlendiğini görmüştük.

Ardından Func<T> ile ilgili yazımızda önceden tanımlanmış delege türü olan Func<T> delege türlerini incelemiştik. Func<T> ile temsil edilen metodların mutlaka bir değer döndürdüğünü belirtimştik.

Bu yazımızda ise delegelerin bir başka özel ve ön tanımlı türü olan Action ve Action<T> delege türünü incelemeye çalışacağız.

Action ve Action<T> delege türleri .Net framework 3.5 ile gelen önceden tanımlanmış bir delege türüdür. Action<T> delege türleri Func<T> delegelerinin aksine hiçbir değer döndürmeyen metodları temsil etmektedir. Action delege türü hiçbir parametre almayan ve değer döndürmeyen metodları temsil eder. Adından da anlaşılacağı üzere bir fonksiyonu değil bir eylemi(action) temsil etmektedirler.

Action<T> delegeleri birden fazla parametre alabilecek metodları da temsil edebilecek şekilde tasarlanmıştır.

Action
Action <T>
Action <T1,T2 >
Action <T1,T2,T3>
Action <T1,T2,…,TN>

Her bir T, metodların alacağı parametrelerin tiplerini belirtmektedir. Func<T> gibi Action<T> kullandığımızda delege tanımlamamıza gerek kalmamaktadır.

Action delegelerinin lambda ifadeleriyle göterimini şu şekilde yapabiliriz:

Lambda ifadelerini kullanmadan metod çağırarak action metod kullanımını şu şeklide kullanabiliriz.

Action delege tipinin kullanımına genelde LINQ ifadeleri ile çalışırken rastlarız. LINQ extension metodlarından Action delege parametre alanlara, uygun metodu parametre olarak gönderebiliriz. Buna bir örnek olarak kişilerin bulunduğu bir listedeki isimlerin önüne “Mr” ön ekini getirerek yazdırmayı deneyebiliriz.

List<T> tipinin ForEach extension metodu, string bir parametre alan metodları temsil etmektedir. Listedeki isimlere tek tek “Mr” ön ekinin nasıl getirildiğini bu şekilde görebilmekteyiz.

Bir sonraki yazıda tekrar görüşmek üzere…

C# Func önceden tanımlanmış delege türü

20 Ara

Delegeler ile ilgili yazımızda delege tanımlamayı ve kullanmayı incelemiştik. Delegelerin metodları temsil ettiğini ve hangi tür metodların temsil edeceğini ise delegeler oluşturulurken belirlendiğini görmüştük.

Bu yazımızda .Net Framework 3.5 ile gelen ön tanımlı delege olan Func<T> tipini incelemeye çalışacağız.

Func<T> önceden tanımlanmış olan ve T tipinde değerler döndüren metodları temsil eden bir delegedir. Func<T> tipi birden fazla parametre ile beslenebilecek şekilde hazırlanmış bir tiptir. Yani bir veya birden fazla parametre alabilecek metodları temsil eden önceden tanımlanmış bir delege türüdür. Func<T> kullandığımızda delege tanımlamamıza gerek kalmamaktadır.

Func<T>
Func<T,Tresult>
Func<T1,T2,Tresult>
Func<T1,T2,…T3,Tresult>

Her bir T metodun alacağı parametre tipini ve TResult ise temsil edilen metodun dönüş tipipni temsil etmektedir.

Örnek: Func<int,string> delegesi int türünden parametre alan ve string türünden değer döndüren metodları temsil eder.

Yukarıdaki örnekte pageurl adında bir temsilciye, desteklediği formda, yani string dönüş tipinde olan ve int tipinde tek bir parametre alan bir metod atanmıştır.

Func<T> ifadesine, daha önceden oluşturulmuş bir metodu temsil ettrebildiğimiz gibi lambda expression ile de daha önceden tanımlanmamış bir metodu da temsil ettirebiliriz.

Yukarıdaki örneği aşağıdaki gibi lambda ifadesi ile de kısa şekilde yazabiliriz.

Func kavramına kısa bir tanımdan sonra biraz da bu kavrama neden ihtiyaç duyulduğundan bahsedelim. Nerede kolaylık sağlamaktadır.

.Net framework ortamına LINQ sorgularının kullanımı sırasında büyük kolaylık sağlamaktadır. Bir listenin içerisindeki verilerin süzülmesi veya verileriüzerinde değişik işlemler yaparken önceden belirlenmiş Func<T> tipindeki temsilcilere göre sorgular yaptırabiliriz. .Net işlerimizi kolaylaştırmak için Func<T> delegelerini oluşturmuş ve kullanımımıza sunmuştur.

Yukarıda List<int> listesi içerisindeki sayılardan 30’dan küçük olanları seçmek için listenin where extension metodunu kullanıyoruz. Where extension metodu Func<int,bool> şeklinde bir delegeyi parametre olarak almaktadır. Select adında oluşturduğumuz metod da int türünde parametre almakta ve bool türünden sonuç döndürmektedir.

Bu ifadenin lambda ifadesi şu şekilde olmaktadır.

Kendi oluşturduğumuz sınıflarımızda da Func<T> delegelerini kullanarak pratik işlemler yaptırabiliriz.

Bu yazımızda:

  • Func<T> delegesinin ne olduğunu
  • Nasıl kullanıldığını
  • Nerelerde karşımıza çıkabileceğini

Görmeye çalıştık.

Tekrar görüşmek dileğiyle…

C# events (olaylar) kavramı

18 Ara

Bir önceki yazımızda delegates (delegeler veya temsilciler) kavramından bahsetmiştik. Delegelerin amaçlarından birinin de event(olay) yakalyıcı metodları temsil eden tipler olduğunu vurgulamıştık.

Olaylar .Net platformunun ileri konularından biri olup ilk anda anlaşılması biraz karmasık gelebilir. Olayları anlamanın yolu da delegeleri anlamaktan geçer. Delegeler konusu anlaşılmışsa olayların (events) anlaşılması da çok basit bir hale gelecektir.

C# ortamında bir event tanımlamak şu şeklidedir:

<erişim belirleyici> event <delege tipi> <event adı>;

Public event QueryEventHandler QueryExecuted;

Public: erişim belirleyicisi. Public veya private olabilir.

QueryEventHandler: delege tipi.

QueryExecuted: event adı.

Event kullanımı .Net platformunda genellikle form tabanlı windows uygulamalarında, silverlight uygulamalarında, network uygulamalarında çok yaygındır. Örneğin bir windows forms uygulamasında bir butona tıklandığında Buton sınıfının Click adındaki event’ı için bir metod oluşturulur ve bu metod içerisine tıklama işlemi sonrası yürütülecek kodları yazabiliriz.

Biz bu yazımızda örnek olarak bir önceki c# delegeler yazımızdaki örneğin aynısını event kullanarak yapacağız. Bu sayede event ve delegate arasındaki bağıntıyı kurmak daha da kolaylaşacak.

Öncelikle bir önceki uygulamamızda ki büyük resme bakarak başlayabiliriz.

Client tarafında oluturduğumuz bir metodu Queryoperation tipinin ExecuteQuery metoduna parametre olarak göndermiştik. ExecuteQuery metodu da bizim gönderdiğimiz metod formunda bir delegeyi parametre aldığı için uygulamamız hiç sorunsuz çalışmıştı.

Bu sefer Queroperation sınıfımıza QueryExecuted adında bir event tanımlayarak bu event’a client tarafındaki bir metodu abone edeceğiz. Sorgu işlemi gerçekleştiğinde abone ettiğimiz metod çalışacaktır.

QueryOperation sınıfının artık QueryExecuted adında bir event’ı var. Bu event, void geri dönüş tipinde tipinde olan ve QueryEventArgs tipinde parametreler alan metodları yakalamakla sorumludur.

Client tarafında olayın nasıl gerçekleşeceğine bakacak olursak.

QueryOperation nesnesinin QueryExecuted event’ına client tarafında oluşturduğumuz, delegemize uygun olan onExecuted metodumuzu abone ediyoruz.

Bir metodun bir event’a abone edilmesi (+=) şeklinde yapılırken aboneliğin sona erdirilmesi ise (-=) şeklinde yapılır.

operation.QueryExecuted-=onExecuted;

şeklinde aboneliği sonlandırabiliriz. Bu sonlandırmadan sonra onExecuted metodu tetiklenmez.

Eğer event’a bir metod abone etmezsek QueryOperation sınıfının ExecuteQuery metodu içerisindeki if(QueryExecuted!=null) şartı false olarak değerlendirilir ve bizim client tarafındaki metodumuz çalıştırılmaz.

Bu yazımızda:

  • C# dilinde event kavramını
  • Event tanımlamasının nasıl yapıldığını
  • Event ve delegate arasındaki ilşkiyi
  • Event’a metod aboneliğini ve aboneliğin sonlandırılmasından
bahsettik.

Tekrar görüşmek dileğiyle…

C# delegate (Delege veya Temsilci) Kavramı

16 Ara

Bu yazımızda C# programlama dilini öğreneneler için bazen işkence haline dönüşen ve bir .Net kavramı olan delegeler üzerinde duracağız. Delegeler, adından da anlaşılacağı üzere temsilcidirler. Temsil ettikleri kavram ise metodlardır.

Delegelerin hangi tür değerleri dönrüren ve ne tür parametre alan metodları temsil ettiklerini tanımlanırken belirleriz.

Bir delegenin tanımlanış şekli aşağıdaki gibidir.

Örnek delege:

<erişim belirleyici> delegate <geri dönüş tipi> <delege adı>(<parametreler>)

 public delegate int Hesaplayici(int a,int b);

Örnek delegemizin tanımlanış biçimindeki ifadelerin ne anlama geldiklerini ise sırayla şu şeklide ifade edebiliriz.

Public: delegenin erişim belirleyicisi. Public veya private olabilir.

int: metodun geri dönüş tipi. Yani geri dönüş tipi int olan metodları temsil ediyor.

Hesaplayici: delegenin adı.

int a, int b: delegemiz, int tipinde iki adet parametre alan metodları temsil ediyor.

Yukarıda tanımlanan Hesaplayici adlı delege, int tipinde değerler döndüren ve int tipinde iki adet parametre alan metodları temsil etmektedir.

Burada aslında kafaları kurcalayan soru işareti, delegelerin bize sağladığı kolaylığın ne olacağı noktasında yatmaktadır.

Delegelerin temel olarak bize iki noktada büyük faydası vardır. Bunlar:

  • Event kullandığımız programlamada olayların yakalanacağı metodları belirlemek.
  • Çalışma zamanında (runtime) hangi tür metodların kullanılabileceğini belirlemek.

Delegelerin daha iyi anlaşılması açısında bu yazımızdaki örnek uygulamızda delegelerin çalışma zamanında (runtime), belirlediğimiz bir metodun temsil edilmesini canlandırmaya çalışacağız.

Senaryo şu şeklide olacaktır: Sql sorgularını icra etmekle sorumlu bir sınıfın metoduna, sorgu sonrasında bizim gönderdiğimiz bir görevi(metodu) yerine getirmesini sağlamaya .alışacağız. Yani bir metoda parametre olarak bir metod göndereceğiz. Sorgu sonrasında bizim gönderdiğimiz metod çalışacak.

Öncelikle query sonuçlarını yakalayan bir delege olan QueryResultHandler adında bir delege tanımlayacağız.

public delegate void QueryResultHandler(QueryEventArgs args);

Query sonuçlarını bildiren QueryEventArgs adında bir tipimiz mevcut. Bu tipte parametre alan ve void yani geriye birşey döndürmeyen metodların temsilcisini tanımlamış olduk.

public class QueryEventArgs
{
     public bool Executed { get; set; }
}

QueryEventArgs tipi aslında sadece sorgu sonucunda işlemin gerçekleşip gerçekleşmediğini argüman olarak bize veren bir tiptir.

Sql sorgu işlemlerini gerçekleştirecek olan tipimizi de QueryOperation adında bir tip olarak belirleyelim.


public class QueryOperation
{
     public void ExecuteQuery(string queryText, QueryResultHandler executed)
     {
        // execute query
        // ...
        // ..
        // .

        QueryEventArgs result =new QueryEventArgs();
        result.Executed = true;

        executed(result);
     }
}

Sınıfımız temsili bir sınıf olduğu için yani sql sorgusu gerçekleştirmiş gibi bir varsayım aptığımız bir sınıf olduğu için içeriğinde sadece ExecuteQuery adında bir metod tanımladık. Bu metod sorgu işlemini gerçekleştirip QueryEventArgs tipinde bir sonuç oluşturmakta ve parametre olarak gönderilen metodu çalışıtrmaktadır.

Şimdi client tarafında nasıl bir operasyon gerçekleştireceğimize gelelim.

static void Main(string[] args)
{
    QueryOperation operation = new QueryOperation();
    operation.ExecuteQuery("select * form Table", onExecuted);
}

public static void onExecuted(QueryEventArgs args)
{
    Console.WriteLine("query executed!");
}

Yaptığımız işlem sadece QueryOperation tipinde oluşturduğumuz bir nesneye sql sorgu parametresini ve sorgu sonrasında bizim client tarafında tanımladığımız bir metodun parametre olarak göndermektir. Bizim burada tanımladığımız onExecuted metodu tam da delegemizin (QueryResultHandler) formuna uyan bir yapıdadır.

Burada farkına varmamız gerekn bir nokta da delegelerin metod pointer(işaretçi) olduğudur. QueryOperation tipinin ExecuteQuery metodu bir temsilciyi parametre alırken, çalıştırılan bir metoddur. Yani temsilciler metodları işaret ederler.

Programı çalıştırdığımızda aşağıdaki gibi bir sonuç karşımıza çıkacaktır.

Bu örnekte:

  • delege tanımlamanın nasıl yapıldığını
  • çalışma zamanında (runtime) belirlenen bir metodun temsilcisinin çalıştırılmasını
  • delegelerinin birer metod pointer(işaretçi) olduğunu

anlamaya çalıştık.

Bir sonraki yazıda görüşmek dileğiyle…