Taslak Çalışmalarım

English (Ä°ngilizce)

Friday, August 05, 2005

Primitif Veriler veya İçiçe Katmanlar

Kaliteli yazılım geliştirmeyle ilgili pekçok kural var. Bunlardan bir tanesi, diğer pek çok kuralı kaynağı olan bir kural: Encapsulation veya Abstraction. Yani Türkçesiyle, soyutlama veya kapsülleme (biraz tuhaf bir çeviri :). Biz soyutlama diyelim...

Soyutlama, primitif veriyle (yani integer, character, String gibi veriler) doğrudan doğruya iş yapmanın doğru olmadığını söylüyor. Çünkü primitif veriyi doğrudan doğruya istemci (client) tarafında manipüle etmek, servisin (service) kullanılmasını zorlaştırıyor. Her istemci, servis sunanın iç yapısına bağımlı oluyor.

Not: Servis kelimesini, herhangi bir hizmet sunan nesne veya fonksiyon anlamında, istemci kelimesini, herhangi bir fonksiyonu kullanan nesne anlamında kullanıyorum. Mesela,


class A {
void f() {
B b = new B();
b.g();
}
}


Burada A istemci tarafıdır. B servis sunan taraf. g() fonksiyonu da, sunulan servistir.

Yukarıdaki örnekte, A B´nin iç yapısından hemen hemen tamamıyla soyutlanmış (B nesnesini doğrudan A´nın kendisi oluşturmasından dolayı, tam soyutlanma sayılmaz.)

A, B´nin g() fonksiyonu içinde ne yaptığına dair hiçbir varsayımda bulunmuyor ve herhangi bir primitif veriyi, B´nin doğru çalışması için işlemiyor.

Buraya kadar her şey güzel.

Soyutlama ilkesinin bir başka sonucu daha var: Farklı işlerle uğraşan (sorumluluklara sahip) nesneler, farklı katmanlar (layers) içinde olmalı. Katmanlar arasındaki nesneler birbiriyle az iletişim kurmalı. Bir katmanda yürütülen fonksiyonalitenin bir kısmı veya benzeri başka bir katmanda yürütülmemeli.

Bu ilke, MVC (Model-View-Controller), DAO (Data Access Object) gibi pek çok dizayn kalıbının (design pattern) da temelini oluşturuyor. MVC´ye göre, görünüm katmanı (view) model (yani iş nesneleri) katmanına ait herhangi bir bilgiye sahip olmamalı.

Buraya kadar her şey güzel. Ancak şu problemimiz var: Görünüm nesneleri, model nesnelerine erişemedikleri halde nasıl bunların içindeki veriyi kullanıcıya gösterecek? Bu soruna, data binding (yani veri bağlama) sorunu deniyor.

Masaüstü uygulamalarında bunun güzel bir çözümü, gözlemci (observer) kalıbını kullanmak. Javada, JGoodies Binding çerçevesi (framework) bu işi çok kolaylaştırıyor. Ancak web uygulamalarında, bu çözüm işlemiyor. Farklı web çerçevelerinin farklı çözümleri var: Bazısı, Data Transfer Objectleri (DTO) kullanıyor, bazısı doğrudan model nesnelerinin propertylerini (yani verilerini) görünüm katmanına bağlayan ara bir katman kullanıyor...

DTO´lar sadece primitif veri içeren, model nesnelerinin birer kopyası. Ancak herhangi bir fonksiyonaliteleri yok. DRY (don´t repeat yourself) yani bir şeyin bir başka yerde yinelenmemesi ilkesini ihlal ediyor. Ek bir ara dönüştürücü katmana ihtiyaç duyuyor.

Doğrudan model nesnelerine erişmek, ilk bakışta güzel görünüyor. Ancak bu durumda da, katmanlaştırma ilkesi ihlal ediliyor. Çünkü görünüm nesneleri, model nesnelerine bağımlı kılınıyor. Bunun sebep olduğu en önemli sorunlardan biri, nesnelerin bayatlaması (stale). Yani görünüm katmanının eriştiği bir model nesnesi, veritabanındaki güncel halinden farklı veri tutabiliyor. Bu da pekçok bug oluşturuyor.

Bu sorunu çözmek için, nesnelere doğrudan referans yerine, belki onların veritabanından yeniden çekilebilmesini sağlayacak veritabanındaki primary keylerinin saklanması kullanılabilir. Ancak bu durumda da, soyutlama ilkesinin, primitif verilere erişimi sınırlama kuralı ihlal ediliyor.

Bu sorun üzerinde biraz daha yazmayı planlıyorum. Yorumlarınızı beklerim...

0 Comments:

Post a Comment

<< Home