Respond needs javascript to run. To find out more click here
C# » Sayfa 8 » Serdar Demir
RSS
 

Archive for the ‘C#’ Category

Singleton Design Pattern

06 Mar

Tasarım Desenleri (Design Pattern) ilk duyduğunuzda aklınıza gelen Kullanıcı Arayüzü ile alakalı bir terim değildir. Bunlara, uygulama kodları için oluşturulmuş kalıplardır diyebiliriz. İlk bakışta insana garip gelebiliyor ama öğrenmekten zarar çıkmaz. Belli olmazi bir gün lazım olur.
Baştan uyarayım bu makaleyi anlayabilmek için nesneye yönelik programlamayı bilmeniz gerekmektedir.
Burada Singleton deseninden bahsedeceğim. İlk önce şunu açıklığa kavuşturalım. Bu nerelerde lazım olabilir.
Bir örnekle açıklamaya çalışayım. Bir seçenek yönetici sınıfımız olsun. Bu sınıf uygulamamızda kullanacağımız işlemler için kullanıcı seçeneklerini yöneten özelliklere(property) sahip olsun.

Örneğin:

  1. public string SiteAdresi { getset; }
  2. public int GuncellemePeriyodu { getset; }
  3. // vb…

Seçenek yöneticimiz ile bu değişkenlerin değerlerine ulaşıp uygulamamızda kullanabiliyor ve istersek değiştirebiliyoruz. Haliye bu değişkenlerin değerlerinin bir yerde tutulması gerekir. Bir dosya veya kayıt defteri gibi. Eğer bu seçenek yöneticisi sınıfından birden fazla nesne oluşturulsa, bir nesnenin yaptığı değişiklik diğer nesneler tarafından bilinmeyeceği için karışıklığa yol açabilir. Örneğin bir seçeneğin değerindeki değişikliği sadece değişikliği yapan nesne bilecektir. Diğer nesneler hala eski değeri vereceği için diğer nesnelerin kullanıldığı tarafta hatalar meydana gelebilir. Biraz karıştı gibi değil mi? Bende farkındayım ama toparlamaya çalışacağım.
Bir yerde bir kitap düşünelim. Bu kitap bizim seçenekleri kaydettiğimiz dosya yerine geçecek. Bu kitapta yazanları okuyup bize bildiren 3 kişi olsun. Ayrıca bu kişiler istersek kitapta yazanları değiştirebiliyor. A, B ve C kişileri bu kitabı birer kere okuyup hafızalarına aldıklarını ve sorduğumuzda ezberden cevapladıklarını düşünelim. Seçenek dosyasının okunup değerlerin hafızaya alınması gibi. Biz A kişisine kitaptaki bir yeri değiştirmesini söylediğimizde, B ve C kişileri kitabı bir daha okuyana kadar bu değişiklikten haberdar olmayacaklardır ve sorduğumuzda kitabın eski haline göre cevap vereceklerdir. Bu da karışıklığa yol açacaktır. Oysaki sadece bir kişi bu işten sorumlu olsaydı böyle bir sorun olmazdı.

İşte Singleton bu gibi durumlar kullanılan bir desendir. Bu desende oluşturulan sınıfların sadece bir nesnesi olabilir. Diğer nesnenin oluşturulması programatik olarak engellenir. Yani istense de oluşturulamaz.
Şöyle bir kod düşünelim:

  1. class SecenekYoneticisi
  2. {
  3. public SecenekYoneticisi();
  4. public string SiteAdresi { getset; }
  5. public int GuncellemePeriyodu { getset; }
  6. public void SecenekleriOku();
  7. public void SecenekleriGuncelle();
  8. }

Bu sınıfı sadece bir nesne üretmesine izin verecek şekilde nasıl ayarlarız. Öncelikle bu sınıfın kullanabileceğimiz tek nesnesini oluşturalım. Sonra diğerlerinin oluşturulmasını engelleriz. Sınıfın içerisine sınıfın kendi türünden static ve private bir değişken koyalım.

  1. private static SecenekYoneticisi _yonetici;

Sonra bu private değişkene ulaşabilmek için static bir property tasarlıyalım:

  1. public static SecenekYoneticisi Yonetici
  2. {
  3. get
  4. {
  5. if (_yonetici = null)
  6. _yonetici = new SecenekYoneticisi();
  7. return _yonetici;
  8. }
  9. }

Yukarıdaki kodu incelersek; oluşturduğumuz özellik sadece değişkeni okumamızı sağlıyor. Atamaya izin vermiyor. get bloğunda _yonetici değişkeninin null olup olmadığını kontrol ediyoruz. Eğer boş ise içerisine bir SecenekYoneticisi atıyoruz ve o haliyle geri döndürüyoruz. Boş değilse zaten önceden atanmış bir SeceneYoneticisi vardır ve tekrar atamaya gerek yoktur.

Buraya kadar tamam. Peki başka bir nesne oluşturulmasını nasıl engelleyeceğiz. Bunun için çok küçük bir hile mevcut. Sınıfımızın yapılandırıcısını private olarak yazacağız. Yani:

  1. // public SecenekYoneticisi();
  2. private SecenekYoneticisi();

Bu sayede bu sınıftan nesne üretmek sadece sınıf içerisinde mümkün olabilir. Eğer C++ kullanıyorsak private yapılandırıcıya izin vermeyebilir. Önemli değil, protected olarak işaretlemekte aynı sonucu verecektir.

Sınıfımızın son haline bir bakalım:

  1. class SecenekYoneticisi
  2. {
  3. private SecenekYoneticisi _yonetici;
  4. private SecenekYoneticisi();
  5. public string SiteAdresi { getset; }
  6. public int GuncellemePeriyodu { getset; }
  7. public void SecenekleriOku();
  8. public void SecenekleriGuncelle();
  9. public static SecenekYoneticisi Yonetici
  10. {
  11. get
  12. {
  13. if (_yonetici = null)
  14. _yonetici = new SecenekYoneticisi();
  15. return _yonetici;
  16. }
  17. }

18.  }
Eğer bu sınıfı kullanmak istersek oluşturduğumuz Yonetici özelliğini kullanmamız yeterli.

1.  SecenekYoneticisi.Yonetici.SecenekleriGuncelle();

Elimden geldiğince anlatmaya çalıştım ama böyle bir konu gerçekten ihtiyaç duyana kadar tam olarak anlaşılamayacaktır. Bol bol proje yapmaya çalışın. Her projeniz size yeni birşey öğretsin. Yazım hataları var ise affola. İyi günler dilerim.

 
No Comments

Posted in C#, Makaleler

 

‘Microsoft.Jet.OLEDB.4.0′ sağlayıcısı yerel makine kayıtlı değil hatası

20 Şub

C# ile veritabanı bağlantıları üzerine bir proje vermişti hoca SQL server ve bunun dışındaki diğer veritabanlarına bağlanmak için registy e connection bilgilerini yazacaktık.SQL server la ilgili kısmı yazarken hiçbir sorunla karşılaşmadım fakat access veritabanına bağlanmak istediğimde kodların hepsi doğru olmasına rağmen  ‘Microsoft.Jet.OLEDB.4.0′ sağlayıcısı yerel makine kayıtlı değil diye bir hata verdi.

string baglanti = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\\serdar\\Documents\\Visual Studio 2008\\Projects\\WindowsFormsApplication6\\WindowsFormsApplication6\\Satislar.mdb";

con = new OleDbConnection(baglanti);
con.Open();

Kodları kaç kez kontrol ettim UAC yüzünden olduğunu düşündüm izinleri düzenledim Providerını değiştirdim yine de düzelmedi. En sonunda microsoftun sitesinde http://support.microsoft.com bu problemin çözümünü buldum. Eğer işletim sisteminiz 64 bit ise bu sorunla karşılaşıyorsunuz.

Yapmanız gereken sadece solution explorer ın properties ine tıklayıpaşağıdaki sayfadan Build kısmından x86 yı seçip kaydetmek. Umarım sorunlarınızı çözmeye yardımcı olmuştur.

 
8 Comments

Posted in C#, Makaleler

 

Toplu Adlandırıcı 2

03 Oca

Yaklaşık 1.5 yıl önce, o zamanlar C#’ ı yeni öğreniyordum, Kapatma Sayacından sonra yapacak program arıyordum. Hatırlıyorum, yaz tatilinde evde yapmıştım ilk Toplu Adlandırıcı uygulamasını. O zamanlar içerisinde sadece bir iki String fonksiyonu vardı ama her projem gibi bana bir şeyler öğretmeyi başarmıştı.

Şimdiki C# bilgim o zaman ki bilgimin 2-3 katı diyebilirim. Yani yeni program bence çok güzel bir uygulama oldu. Hatta üniversitelerde ders diye okutulmalı :) .

Aslında ikinci TopAd fikri geçen sene aklıma gelmişti. Hatta bir arayüz, birkaç metod fln. da hazırlamıştım. Fakat, eksik bir şey vardı. Program istediğim gibi sonradan özellik kazandırılabilir değildi. Yani programı nasıl yaptıysam öyle devam edecekti. Programı geliştirmek istesem yine yüzlerce satır kod arasında boğulacaktım ve bunu sadece ben yapabilecektim. Başkasının da katkı yapabileceği bir program (yani modüler program – buna eklenti desteği de diyebiliriz) değildi ve o zaman böyle bir program yazamazdım.

Bu sene (hatta bir kaç hafta önce) System.Reflections üyeleriyle çalışma zamanında uygulamaya kütüphane dahil edilebildiğini öğrendim. Belki daha başlangıç ama yazının girişinde de dediğim gibi her uygulamam bana bir şeyler öğretmiştir.

Önce size bu konuda yüzeysel bir bilgi vereyim. Derinlemesine bilgi isterseniz size Projemi incelemenizi öneririm. Bir uygulamaya çalışma zamanında kütüphane eklemek için:

System.Reflections.Assembly asm = System.Reflections.Assembly.LoadFrom("kutuphane.dll");

metodunu kullanıyoruz. Peki bu kütüphane içerisinde ki sınıfları yani tipleri nasıl kullanıcaz. Bunun için:

Type tip = asm.GetType("MyClass");

metodunun döndürdüğü Type nesnesini kullanıyoruz. MyClass bizim kütüphanemizin içerisindeki bir sınıf. Bu Type nesnesi bizim kütüphanemiz içerisindeMyClass sınıfının bilgisini tutar. Ama biz bilgisini istemiyoruz kullanmak istiyoruz diyorsanız bunun biraz zahmetli olduğunu belirteyim. İlk önce bu tipinYapılandırıcı Fonksiyonlarının bir dizisini elde etmeliyiz. Sonra Invoke(object) metoduyla bu tipin bir nesnesini üreteceğiz.

System.Reflections.ConstructorInfo[] ci = tip.GetConstructors();
object obj = ci[0].Invoke(null);

Yukarıda ki kod sadece parametresiz Yapılandırıcı için geçerli. Parametreli yapılandırıcı için null yazan yere parametreleri yazmamız gerekiyor.obj nesnesi bizim kütüphanemizin içerisindeki ilk tip türünden bir nesne oluyor. Peki bu tip içerisindeki bir metodu çağırmak istersek ne yapacağız. Aslında yukarıdakine benzer bir şey yapacağız:

int i = 5;
System.Reflections.MethodInfo mi = tip.GetMethod("MyMethod");
object ret = mi.Invoke(obj, new object[] { i });

Yukarıda int MyClass.MyMethod(int) prototipine sahip bir fonksiyonun nasıl çağırıldığını anlattım.  Invoke(object, object[]) metodunun ilk parametresi üstte elde ettiğimiz MyClass türünden bir nesne. İkinici parametresi ise bu metoda göndereceğimiz parametrelerin dizisi. Bir tane parametre bile göndersek yine dizi şeklinde göndermeliyiz. Basit bir i tam sayısını parametre olarak gönderiyoruz ve geriye dönen değeri ret nesnesine atıyoruz.

Basit olarak anlatımı bu kadar. Şimdi benim Toplu Adlandırıcı 2 programının özelliklerine bakalım.

  • Eklenti Desteği (Eklenti yazmak ve işin püf noktalarını öğrenmek isteyenler bana mail gönderebilir – ssinanyil@gmail.com)
  • Seçilen dosyalar içerisinde sıralama yapma. (ListViewSortManager için Eddie Velasquez’ e teşekkür ederim. Thanks man! :) )
  • Sürükle bırak desteği
  • Dosyaları isimlendirmeden önce Önizleme özelliği
  • Dosyaları isimlendirdikten sonra Geri Alma özelliği
  • Ayrıca kodları da açık
  • Sadece 552 KB ve taşınabilir

Ekran Görüntüleri :

Daha sonra ekleyeceğim, bu cafe bilgisayarında .NET yüklü değil anlaşılan

İndirmeler :

  • Uygulama Çalıştırılabilir Dosyası için tıklayın. (86 KB – RAR arşivi)
  • Proje dosyaları için tıklayın. (882 KB – RAR arşivi)
  • Eklenti yazmak için gerekli kütüphaneyi indirmek için tıklayın. (4 KB – RAR arşivi)