Etiketler

, , , ,


Finalize ve Dispose Tasarımı

Tasarım da göz önüne almanız gerekenlerden önceki yazılarımda bahsetmiştim. Bu yazılarımda, öncelikle etkin kaynak kullanımı ve bunun önemini aktarırken, özellikle Finalize, Dispose, Close kavramları üzerinde durmuştuk. Şimdi etkin Finzalize ve Dispose kullanımdan size bahsedeceğim.

Özetle,
  • Close” ve/ya “Dispose” komutlarını destekleyen nesnelerde bu komutları mutlaka çağırın
  • IDisposable” ara yüzünü uygulayan sınıflarda “using” bloğunu kullanın.
  • using” bloğuna Try/Finally bloğunu tercih ediyorsanız, mutlaka “Dispose” komutunun çağrıldığından emin olun.
  • Gerekmedikçe Finalize” komutunu uygulamayın. Çünkü siz bu komutu çağırmadan, GC sizin yerinize o nesneyi sonlandırmayacaktır.
  • Sadece yönetemediğiniz (unmanaged) kaynaklardaki nesneler için “Finalize” komutunu uygulayın.
  • Eğer “Finalize” uyguladıysanız, “IDisposable” ara yüzünü de uygulayın.
  • Eğer “Finalize” ve “Dispose” uyguladıysanız, bunu Dispose desenini kullanarak yapın. VB.Net de IDisposable ara yüzünü uyguladığınızda, Dispose deseni otomatik olarak sınıfınıza eklenecektir. Tek yapmanız gereken, sizin uygulamanız için bıraktığı Dispose(True) metodunun içini yazmak olacaktır.
  • Dispose metodu içersinde mutlaka nesnenin sonlandırılması konusunda GC ‘a bastırın. (Suppress finalization)
  • Dispose metodunun birden fazla çağrılmasına izin verin
  • Dispose’u ana sınıflar üzerinde ve IDisposable ara yüzün üyeleri üzerinde çağırın.
  • Sonlandırıcı kodu bloke etmeyi önlemek için basit tutun.
  • Eğer tüm tipler “thread-safe” ise, thread-safe temizleyi sağlayın.
Yukarıda belirtiğim kavramlara, özellikle veri erişim katmanını tasarlarken dikkat etmemiz gerektiğini Tasarımda Göz Önüne Almanız Gerekenler – Performans Arttırma / Etkin kaynak yönetimi adlı yazılarımda belirtmiştim.

Peki veri erişim katmanı nedir ? Sadece veri tabanı erişimini mi barındırır ?


Veri Erişim Katmanı


Veri erişim katmanı, projelerinizin dış dünyayla iletişim kurduğu en önemli katmandır. Herhangi bir veri kaynağından verinin okunaması ve yine herhangi bir veri kaynağına veri yazmadan sorumludur. Ülkemizde çoğunlukla sadece veri tabanına olan erişimi yönetmek için kullanılır. Ve malesef çoğu kişi tarafından sadece bu iş için kullanıldığı zannedilir. Bu yüzden bu katmanda olması gereken sayısız sınıf genel de hep dikey katman olarak kullanılan yardımcı işlevleri içeren “utility” katmanına kaydırılır.

Veri erişim katmanı, veri tabanı, dosya sistemi (text, xml …), smtp/ldap sunucusu, raporlama sunucusu(RS) yeri geldiğinde web servis, soket gibi dış kaynaklara erişiminizi yöneten katmandır. Mimarisel açıdan herhangi bir dış kaynağa her zaman bu katman üzerinden ulaşmalısınız. 

Mimari ile ilgili yazılarıma ilerleyen zamanlarda devam edeceğim. Konudan fazlaca uzaklaşmadan, dispose ve close komutlarını kullanabileceğiniz sınıfları size örneklemek istiyorum.
  • Veri Tabanı (Database-Related) yla ilişkili sınıflar: Connection, DataReader, ve Transaction.
  • Dosya (File-Based) bazlı sınıflar: FileStream ve BinaryWriter.
  • Akış (Stream-Based) bazlı sınıflar: StreamReader, TextReader, TextWriter, BinaryReader, ve TextWriter.
  • (Network-Based) bazlı sınıflar: Socket, UdpClient, ve TcpClient.
Yukarıda sınıfların hepsi close ve dispose komutlarını destekler. Bu sınıfları “using” bloğu içersinde kullanmaya özen gösteriniz. Aksi taktirde kaynak yönetimininden sorumlu siz olacaksınız.

Görüşmek üzere,