Bu makalemizde katmanlı mimariye kısa bir giriş yapacağız.
Birçok uygulamada iki katmanlı ve bol datasetli bir yapı görmekteyiz. Bu formumuz veya sayfamızdaki gridleri doldurmak için oldukça kullanışlı bir yöntem.
Genellikle uygulamalar bu tarzda ve iki katmanlı yazılıyor. Ancak büyük projeler için bu bahsettiğimiz yöntem yerini 2 den daha fazla katmanın yer aldığı
veri erişim (Data Layer) , iş (Business Layer) ve sunum (Presentation Layer) olmak üzere temelde 3 katmandan oluşuyor ve datasetlerimizin yerini sınıflar alıyor.
Dataset kullanmak işi basite indirir ancak ihtiyaçlar arttıkça aynı kodu tekrar tekrar yazmak programcıyı sıkacaktır. Çünkü düşünün ki bir kontrolü çok yerde kullanıyorsanız projenizde defalarca onu doldurmak hem zaman , hem de iş gücü kaybı olacaktır.
Genel olarak nesne yönelimli programlar 3 veya daha fazla katmandan oluşur demiştik. Burada data,iş ve sunum katmanın dışında ekstra katmanlar da yer alabiliyor. Bileşenler için bir katman , harici DLL ler için bir katman , Exe'ler için bir katman. Bütün katmanlar fiziksel olarak aynı makine üzerinde çalışabileceği gibi farklı makinelere de dağıtmak mümkün.
Uygulamayı katmanlara ayırırken anahtar noktamız değişebileceğini tahmin ettiğiniz kodları birbirinden ayırmak olmalıdır ilk etapta.Böylece mevcut kodu değiştirmeden geliştirme yapmaya olanak sağlamış oluruz.Ayrıca tekrarlanan kod daha fazla hataya sebep olur.
Olası katmanların neler olabileceğine bir bakalım.
Database : Tablo,view,stored prosedürler ve triggerlar diyebiliriz.
Data Access Tier : Veritabanına erişim sağlayan , bağlantıları yöneten kodların bulunduğu katmandır.
ORM : SQL den nesneye veya nesne den SQL e çevirme işlemi yapar , genellikle code generation ile yapılır.
Business Domain Objects : Genellikle property'ler bulunur ve ilişkisel bir mantıkta tasarlanır.
Service Layer : İş akışını yönetir.
Controller Logic : User Interface ile alakalı olmayan mantıksal yapıyı User Interface den ayırmaya sağlar. Bu ayırma işlemini MVC framework te de görebiliyoruz.
UI/View : Kullanıcını etkileşim içinde olduğu katmandır
Aşağıdaki bazı nesnelerin ve kodların hangi katmanda bulunması gerektiğine dair bir tablo var.
Örnek |
Nerede Bulunmalı |
SQL Server, Oracle, MS Access |
Database, DBMS |
stored procedure |
Eğer mantıksal ise Business Domain Object, değilse Database |
ASP page |
UI ve Controller |
ASPX page |
UI |
ASPX page code-behind |
Controller |
Response.Redirect |
Controller |
Windows Form |
UI |
Windows Form code-behind |
Controller |
Address class |
Business domain object |
conn=new OleDBConnection;
conn.Open;
|
Data Access Tier |
myAddress.Street = Reader.GetString(3)
veya
cmd.AddParameter(myAddress.Street)
|
O/R Mapping |
using (DBConn conn = ConnFactory.Create())
{
conn.Save(address);
client.AddressId = address.Id;
conn.Save(client);
}
|
Business Domain |
Yukarıdaki listede ilginç olan ASPX sayfaları UI ve Controller'ın birleşiminden oluşuyor.
Diğer ilginç bir nokta ise stored prosedür mantıksal bir işlem yapıyorsa bu onun Business Logic te olduğunu bize gösteriyor.
Şimdi katmanlı mimarilerde olması gereken olmazsa olmaz bazı noktalara değinelim.
1. Validasyon
Çok katmanlı yapılarda validasyon yapan kodların tekrarlanmaması çok önemlidir. Kullanıcı butona bastığında , controller nesneleri veya service katmanı veriye ihtiyaç duyduğunda , veritabanına kayıt girileceği zaman vs. bir çok yerde validasyona ihtiyaç duyarız. Validasyon yapmadığımız veya validasyon kodunu tekrarladığımızda yanlış veri elde etme şansımız artar.Validasyonu 3 farklı şekilde yapabiliriz:
- Validasyon için ayrı bir bileşen geliştirmeli , hem windows hem de web formları aynı bileşeni kullanarak validasyon işlemini gerçekleştirebilmelidirler.
- Validasyon Business nesnelerine veya controller a koyulmalı ve herhangi bir programcının kodu yazarken bu validasyonları bypass etmesi engellenmelidir.
- Validasyonu veritabanı veya UI 'ye koymak.
hangi yöntemi kullanırsanız kullanın sıfır kod tekrarına erişmek pek te kolay değildir.
2. Güvenlik Problemleri (Security)
- Menüleri veya butonları kullanıya göre enable disable etmek.
- Business layerde kullanıcı bazlı sınırlama koymak örneğin sadece kendi girdiği verileri güncellemesi gibi.
- Veritabanına kısıtlar (constraints) koymak veya prosedür de yetkiyi kontrol ettirmek
3. MVC kullanmak
MVC contoller mantığı ile UI i ayırmak için oldukça etkili bir yöntemdir.Genellikle karmaşık ve iş akışı odaklı yapılarda kullanılır.
4. Transactions
Bir işlem yarım kaldığında onun geri alınması olayı (rollback).Bu genellikle Controller veya Service Layer da bulunur.
5. Yeniden Kullanımı Sağlamak (Re-use)
Şirket bazında sık kullanılan kontrollerin birer bileşen haline getirilip tekrardan kullanımı sağlanmalıdır. Örneğin çalışmakta olduğum şirkette müşteri bilgileri gerekli olduğunda tekrardan veritabanına erişen kodu yazıp bununla vakit kaybetmiyorum , hazır olan bileşeni ekleyip , iş mantığına konsantre olabiliyorum.
Microsoft'un open-source olarak piyasaya sürmüş olduğu Application Blok gibi bir framework kullanmak hem standartlaşmayı sağlar hem de asıl odaklanmamız gereken konulara daha fazla vakit ayırmamızı sağlar.Ancak sadece SQL odaklı olduğu için kimi zaman ihtiyaçlara cevap veremeyebilir.
Bence en güzeli kendi frameworkümüzü yazmak. Tabiki zor ancak ihtiyaçlarımıza en iyi cevabı verecek kod da kendi yazdığımız koddur.
Umarım yararlı olmuştur.Herkese iyi çalışmalar.