Merhaba,
3 yıl önce delegeler hakkında bir şeyler yazmıştım. X bilişim firması çalışanı bir kişi pek açıklayıcı bulmamış o yazıyı.
Neyse, daha açıklayıcı bir örnekle ve gündelik kullanıma daha yakın şekilde yeniden delegete’lerden bahsedecek olursak ;
Özetle Delegeler, belli bir olay sonrasında çalıştırılması gereken metodların olay yeri tarafından bilinmeksizin çalıştırılmasını sağlayan yapılardır. En temel örnek olarak System.EventHandler gösterilebilir. Windows Forms içerisinde kullanılan default tüm click, load eventlarının handle edilmesi için bu delegate kullanılır.
Benzeri şekilde kendi delegemizi oluşturacak olursak;
namespace Tolpp.Delegates2.Context | |
{ | |
/// <summary> | |
/// Kullanicilar uzerinde yapilan islemleri handle eden temel delegate | |
/// </summary> | |
/// <param name="user">Uzerinde islem yapilan kullanici</param> | |
public delegate void UserEventHandler(User user); | |
/// <summary> | |
/// Kullanicilar uzerinde islemlerin yapildigi siniftir | |
/// </summary> | |
public class UserContext | |
{ | |
/// <summary> | |
/// SaveUserToDatabase isimli static metodu UserCreated isimli UserEventHandler'a atiyoruz. | |
/// Dogrudan metod ismi ile verdigimiz icin Implicit delegate creation yapmis olduk. | |
/// </summary> | |
private UserEventHandler UserCreated = SaveUserToDatabase; | |
public UserContext() | |
{ | |
// SendRegisterationSmsToUser metodu UserCreated delegete'i icine atiliyor. | |
UserCreated += SendRegisterationSmsToUser; | |
// NotifyManager metodu UserCreated delegete'i icine atiliyor. | |
// Delegate new UserEventHandler() seklinde olusturuldugundan Explicit delegate creation yapmis olduk. | |
UserCreated += new UserEventHandler(NotifyManager); | |
} | |
public void CreateUser(string username, string mobilPhone) | |
{ | |
//.. | |
User user = new User() | |
{ | |
Username = username, | |
MobilePhone = mobilPhone | |
}; | |
//.. | |
//Kullanici yaratildi event'i tetikleniyor. Kullanici yaratildiktan sonra yapilmasi gereken | |
//islemler otomatik olarak yapiliyor. | |
UserCreated(user); | |
} | |
/// <summary> | |
/// Kullaniciyi database uzerine kaydeden metod | |
/// </summary> | |
/// <param name="user">Yaratilan kullanici</param> | |
private static void SaveUserToDatabase(User user) | |
{ | |
//.. Database islemleri | |
Console.WriteLine(user + @" Database'e kaydedildi"); | |
} | |
/// <summary> | |
/// Kullaniciya kayit sonrasi sms gonderen metod | |
/// </summary> | |
/// <param name="user">Yaratilan kullanici</param> | |
private void SendRegisterationSmsToUser(User user) | |
{ | |
//..Sms gonderim islemi | |
Console.WriteLine(user.MobilePhone + @" numarasina sms gonderildi."); | |
} | |
/// <summary> | |
/// Kullanıcının kaydolduguna dair yoneticiyi bilgilendiren metod | |
/// </summary> | |
/// <param name="user">Yaratilan kullanici</param> | |
private void NotifyManager(User user) | |
{ | |
//.. Yoneticiyi haberdar etme islemi | |
Console.WriteLine(user.Username +@" Manager'a haberdar edildi."); | |
} | |
} | |
/// <summary> | |
/// Kullanici'ya ait bilgilerin tutuldugu siniftir. | |
/// </summary> | |
public class User | |
{ | |
public string Username { get; set; } | |
public string MobilePhone { get; set; } | |
public override string ToString() | |
{ | |
return Username; | |
} | |
} | |
static class Program | |
{ | |
static void Main() | |
{ | |
UserContext context = new UserContext(); | |
context.CreateUser("tolpp","+905320001122"); | |
} | |
} | |
} |
Yukarıda UserEventHandler isminde, kullanıcı işlemleri için kullanılacak bir delegate yaratılmıştır. Bu tanımlama class seviyesinde, doğrudan namespace içerisinde yapılmıştır.
UserContext içerisinde kullanıcının yaratılma işlemi sırasında sırayla çağrılması gereken metodlar UserCreated isimli UserEventHandler isimli delegate içerisinde atılmıştır.
Bu sayede, CreateUser metodu içerisinde UserCreated delegate’i bir kez çağrılarak SaveUserToDatabase, SendRegisterationSmsToUser ve NotifyManager metodları da aynı anda çağrılmış olur. Bu durum için delegate kullanımının en büyük artısı, kullanıcı yaratımından sonra hangi işlemlerin yapılacağı kısmı ile CreateUser metodunun ilgilenmemesidir. Delegate sayesinde CreateUser metodu ile diğer işlemleri birbirinden ayırmış olduk (bkz. loose coupling)