C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: deseni islemi kopyalama kopyalanmasi kopyasini metodu nazaran nesneleri nesnelerin nesnenin object projelerde prototip tasarim varolan C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 4.12.2004
Okunma Sayısı : 26724
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 12.4.2021
Turhal Temizer
Mac OS/X Removing CUDA 12.4.2021
Burak Selim Şenyurt
Tie Fighter Değil, Project Tye! 12.4.2021
Burak Selim Şenyurt
Stackoverflow Sevgi Anketinde Yıllardır Bir Numara Çıkan Programlama Dili Rust Kimdir? 12.4.2021
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
"Prototype" (Prototip) Tasarım Deseni
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu yazımda "Creational" desenler grubunda yer alan "Prototype" tasarım deseninden ve bu deseni C# ile nasıl gerçekleştirebileceğimizden bahsedeceğim.

Bu yazıyı okumadan önce tasarım desenleri hakkında ayrıntılı bilgi edinmek ve "Creational" grubundaki diğer desenleri incelemek için aşağıdaki bağlantıları kullanabilirsiniz.

Singleton Tasarım Deseni
Abstract Factory Tasarım Deseni
Builder Tasarım Deseni

"Prototype" deseni yukarıda adı geçen diğer tasarım desenlerine nazaran daha kolay algınmaktadır. Ancak "Prototype" deseni gerçek projelerde diğerlerine nazaran daha az sıklıkta kullanılmaktadır. Bazı spesifik projelerde çok kullanılmakta ve oldukça da faydalı bir kalıptır. "Prototype" deseni adından da anlaşılacağı üzere sonradan oluşturulacak nesneler için prototip görevi üstelenen bir yapıyı oluşturmak için kullanılır. Bir yazılım geliştirici olarak projelerimin bir çok noktasında kullandığım belirli nesnelerin o an için bir kopyasını oluşturmak ve o noktadan sonra yapacağım işleri artık bu kopya nesne üzerinden yapma isteğim olmuştur. Bu isteğimi nesne yönelimli programlama tekniklerini kullanarak bir şekilde gerçekleştirebiliyorum. Böylece hem belirli bir noktadan sonra orjinal nesnemin durumunu korumasını garanti altına almış oluyorum hem de varolan bir nesneyi kopyalarak yeni bir nesne yaratma zahmetine girmemiş oluyorum. Eğer bu kopya nesnelere sık sık ihtiyaç duyarsam bu sefer de kopyalama işleminin hem verimli çalışmasını garanti etmem gerekli hemde kopyalama işlemini tek bir merkezden idare etmem gerekli. İşte bu durumda imdadımıza "Prototype" tasarım deseni yetişmekte. Bu desen varolan bir nesnenin kopyalanarak yeni bir nesneye aktarılmasını kolaylaştıran bir yapı sunmakta. Özetle, bu desen varolan nesnelerin kopyalanması yolu ile yeni nesnelerin üretilmesi için gerekli olan kalıbı sunmaktadır. Bu yapıyı aşağıda örneklendireceğim ancak öncelikle nesne kopyalama çeşitleri üzerinde durmak gerekir.

Nesnelerin kopyalanması 2 şekilde olabilmektedir. Birinci yöntem "shallow copy" denilen ve sadece nesnelerin referanslarının kopyalandığı klasik atama işlemlerinde meydana gelen kopyalama biçimidir. Bu tür bir kopyalamada yalnızca nesnenin bellekteki adresi kopyalanmaktadır. Dolayısıyla bu yöntem burada bahsedilen "Prototype" desenine pek uygun değildir. İkinci yöntem ise "Deep Copy - Derin Kopyalama -" denilen yöntemdir ki bu yöntemde nesneler birebir kopyalanarak yeni referans değişkenine atanır. C#’ta değer türlerinin birbirlerine atanması bu tür bir kopyalama işlemine örnek olarak verilebilir. Fakat "Prototype" deseninde söz konusu olan referans türden nesnelerin "deep copy" yöntemi ile kopyalanmasıdır.

.NET Framework içerisindeki IColoneable arayüzünde bulunan Clone() metodu genellikle "shallow copy" yapmak için kullanılır. IClonable arayüzünü uygulayan sınıf nesneleri ile Clone() metodu kullanıldığında geriye dönen değer bellekteki varolan nesneyi işaret eden referanstan başka birşey değildir. Ancak clone metodu değer tipleri için kullanıldığında sınıflar için birinci seviyeden "Deep Copy" olarak ta kullanılabilmektedir. "Deep Copy" işlemi için .NET’te genellikle Serialization API’si kullanılmaktadır. Bir nesnenin yeni bir kopyasını elde etmek için nesnenin durumu seileştirilerek bir dosyaya kaydedilir ve dosyadan okunan serileştirilmiş bilgiler yeni bir nesneye aktarılır. Bu yazıdaki "Prototype" deseni uygulamasında nesnelerin kopyasının çıkarılması aşamasını Object sınıfını protected üye metodu olan MemberWiseClone() metodunu kullanacağız.

"Prototype" deseninde üç temel yapı bulunmaktadır. Bu yazpılar aşağıdaki gibi listelenmiştir.

  •  Soyut Prototip :Kopyalanarak yeni nesnelerin oluşturulacağı sınıflar için temel teşkil eden ve çoğunlukla içinde kopyalama işlemini görecek özet bir metodun bulunduğu abstract sınıftır yada içinde sadece bildirimlerin yer aldığı bir arayüzdür. İhtiyaca göre bu yapı özet(abstract) bir sınıf olabileceği gibi bir arayüzde olabilir.

  •  Somut Prototip Nesneleri :Soyut nesneleri uygulayan ve projelerde kullanılan gerçek nesneleri temsil ederler. Kopyalama işlemi soyut sınıftan kalıtılan bir metot ile yapılır.

  •  İstemci(Client) Uygulama :Somut prototip nesnelerinden birer kopyasını elde edecek metot, sınıf yada başka bir üye elemandır.
Not : Görüldüğü üzere, "Prototype" deseni daha önce anlatmış olduğum desenlere nazaran çok kolay ve anlaşılırdır. Bu kolaylığın en büyük nedenlerinden biriside nesnelerin kopyalanması için .NET Framework’un sağlamış olduğu imkanlardır.

Bütün bu bilgiler ışığında "Prototype" deseninin UML sınıf diyagramı aşağıdaki gibi çizilebilir.



Yukarıdaki UML sınıf diyagramına bakarak aşağıdaki kodları çıkarmak ise son derece basittir. Aşağıdaki kaynak kod, "Prototype" tasarım desenine ait en temel kalıbın C# ile gerçekleştirilmesidir.

using System; abstract class SoyutPrototip
{
      public int prototypeID;

      public SoyutPrototip( int pid )
      {
            this.prototypeID = pid;
      }

      //Kopyalama işleminde kullanılacak metot
      //Metodun geri dönüş değerine özellikle dikkat edin.
      public abstract SoyutPrototip Clone();
}

class SomutPrototipNesne1 : SoyutPrototip
{
      public SomutPrototipNesne1(int pid) : base (pid) {}

      public override SoyutPrototip Clone()
      {
            //Kopyalama işlemi için Object sınıfının
            //protected üye elemanı olan MemberWiseClone()
            //metodu kullanılıyor.
            return (SoyutPrototip)this.MemberwiseClone();
      }
}

class SomutPrototipNesne2 : SoyutPrototip
{
      public SomutPrototipNesne2(int pid) : base (pid) {}

      public override SoyutPrototip Clone()
      {
            //Kopyalama işlemi için Object sınıfının
            //protected üye elemanı olan MemberWiseClone()
            //metodu kullanılıyor.
            return (SoyutPrototip)this.MemberwiseClone();
      }
}

class İstemciUygulama
{
      public static void Main()
      {
            SomutPrototipNesne1 sp1 = new SomutPrototipNesne1(34);
            SomutPrototipNesne1 sp1_kopya = (SomutPrototipNesne1)sp1.Clone();

            sp1.prototypeID = 6;

            Console.WriteLine(sp1.prototypeID.ToString());
            Console.WriteLine(sp1_kopya.prototypeID.ToString());
      }
}


C# kaynak kodundan da görüldüğü üzere "Prototype" tasarım deseni çok basit bir kalıp sunmaktadır. Belkide birçoğumuzun zaten projelerinde kullandığı bir yapı olabilir. Bu yazı ile birlikte kullandığımız yapıya sadece bir isim vermiş olduk.

"Protptype" deseni il birlikte "Creational" desenler grubunu bitirmiş olduk. Bir sonraki yazımda "Structural -Yapısal-" desenler grubundaki "Adaptor" tasarım desenini inceleyeceğiz.

Makale:
"Prototype" (Prototip) Tasarım Deseni C#, Visual C# ve .NET Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor