Geleneksel katmanlı mimari uygulamalar

Herkese merhaba

Kodcu.com ailesindeki ilk yazımda sizelere katmanlı mimari uygulamalar hakkında bir yazı yazmak istedim.Bu yazıda çok katmanlı mimari uygulamaların nasıl olabileceği, tasarlanan mimari stillerin incelemesi  ve bunlar hakkındaki düşüncelerimi bulacaksınız.

Yazılımda mimari nedir ?

Yazılım da mimari yazılım sistemini oluşturan ana katmanların,bileşenlerin,sunucuların ve çeşitli türlerdeki istemci uygulamaların iletişim biçimini göstermek için yapılan çalışmaların hepsini kapsar.Kullanılan teknolojiden bağımsız olarak yapılan bu çalışmalar bir anlamda bütüne bakma çabasıdır diyebiliriz.

Çok Katmanlı mimari nedir ?

Modern dünya da istemciler tarafından o kadar çok istek ve problem var ki yazılım teknolojilerin bunları yerine getirmesi,çözmesi pek de kolay olmuyor.İstenilen her bir fonksiyonellik  yazılım projelerine implemente edilmesi anlamına gelir.İstenilen fonksiyonelliklerin çok fazla olduğunu düşünürsek yazılım projeleri de complex bir hale geliyor. İşte  bu complex yapıyı yönetmek ve değişimi kolaylaştırmak adına projeler belirli bir standarta ve düzene ihtiyaç duyuyor.Çok katmanlı mimari yaklaşım da bu karmaşık yapıyı sorumluluklara , fonksiyonelliklere , İşlere ve görevlere göre birbirinden ayırarak daha basit ve yönetilebilir uygulamalar yapılmasını sağlar.

Uygulama mimarisi istenilen sistemin ihtiyaçlarına,maliyete,zamana ve insan gücüne göre şekillenir.Burada şekillecek olan yapılar; Katman sayısı,sunucu sayısı, kullanılmak istenen teknolojiler ve daha bir çok şey.

Neden çok katmanlı mimari ?

Çok katmanlı mimari ile birlikte projeye ait bir standart oluşturulmaya çalışılır.Bu şekilde geliştiriciler arasında uyum ve geliştirme kolaylığı sağlar.Kodlarınızı katmalara ayırmak;yönetimi kolaylaştırır,değişim sürecini hızlandırır,esnek ve özelleştirilebilir bir yapı sağlar,bakım kolaylığı sağlar, bağımsız şekilde katmanların güncellenmesini sağlar ve daha bir çok avantajını sayabiliriz.Dezavantajı olarak deployment sürecini söyleyebiliriz.Her geliştirme sonucu değişen sistemi güncellemek için deployment (taşıma) yapmak gerekir.Sistem çok ayrışık olduğu için bu zamanınızı alır,özellikle ayrı ayrı sunucuların olduğunu düşünürsek.

Bir de şu şekilde düşünelim; .NET veya JAVA uygulamaları olsun hepsi bir framework çatısı altına kurulmuş teknolojiler ve biz geliştiriciler bu altyapıyı kullanarak yazılım geliştiriyoruz.Bu kadar Standartı ve Sistematik bir mimariye sahip olan bu teknolojiler üzerinde geliştirdiğimiz uygulamalar kesinlikle mimariye ve standartı olmayan yapılar olamaz.Bu bir çelişkidir.Emin olun bu şekilde yazılan uygulamaların desteği ve harcanılan maliyet sonucu, bir süre sonra projenin çöpe atılmasına yol açar.

Çok katmanlı mimari yazılan her projede zaten vardır.İster Veri merkezli(Data Centric),ister alan merkezli (Domain Centric) uygulamalar olsun kodların katmanlara bölündüğünü görürsünüz.Açık kaynak kodlu projelere baktığınızda kodlar dizinlere,isim uzaylarına(namespace) bölünmüş ve bir düzen oluşturulmaya çalışılmıştır.Burada kullanıcının kolay kurulumu ve deployment süreci düşünülerek bu şekilde tasarlanmıştır.Benim burada söylemek istediğim her proje içeirisinde zaten çok katmanlı mimari stil kullanılıyor olması.

Çok katmanlı mimari kullanımı bir seçenek değil zorunluluktur.

Şimdi çok katmanlı mimari ile bir uygulama tasarlamaya çalışalım ve kullanılan standart katmanları ve sorumluluklarını inceleyelim.

Sunucular;

Yaptığımız web uygulamaları genel olarak Client-Server  şeklinde mimariye sahiptir.Bizim uygulama kodlarımız server tarafında çalışır.Burada istemcinin istekde bulunması (Request) ve o isteğe verilen cevap (Response) şeklimizi yazılımcı olarak biz belirtleriz.Projelerde yapmaya çalıştığımız İstemcinin isteğine göre hızlı,doğru bir şekilde cevap vermesini sağlayacak yazılım sistemini(server apps) geliştirmektir.

Yukarıda client-server mimarisine ait bir şema görüyorsunuz.Burada Server tarafındaki çeşitli sunucu tipleri görüyoruz.

Web Server ; uygulamaya ait kullanıcı arayüz kısmının bulunduğu projedir.Bu projede css, javascript , html ,aspx ve çeşitli kaynak dosyalarını barınıdırır.

Application Server ; Uygulamanın tamamının bulunduğu sunucudur ve burada dll dosyaları yer alır.

Database Server ;   Veritabanının fiziksel olarak yer aldığı sunucudur.

Sunucular arası iletişimde şemada belirttiğim (1) nolu iletişim; AJAX,javascript,Jquery veya HTTP ileitşimi kullanılabilir.(2) nolu iletişimde .NET remoting,Web Service,WCF gibi teknolojiler kullanılabilir.(3) nolu ileitişimde ise ADO.NET ,Entity Framework,NHibernate,LinqToSql gibi teknolojileri kullanabiliriz.

Kendi geliştirdiğimiz küçük ve orta düzeyli projelerde maliyet sebebiyle Web Sunucusu , uygulama ve veritabanı sunucusunun işlevini de görür.Fakat Enterprise çözümler söz konusu olduğunda bu serverları kullanmak gerekir.Hatta kurumsal firmlarda yazılan çok fazla ve birbirinden bağımsız uygulamalar olduğunu düşünürsek her uygulama için farklı uygulama sunucusu kullanılabilir.Bu yazımdaki örnek şemada uygulama sunucusu kullanılmayacaktır.

Şimdi şemamızı biraz daha genişleterek devam edelim.

Temel olarak çok katmanlı mimari de standart olarak sunum katmanı,İş katmanı,veri erişim katmanı ve Cross-Cutting denilen, bütün katmanların ihtiyaç duyacağı kodların bulunduğu katman ile birlikte 4 adet katman yer alır.Bu katmanlar birbirlerini referans alarak birbirlerinin method ve sınıflarını kullanırlar.Şimdi katmanları inceleyelim.

Presentation Layer : Yapılan uygulamanın kullanıcı arayüzüne ait projeler bu katmanda oluşturulur.Bu katmanda yapılan projeler; Web uygulamaları,mobil siteler, mobil uygulamalar,Silverlight,Winform veya Html 5 gibi uygulamalarının kullanıcı arayüzüne ait dosyalar yer alır diyebiliriz.

Business Layer : Uygulamanın iş mantığı, Veritabanına ait oprasyonel(CRUD) işlemler , kullanıcı rolleri,yönetimi,yetkilendirmeler bu katmanda yapılan projelerin sorumluluğundadır.

Data Access Layer :  Sadece Veritabanına erişimi sağlamakla sorumlu katmandır.Her veritabanı için ayrı bir veriye erişim sınıfını içerebilir.Kurumsal uygulamalarda  Kullancı tabloları,raporlara ait tablolar,temel uygulama tabloları farklı farklı veritabanlarında bulunabilir.Bu katmanda yazılan veri erişim sınıfı biraz daha soyut ve daha generic bir yapıda olmasına dikkat edilmelidir.

Cross-Cutting Layer : Diğer 3 katmana ait projelerin ihtiyaç duyduğu ve projelerdeki teknik fonksiyonelliği içeren projeleri barındırır.Caching,ExceptionHandler,Loging gibi mekanizmalar bu katmanda yer alır ve ihtiyaca göre diğer katmanda bulunan projelere referans edilir.Burada kullanılan projeler kendi geliştirdiğiniz projelerde veya third party projelerde kullanılır.Örneğin Microsoft best-practices lerinde olan Enterprise Library içeirisindeki block lar kullanılabilir.

Şimdi şemamızı genişletmeye devam edelim.

Yukarıdaki şemada küçük ve orta düzeyli yazılım projelerinde kullanılabilecek olası bir yazılım modeli görülmektedir.

Şimdi katmanlarda yer alan projeleri inceleyelim.

Company.Caching : Verilerin ve sistemde dolaşan varlık(Entity) tiplerinin önbelleğe alınması istemciye hızlı cevap verebilmek için önemlidir. Cache mekanizmanızı her katmanda görebilmemiz mümkün. örneğin UI cache , Database Caching mekanizması ve nesnelere ait önbellekleme sınıf ve methodlarını bu projede yer alır.

Company.ExceptionHandling : Sistem tarafından olası hataların tanımlanması ve hatalar sonucu olınacak aksiyonlar bu proje içerisinde yer alır.örneğin; yetkilendirme hataları, ödeme hataları vb.

Company.Logging : Her seviyede oluşabilecek hatalara veya işlemelere ait bilgi loglarının tutulmasının sağlandığı bir projedir.Çeşitli formatlarda loglama işlemi yapılarbilir.Text dosyaları,EventLog lar, veritabanı logları,xml formatlı loglar vb.

Company.Validation : Genelde validasyonlar UI katmanında client taraflı javascriptler kontrol edilir ve bu kolay,tercih edilen  ve güvenilir bir yöntemdir.Sisteminize geçerliliği olmayan verilerin dolaşmasını kimse istemez ama bazı durumlarda diğer katmanlarda da validasyon kontroller gelebilir.Örneğin methodlara ait argümanların validasyonu veya iş varlıkları (Business Entity) üzerinde Attibute tabanlı validasyon işlemleri gibi.

Company.Helper : Microsoft tarafında daha çok Util ifadesini kullanıyor.Bu proje genel yardımcı sınıflar,methodlar ve extention lar içerir.MailUtil,SitemapUtil,RssUtil,HashUtil gibi.

Company.Security : Bu projeler aslında cross-cutting katmanında da yer alabilir ama veri tabanı iletişiminin çokca kullanıldığı için ben bu projeleri business layer içerisinde tasarlamayı tercih ettim.Bu projeler de kullanıcıya ait işlemrlin bütün sorumluklarını üstlenir.Rol yönetimi,Profil yönetimi,üyelik yönetimi gibi.

Company.Business.Operation : Üst katmandan gelen varlık nesnelerine ait veritabanı işlemlerini , transactionları , sorgulamaları veya batch işlemleri gerçekleştirir.Veri erişimini sağlayan veri erişim katmanına sıkı sıkıya bağlıdır.

Company.DataAccessIntegration : Birden fazla tipde veritabanı kullanan sistemler için veri erişimine ait entgegrasyon projesidir.projelerimize mysql,sql,access,oracle,MongoDb,SqlLite gibi veritabanlarını birlikte kullanma ihtiyacı hissedebiliriz.İşte bu projede veri erişimini ait veritabanı tipinden bağımsız tipler (arayüzler,abstract sınıflar) ver alır.

Çok katmanlı mimariye sahip uygulamalar sadece kodların belirli bir düzen içinde ayrıştırılmasında ibaret değildir. Her katmanı tasarlarken dikkat edilmesi gereken en önemli nokta birbirine olan bağlarının sıkı olmasını engellemektir.Olabilecek her türlü katman ve proje değişimini projenin genelini etkilemiyecek şekilde tasarlamak gerekir.Aynı işleve sahip ama farklı sorumlulukları olan sınıfları arayüzler veya soyut sınıfları(Interface,abstarct class) kullanarak oluşturulmalıyız.

Bu tarz kullanımlara örnek vermek gerekirse ;

Eğer projeniz gereği çeşitli server kontrolleri geliştiriyorsanız bu kontrollerin ortak özellik ve davranışları için temel bir tip(BaseControl) yazmak ve yazacağını kontrolleri bu tipten kalıtmak daha mantıklı bir yaklaşım olur.Örneğin;Business Entity ler için de bu şekilde bir tasarım düşünülebilir.Diğer bir örnek ise Operasyon sınıfları için; operasyon sınıfları sorumlu olduğu tablo için CRUD işlemlerini yapmaktan sorumludur.Bütün operasyon sınıfları için generic bir arayüz yazarak bu işlemlerin entity tipinden bağımsız olarak gerçekleştirmek çok daha kolay bir hale gelir.Buna ait sınıf diagramı aşağıda görebilirsiniz.

Genel olarak katmanlı mimarideki olası projelerden ve işlevlerinden bahsetmiş olduk.

Sonuç olarak ; Yazılım projeleri küçük,orta düzey veya enterprise uygulamalar olsun muhakkak çok katmalı mimariyi kullanıyordur.projenin her seviyedeki kodlama ve tasarımda olası davranış şekileerine ve gelecekde olabilecek değişimlere göre kodlama yaparız.Her seviyede mimari yaklaşım vardır.Örneği; presentation katmanın da MVC kullanılabileceği gibi Webformda kullanılabilir.Her yazılım sisteminin tasarımı mimari kombinasyonlardan oluşur ve bunlar arasındaki uyumu iyi sağlamak gerekir.Bu yüzden mimari stillere ve modellemeye dikkat ederek projelerimizi gerçekleştirmeye özen göstermeliyiz.

Yazıda geçen projeleri kaynak dosyasından indirebilirsiniz.

3 Comments

Post a Comment

Comment
Name
Email
Website