Facebook’a Rakip Geliyor…

07 Ağustos 2010 Yorum bırakın

Dünyanın en büyük arama motoru Google’ın, Facebook’a rakip olacak bir sosyal iletişim ağı geliştirme projesi kapsamında oyun şirketleri ile görüşmeler yaptığı belirtiliyor.

Hürriyet Gazetesinin haberine göre (ve onunda Wall Street Journal gazetesinden aldığı habere göre), şirketin Playdom Inc, Electronic Arts’a bağlı Playfish ve Zynga Game Network ile görüştüğü ifade edildi. Söz konusu üç şirket, Facebook’taki Farmville, Treetopia, Pet Society ya da “Who has the biggest brain?” gibi oyunlarda uzmanlaşmış bulunuyor.

Haberin devamı için :

Design Patterns – Abstract Factory

07 Ağustos 2010 Yorum bırakın

Merhaba Arkadaşlar,
Bu günkü yazımda Creational Pattern sınıfından abstract factory tasarım deseninden bahsetmeye çalışacağım.Bu tasarım desenindeki ama istemcinin kullanması gereken nesneleri istemciden tamamen ayırarak yani istemciden tamamen bağımsız nesneler oluşturan birer soyut sınıflar oluşturacağız.
Oluşturduğumuz soyut sınıfların nesneleri yukarıda belirttiğim gibi istemciden bağımsız tamamen arka planda oluşturulacaktır.
Oluşturduğum UML şemasını dikkatlice incelerseniz kafanızda soyut sınıfların yapısı zihninizde oluşacaktır.

Senaryomuzdan bahsedelim kısaca;

Uygulamamız 2 ayrı veriabanına bağlantı sağlayabilen bir uygulama.SQL yada Interbase veritabanlarının connection ve command nesnelerini oluşturabileceğimiz birer nesneye ihtiyacımız olacaktır.

UML şemasına dikkat edecek olursanız 3 adet abstract sınıftan oluşan toplamda 6 adet sınıfımız var.ConnectionFactory adındaki abstract classımızdan oluşan 2 adet concrete classımız var bu sınıflarımızın dönüş türü yine birer soyut sınıf tipinde olacaktır.Bunlar createcommand methodu Command2 abstract türünden,CreateConnection methodu ise Connection2 türünden değer return edecektir.

Burada bir dip not düşeyim:Uygulamada Abstract sınıf yerine Interface de kullanılabilir.Ben abstract ı tercih ettim fakat siz Interface kullanabilirsiniz.Hatta çoğu kişi Interface i daha kullanışlı görüyor.Size kalmış :)

Senaryomuza göre istemci sadece concrete product sınıflarımızdan sadece oluşturmak istediği sınıf türünü belirtecektir.Bu belirtilen nesneye göre biz command ve connection nesnelerini oluşturacağız.

Abstract Classlarımızın yapısı şu şekilde olacaktır:

public abstract class ConnectionFactory
{
public abstract Connection2 CreateConnection();
public abstract Command2 CreateCommand();
}

public abstract   class Connection2
{
public abstract bool Connection();
public abstract bool Disconnect();
public abstract string State
{
get;
}
}

public abstract class Command2
{
public abstract void execute(string query);
}

Öncelikle sınıfları implement edeceğimiz abstract sınıfları tanımladık.Dikkat ederseniz ConnectionFactor isimli sınıfımızdaki methodların dönüş türü diğer iki abstract sınıf türünde.Bu bize istemcinin belirttiği sınıfın nesnesinin oluşturulup içerisindeki methodların çalıştırılmasını sağlayacaktır.

Hemen Concrete Classlarımızı oluşturalım.



public  class Db2Database
: ConnectionFactory
{

public override Connection2 CreateConnection()
{
return new Db2Connection();
}

public override Command2 CreateCommand()
{
return new Db2Command();
}
}

public  class InterBaseyap
: ConnectionFactory
{

public override Connection2 CreateConnection()
{
return new InterBaseCOnnectin();
}

public override Command2 CreateCommand()
{
return new InterBaseCommand();
}
}

ConnectionFactory sınıfımızdan implement olan sınıflarımızı oluşturduk.Dikkat ederseneiz connection ve command nesnelerini oluşturup istemciye return edecektir.Hemen return edilecek olan connection ve command sınıflarını oluşturalım.



public class Db2Connection
: Connection2
{
public override bool Connection()
{
Console.WriteLine("Db2 bağlantısı açılacak");
return true;
}

public override bool Disconnect()
{
Console.WriteLine("Db2 bağlantısı kapatılacak");
return true;
}

public override string State
{
get { return "bağlnatı durum"; }
}
}
public class InterBaseCOnnectin
: Connection2
{
public override bool Connection()
{
Console.WriteLine("Interbase bağlantısı açılacak");
return true;
}

public override bool Disconnect()
{
Console.WriteLine("Interbase bağlantısı kapatılacak");
return true;
}

public override string State
{
get { return "bağlnatı durum"; }
}
}

public class Db2Command
: Command2
{
public override void execute(string query)
{
Console.WriteLine(query );
}
}

public class InterBaseCommand
: Command2
{
public override void execute(string query)
{
Console.WriteLine(query );
}
}

Evet ConnectionFactory den dönecek olan connection ve command sınıflarını oluşturduk.UML şemasındanda incelerseniz sınıflarımız command2 ve connection2 abstractlarından implemet edilmiş durumda.Methodların iç yapılarını sadece bilgilendirmek amaçlı console.writeline komutunu kullandım.Siz methodların iç yapısını kendinizce geliştirebilirsiniz.

Şimdi bu sınıflara bağlı olarak istemcimizi oluşturalım.



public class Factory
{
private ConnectionFactory _CnnFactor;
private Connection2 _Connection;
private Command2 _Command;
public Factory(ConnectionFactory istemciConnection)
{
_CnnFactor = istemciConnection;
_Connection = _CnnFactor.CreateConnection();
_Command = _CnnFactor.CreateCommand();
}

public void Basla()
{
_Connection.Connection();

_Connection.Disconnect();

_Command.execute("Giden Sorgum");

}
}

İstemcimiz bir constructor ve bir boş değer döndüren Basla methodundan oluşuyor .Senaryoyu anlatırken bahsetmiştim istemci hangi nesneyi oluşturacağını bildirdiği zaman o nesneye göre methodları çalıştıracaktır.Bu yüzden constructor ımız ConnectionFactory ( ki bu soyut sınıfımız diğer iki abstract sınıfın nesnesini return ediyordu)  sınıfından bir parametre alıyor. ve _Connection değişkenine atama yapıyor.

Basla methodu ise _Connection değişkeninin barındırdığı nesneye göre connection ve command sınıflarının methodlarını çalıştırıyor.

Şimdi Factory sınıfını Main de çağıralım.


static void Main(string[] args)
{
Factory faprika = new Factory(new InterBaseyap());
faprika.Basla();
Console.ReadLine();
}

Görüldüğü gibi Factory sınıfının nesnesi oluşturulurken ConnectionFactory abstractından türeyen Interbase yap sınıfını parametre olarak gönderiyor.Sınıfın constructor ında bu atama gerçekleşiyor.Hemen ardından Basla() methodu çalıştırılıp istenen Connection ve Command oluşturuluyor.

Şimdi programın çıktısına bakalım…

Uygulamalarınızda bu şekilde nesne fabrikaları kurmak isterseniz abstract factory tam size göre.

Umarım anlatabilmişimdir.

Herkese İyi günler…

Temsilci(Delegate) Kavramı

05 Ağustos 2010 Yorum bırakın

Merhaba Arkadaşlar,
Bugün .netin bize getirdiği büyük avantajlardan biri olan temsilcileri anlatmaya çalışacağım.
Temsilci (Delegate) bir yada birden fazla methodu işaret eden (referans da diyebiliriz) nesnelerdir.Uygulamamızda bir temsilci kullanmak istiyorsa öncelikle tasarım zamanında temsilci tanımlamasını yaparız.Tanımlama işlemi method tanımlarıyla hemen hemen aynıdır.Tek fark “delegate” sözcüğünün kullanımıdır.Tanımlama esnasında temsilcinin dönüş türü.tipi,parametresi işaret ettiği method yada methodların yapısınıda belirtir.Yani Temsilciler sadece aynı yapıda methodları işaret edebilir diyebiliriz.

[Erişim Belirleyicisi] delegate [Geri dönüş tipi] [Temsilci ismi](Varsa parametre);

Bir temsilcinin tanımlama yapısı kabaca yukarıdaki gibidir.Temsilciler Single-Cast ve Multi-Cast olarak iki şekilde çalışır.Tasarım zamanında tek bir temsilci tanımlayabilriz.Bu tek bir temsilci bir methodu işaret edebileceği gibi birden fazla methoduda işaret edebilir.Bu Single-Cast olarak bilinir.Ayrıca tek bir temsilci birden fazla temsilciyi etrafında toplayarak bu temsilcilerin işaret ettiği tüm methodlarıda tek seferde çalıştırabilir.Bunada Multi-Cast diyoruz.

Şimdi Single-Cast çalışma şekline bakalım…

Yukarıdada kabaca anlattığım gibi önce temsilcimizi tanımlıyoruz.Tanımladığımız temsilcinin yapısı işaret ettiği methodlarla aynı olacaktır.Sonra bir karar verici methodumuz olacaktır.Bu method bir Factory Method gibi çalışıp temsilcilere işaret edecekleri methodları gösterecektir.

Başlayalım…

class Class1
{
public static int sayi;

public delegate void Temsilci(int deger); //Temsilcimizi tanımladık

public void Calistir(Temsilci T) // Karar verici methodumuz
{
T(sayi); //Methodlara göndereceğimiz integer türündeki değişkeni bu methoddan alıyoruz
}
}

Bu sınıfımızda temsilcimizi tanımladık.Dikkat edin temsilcinin  işaret edeceğimiz method yapısıyla aynı olacaktır.Arkasından karar verici methodumuzu oluşturuyoruz.Aldığı parametre ise çalışma zamanında oluşturulacak olan temsilcimiz olacaktır.

class Class2
{
//Temsilcimizin işaret ettiği methodları tanımladık
public static void iKiKat(int Sayi)
{
Sayi = Sayi * 2;
Console.WriteLine("ikikat Methodun temsilcisi tarafından çağırıldı:  " + Sayi.ToString());
}
public static void UcKat(int Sayi)
{
Sayi = Sayi * 3;
Console.WriteLine("UcKat Methodun temsilcisi tarafından çağırıldı:  " + Sayi.ToString());
}
}

Temsilcimizin işaret edeceği Methodlarıda tanımladık.Yapı olarak temsilcimizle aynı olduklarına dikkat edin.

static void Main(string[] args)
{
//İşaret edecekleri Methodları belirterek <code>Delegateler oluşturuluyor
Class1.Temsilci Temsil1= new Class1.Temsilci(Class2.iKiKat);
Class1.Temsilci Temsil2 = new Class1.Temsilci(Class2.UcKat);</code>

//Ekrandan bir sayı girilmesini istiyoruz
Console.WriteLine("Bir sayı giriniz");
Class1.sayi=Convert.ToInt32(Console.ReadLine());

//Class1 içerisindeki Calistir methodu sayesinde temsilcilerimize sayı gönderebiliyoruz
Class1 Calistir = new Class1();

Calistir.Calistir(Temsil1);
Calistir.Calistir(Temsil2);

}

İstemci olarak sunduğumuz Main blogunda temsilcilerimizin nesnesini oluşturuyoruz.Oluşturuken referens olarak işaret ettikleri methodları gösteriyoruz.Ekrandan bir sayı girilmesini ve o sayının kararverici method içerisindeki sayı olacağını belirtiyoruz.Sonra kararverici methodu çalıştırıyoruz.Dikkat edin Karar verici methodun parametresi bizim tanımladığımız bir delegate türündeydi.

Genel olarak Single-Cast yapısında delegate kullanımı bu şekilde arkadaşlar.Çok ileri seviye  uygulamalar geliştirmek isterseniz delegate yapısını gösü kapalı bilmeniz gerekecektir bence :)

Herkese iyi çalışmalar…