Çok Katmanlı Veritabanı Uygulamaları çin Esnek Bir Vb.Net Kodu Üreticisi: Code Generator 1 Mustafa YILDIZ, 2 Orhan KARAHASAN, 3 Selahattin KURU 1 Teknopazar A.., ITU Ayazaa Kampüsü, ARI Teknokent No:9, 34469 Maslak, stanbul 2,3 Iık Üniversitesi, Enformatik Uygulama ve Aratırma Merkezi Büyükdere Caddesi, 34398 Maslak, stanbul 1 mustafa.yildiz@is.net.tr, 2 orhan@isikun.edu.tr, 3 kuru@isikun.edu.tr Özet Birçok yazılım mühendislii uzmanının kaynak kodun okunabilirliini, yönetilebilirliini ve tekrar kullanılabilirliini belirgin biçimde artırdıı savı ile savunduu, destekledii ve önerdii çok katmanlı yazılım mimarisi yakın zamanda Microsoft firması tarafından da biçimsel bir mimari önerisi ile desteklenmitir. Bu mimariye göre yazılım, kullanıcı arayüzleri seviyesinden itibaren veritabanı seviyesine kadar çok sayıda mantıksal katmana ayrılmı ve saklanmı yordam (stored procedure) kullanımı tevik edilmitir. Bu çalımada, önerilen bu çok katmanlı mimari dorultusunda veritabanı katmanı, veri eriim katmanı, i varlıkları katmanı ve i mantıı katmanı olmak üzere dört farklı katmana ait kaynak kodlarını büyük ölçüde otomatik olarak üreten bir kod üreticisi gelitirilmitir. Bu bildiride önerilen mimarinin detaylarına, gelitirilen kod üreticisinin özelliklerine ve kod üreticisinin verimini ortaya koyan bazı ölçüm sonuçlarına deinilmektedir. Abstract Many software engineering experts supports and recommends the use of n-tier architecture due to its significant contributions to the readability, maintainability and reusability of the source code. Recently Microsoft declared a formal architecture description on the use of n- tier architecture clearly dividing the code into logical layers from presentation tier to data access tier and encouraging the use of stored procedures. In this work a code generator tool was developed which produces code for database layer, data access layer, business entities layer and business logic layer. This paper reports the details of the tool and results of some measurements regarding the efficiency of the tool. 1. Giri Bu bildiri çok katmanlı mimariye uygun olarak gelitirilen veritabanı uygulamalarının veritabanı katmanı, veri eriim katmanı, i varlıkları katmanı ve i mantıı katmanına ait kaynak kodları belirli bir oranda otomatik olarak üreten esnek bir kod üreticisini tanıtmaktadır.[1] Gelitirilen kod üreticisi araç, Microsoft firmasının önerdii çok katmanlı mimari standartlarına uygun olarak çalımaktadır ve orta büyüklükte bir veritabanı uygulaması yeniden mühendislii projesinde denenmitir. Proje tek katmanlı olarak gelitirilmi olan internet tabanlı bir finans uygulamasının çok katmanlı olarak yeniden yazılmasını içermektedir. Bildiride Microsoft tarafından önerilen çok katmanlı mimari anlatılacak ardından kod üretici aracın ilevleri kod ürettii katmanlar üzerinden açıklanacaktır. Aracın verimi çeitli katmanlardaki toplam kod uzunluuna karın otomatik olarak üretilen kod miktarları verileri ile desteklenmitir. Bu Çalıma Iık Üniversitesi, Enformatik Uygulama ve Aratırma Merkezi nde yapılmı olup Mustafa Yıldız çalıma sırasında bu merkeze balı olarak çalımaktaydı.
veriled detaylı ekilde sonuç bölümünde verilmitir. Gelitirilmi olan araç internet üzerinden eriilebilir durumdadır ve açık kaynak kodlu olarak daıtılması planlanmaktadır. 2. Microsoft Tarafından Önerilen Çok Katmanlı Mimari Bu bölümde anlatılacak olan mimari Microsoft un önerdii ve örnek uygulamalarla açıkladıı çok katmanlı mimari olup, bu mimarinin esasları ve faydaları üzerinde durulacaktır.[2] Microsoft un önerdii uygulama mimarisinde yandaki ekilde de görülecei üzere yedi farklı bileen yer almaktadır. Bunlar sırasıyla aaıda verilmitir. Sunum Katmanı Bileenleri: Hemen hemen tüm yazılım ürünleri kullanıcılara bazı bilgileri vermek, bazı bilgileri almak üzere arayüzler salamak durumundadırlar. Örnein bir e-ticaret sisteminde, müteriler ürünleri görebilmekte, deiik filtrelere göre arama yapabilmekte yada seçtii ürünlerden sipari oluturup müteri temsilcilerine gönderebilmektedirler. Sunum katmanı bileenleri genellikle web sayfaları, windows formları eklinde olmakta ve kullanıcıya bazı bilgiler vermekte, yada doruluunu kontrol ettikleri bilgileri dier katmanlara ulatırmaktadırlar. Kullanıcı lem Bileenleri: Çou kez kullanıcıların takip edecekleri ilem sırası önceden belirlenmitir. Örnein, e- ticaret uygulamasında ürünler belirli kategorilere ayrılmı ve belli bir ürüne eriebilmek için bir kategori seçilmesi ardından ürünün seçilmesi gerekiyor olabilir. Benzer ekilde müteri bir satınalma yapmak istediinde takip etmesi gereken ilemler bellidir. Öncelikle ürün bilgileri girilir ardından ödeme bilgileri ve en son da adres bilgileri eklinde olabilir. Farklı kullanıcı ilem bileenleri kullanarak kullanıcı etkileimlerinin senkronizasyonuna yardımcı olunabilir. Bu sayade ilem akı ve durum yönetimi daha kolay olacak ve ilem bileenleri birden fazla kullanıcı arayüzü tarafından kullanılabilecektir. Süreçleri Bileenleri: Kullanıcı ilem bileenleri tarafından bilgi toplandıktan sonra, veri i süreçlerinde kullanılmaktadır. Bu katman bileenleri, belirli bir düzene göre takip edilmesi gereken ilemleri yapmak için kullanılırlar. Örnein, e-ticaret sisteminde gerekli bilgiler alındıktan sonra system toplam sipari miktarını hesaplamak, kredi kartı bilgilerini dorulamak, kredi kartından para çekme ilemlerini gerçekletirmek, ve ürünlerin gönderilmesini planlamak durumundadır. Tüm bu ilerin takibi süreçleri Bileenleri tarafından yapılır. Bileenleri: Bir iin birden fazla basamakta yapılmasına bakılmaksızın, uygulamalar i kurallarını uygulayan ve i görevlerini yerine getiren bileenlere ihtiyaç duyarlar. Örnein e-ticaret uygulamasında, bir sipariin deerini hesaplayan bir bileene ihtiyaç vardır. Veri Eriim Katmanı: Çou uygulamalar ve servisler i süreçlerinde belirli bir yerde duran veriye erimek ihtiyacındadırlar. Örnein, bir e-ticaret uygulamasında, ürün bilgilerine erimek ve bu bilgileri müterilere iletmek durumundadırlar. Veri eriim katmanının ayrı olması bakım ve
configürasyon kolaylıı getirmektedir. Ayrıca, veritabanı yönetim sisteminin deimesi bu sayede dier katmanlarda deiiklik olmadan kolaylıkla veri eriim katmanının deitirilmesi yoluyla uygulama kolaylıkla deiiklie adapte edilebilmektedir. Varlıkları Bileenleri: Çou uygulamalar bileenler arasında veri iletiimi ihtiyacı hissederler. Örnein, e-ticaret uygulamasında ürün listesi veri eriim bileenlerinden sunum katmanı bileenlerine gönderilmektedir. Genellikle gerçek dünyadan bazı varlıkları temsil etmektedirler (örnein sipari, ürün gibi). Uygulamalarda kullanılan i varlıkları genellikle veri yapıları; verikümeleri(dataset), veri okuyucuları (datareaders) eklinde olabilecei gibi gerçek hayatta varlıkları temsil eden sınıflar da olabilmektedir. Güvenlik, letiim ve Operasyonel Yönetim Bileenleri: Uygulamalar genellikle istisna kotarım yönetimi(exception handling management) bileenleri, kullanıcı yetkilendirmesi ve dier servisler yada uygulamalarla iletiim bileenleri kullanabilmektedir. Bunlara örnek olarak gelitirilmi bir ifreleme sisteminin uygulamada kullanılması gösterilebilir. Örnek uygulama gelitirilirken bu katmanlardan bazılarına ihtiyaç duyulmamıtır. süreçleri bileeni bunlardan birisidir. Uygulamada takip edilmesi gereken, belirli bir düzende bir çok ilemin ardarda geldii bir hal sözkonusu olmadıı için kod uygulama bu katmana ait kod içermemektedir. 3. Kod Üreticisi Kod üreticisi veritabanı katmanı, veri eriim katmanı, i varlıkları katmanı ve i mantıı katmanı olmak üzere dört katman için kaynak kodlarının büyük bölümünü üretmektedir. Bu bölümde, kod üreticisinin ilevleri kodunu ürettii katmanların herbiri için ayrı ayrı anlatılacaktır. Veritabanı Katmanı Önceki bölümde de deinildii üzere, veritabanı katmanı, veritabanı tablolarındaki veriyi çeitli ekillerde sorgulayan, yeni kayıtlar ekleyen, varolan kayıtları güncelleyen ve kayıtları silen saklanmı yordamları bünyesinde barındırır. Bu saklanmı yordamların büyük bölümü belirli bir ablona uyan ve kendisi ile ilgili tablonun sütunlarına ve bu sütunların tipine göre deien bir yapı arzeder. INSERT, UPDATE, DELETE ve SELECT ilevlerini gerçekletiren yordamlara ait ablonlar u ekildedir.!"#$!"%&!"#$!"%' "((#(#"!! )!"#$%&!"#$%'* +, )!"#$%&!"#$%'* (("((#(#-!"#$!"%&!"#$!"%' (#!"#$-!"#$%&!"#$-!"#$%'./ "0!"#$-(#
,, (#,1./ "0!"#$-(#,, (#,21./ "0!"#$-(# Yukarıdaki ablonların da açık bir biçimde ortaya koyduu üzere veritabanı katmanında bulunan saklanmı yordamlar ilgili oldukları tabloların sütun isimleri ve sütun tiplerine balı olarak farklılık göstermekle beraber ortak bir ablonu paylamaları münasebetiyle otomatik olarak üretilmeye elverilidirler. Tabloların sütun isimleri ve sütun tipleri Microsoft SQL Server 2000 veritabanı yönetim sisteminde bulunan sistem tabloları sorgulanarak elde edilebilir. Bu bilgi dier birçok veritabanı yönetim sisteminde de eriilebilir bir ekilde saklanmaktadır. Veri Eriim Katmanı Veri eriim katmanı, veritabanı katmanında bulunan saklanmı yordamları kullanan sınıflar ile bu sınıflara ait yordamlardan oluur. Veritabanı katmanına benzer ekilde bu sınıf ve yordamlar ilikili oldukları tabloların sütun isimleri ve tiplerine balı olarak farklılık gösterse de ortak bir yapı ve ablona sahiptir. Bu ortak ablon yine INSERT, DELETE, UPDATE ve SELECT yordamları için aaıda ifade edilmitir. Bir i varlıı nesnesi kabul eden ve tabloya ekleyen yordamdır. Sonuç olarak ekledii kaydın anahtar deerini döndürür Public Function Insert<<tablo adı>>(byval Obj<<tablo adı>> As <<tablo adı>>info) As Integer <<Veritabanı Eriim Komutları>> mycommand.commandtext = "sproc_insert_<<tablo adı>>" mycommand.parameters.add("@<<sütun adı>>",<<sütun adı>>).direction = ParameterDirection.Input [mycommand.parameters.add("@<<sütun adı>>",<<sütun adı>>).direction = ParameterDirection.Input] mycommand.parameters.add("@insertedrecordid", 1).Direction = ParameterDirection.Output mycommand.executenonquery() Return CInt(mycommand.Parameters("@InsertedRecordID").Value) Bir i varlıı nesnesi kabul eden ve tablodaki kaydı güncelleye yordamdır. Sonuç olarak doru/yanlı deeri döndürür Public Function Update<<tablo adı>>(byval Obj<<tablo adı>> As <<tablo adı>>info) As Boolean <<Veritabanı Eriim Komutları>> mycommand.commandtext = "sproc_update_<<tablo adı>>" mycommand.parameters.add("@<<sütun adı>>",<<sütun adı>>).direction = ParameterDirection.Input
[mycommand.parameters.add("@<<sütun adı>>",<<sütun adı>>).direction = ParameterDirection.Input] mycommand.executenonquery() Bir i varlıı nesnesi kabul eden ve tablodaki kaydı silen yordamdır. Sonuç olarak doru/yanlı deeri döndürür Public Function Delete<<tablo adı>>(byval Obj<<tablo adı>> As <<tablo adı>>info) As Boolean <<Veritabanı Eriim Komutları>> mycommand.commandtext = "sproc_delete_<<tablo adı>>" mycommand.parameters.add("@<<anahtar sütun>>",<<anahtar sütun>>).direction = ParameterDirection.Input mycommand.executenonquery() Tablonun anahtar sütunu için tamsayı bir deer kabul eden ve tablodaki bu kaydın deerlerini bir i nesnesine yükleyen yordamdır. Sonuç olarak yüklü i nesnesini döndürür Public Function Select<<tablo adı>>(byval RecordID As Integer) As Obj<<tablo adı>> <<Veritabanı Eriim Komutları>> mycommand.commandtext = "sproc_select_<<tablo adı>>" mycommand.parameters.add("@<<anahtar sütun>>",<<anahtar sütun>>).direction = ParameterDirection.Input myreader = mycommand.executenonquery() If myreader.read Then If not isdbnull(myreader("<<sütun adı>>")) Then Obj<<tablo adı>>.<<sütun adı>> = myreader("<<sütun adı>>") Else Obj<<tablo adı>>.<<sütun adı>> = 0 End If End If Veritabanı katmanına benzer ekilde veri eriim katmanının kaynak kodları belirli bir ablona uygun olmaları nedeniyle otomatik olarak üretilmeye elverilidir. Bu katmanda üretilen kodlar bir alt katman olan veritabanı katmanının da bu araç ile otomatik olarak üretildiini, bir programcı tarafından üretildi ise de en azından üreticinin standartlarına uygun olarak üretildiini kati olarak kabul eder. Varlıkları Katmanı Önceki bölümde de detaylı olarak anlatıldıı üzere bu katmanda i varlıklarının herbiri için bir sınıf bulunmaktadır. varlıkları veritabanı tasarımında veritabanı tabloları olarak büyük ölçüde ifade edildiinden bu katmandaki sınıfların büyük kısmı veritabanı tablolarıyla birebir ilikilidir ve bu tür sınıfların tümü ortak bir ablona sahiptir. varlıı sınıflarının ortak ablonu aaıda ifade edilmitir. Public Class <<tablo adı>>info #Region "class variables" Private _<<sütun adı>> As ConvertType(<<sütun tipi>>) [Private _<<sütun adı>> As ConvertType(<<sütun tipi>>)] #End Region #Region "properties"
Public Property <<sütun adı>>() As ConvertType(<<sütun tipi>>) Get Return _<<sütun adı>> End Get Set(ByVal Value As ConvertType(<<sütun tipi>>)) _<<sütun adı>> = Value End Set End Property #End Region End Class Dikkat edilirse bu sınıf, veritabanı tablosunda bulunan sütunların herbiri için özel (private) bir sınıf deikeni ve bu deikene eriim imkanı veren özellik yordamlarını (properties) içerir. Veritabanı sütunlarının tipleri (int, varchar, char, datetime, vb.) ile VB kodlarındaki deiken tiplerinin isimleri birebir aynı olmadıından ConvertType isimli bir tip ismi eletirme ilevi kullanılmıtır. Mantıı Katmanı Bu katmanda i mantıını ortaya koyan çok çeitli sınıflar bulunmaktadır. Bu sınıfların çeitlilii bu katmanda gelitirilecek olan sınıfların belirli oranda programcılar tarafından kodlanmasını gerektirse de her sınıfta bulunması gereken ve bir alt katman olan veri eriim katmanındaki yordamlar ile iletien temel yordamlar yine ortak bir ablonu paylaır ve kod üreticisi yardımıyla otomatik olarak üretilebilir. Bu yordamlar yine temel SELECT, INSERT, UPDATE ve DELETE ilevlerine ait yordamlardır. Public Shared Function Update<<tablo ismi>>(byval Obj<<tablo ismi>> As <<tablo ismi>>info) As Boolean Dim Obj<<tablo ismi>>dal As New <<tablo ismi>>dal Update<<tablo ismi>> = Obj<<tablo ismi>>dal.update<<tablo ismi>>(obj<<tablo ismi>>) Obj<<tablo ismi>>dal = Nothing Public Shared Function Delete<<tablo ismi>>(byval Obj<<tablo ismi>> As <<tablo ismi>>info) As Boolean Dim Obj<<tablo ismi>>dal As New <<tablo ismi>>dal Delete<<tablo ismi>> = Obj<<tablo ismi>>dal.delete<<tablo ismi>>(obj<<tablo ismi>>) Obj<<tablo ismi>>dal = Nothing Public Shared Function Select<<tablo ismi>>(byval RecordID As Integer) As Obj<<tablo ismi>>info Dim Obj<<tablo ismi>>dal As New <<tablo ismi>>dal Select<<tablo ismi>> = Obj<<tablo ismi>>dal.select<<tablo ismi>>(recordid) Obj<<tablo ismi>>dal = Nothing Public Shared Function Insert<<tablo ismi>>(byval Obj<<tablo ismi>> As <<tablo ismi>>info) As Integer Dim Obj<<tablo ismi>>dal As New <<tablo ismi>>dal Insert<<tablo ismi>> = Obj<<tablo ismi>>dal.insert<<tablo ismi>>(obj<<tablo ismi>>) Obj<<tablo ismi>>dal = Nothing
ablonlarda da açıkça görüldüü gibi bu katmandaki sınıflarda bulunması gereken yordamlardan dördünün kodu otomatik olarak üretilmeye elverilidir. lave levler Kod üreticisinin önemli özelliklerinden biri de aracın oldukça esnek olması ve kullanıcıların birtakım ayarlamaları aracın arayüzlerinden kolaylıkla yapabilmesidir. Kullanıcı, üretilecek kodun temsili ile ilgili ayarlamalar yapabilmektedir. 4. Sonuç Saklanmı yordamlara veya dier katmanlardaki sınıf ve yordamlara ilikin üretilmi olan kodun veritabanına veya bilgisayarın diskine yazılması sırasında izlenecek olan kurallar kullanıcı tarafından belirlenebilmektedir. Kullanıcı balanılacak veritabanına ilikin eriim bilgilerini de yine aracın arayüzlerinden belirleyebilmektedir. Araç, u an için yalnızca Microsoft SQL Server 2000 veritabanı yönetim sistemi ile çalımaktadır. Bu çalımada çok katmanlı mimariye uygun olarak gelitirilen veritabanı uygulamaları için kullanılabilecek esnek bir VB.NET kodu üreticisi olan Code Generator aracı gelitirilmitir. Gelitirilen araç bir finans uygulamasının yeniden mühendisliini içeren bir projede denenmitir. Yeniden mühendislii yapılan finans uygulaması, bir firmanın Hazine ilemlerini gerçekletirdii internet tabanlı ve orta büyüklükte bir veritabanı uygulamasıdır. Yeniden mühendislik tek katmanlı olarak VB.NET ile gelitirilmi olan bu uygulamanın çok katmanlı mimari kullanılarak yeniden gelitirilmesini içermektedir. Uygulamanın gereksinimleri halihazırda gelitirilmi olan yazılımın kullanıcı arayüzleri ile tamamıyla ortaya konmutur. Proje kapsamında gelitirilen uygulamaya ait kaynak kodu uzunlukları aaıdaki tabloda katmanlara ayrılmı olarak verilmitir. 3 34,5)"$*!"!3"$ 67 89"$:$3"$ ;< 89+$=$3"$ ;< +(93"$ >< +("$3"$ ;?, ;;6 Aaıdaki tabloda ise her bir katmandaki kodun kod üreticisi ile otomatik olarak üretilen miktarı ile bu miktarı toplam kod uzunluuna oranı verilmitir. 3 83@8, 3 @8, 3, 4,5)"$* 3!"!3"$ A BA 89"$:$3"$ C B66 89+$=$3"$ ;< B;AA +(93"$ >? B<C +("$3"$ ;6 BD6, C; B7?
Yukarıdaki göstergelerde de görüldüü gibi kod üreticisi gelitirilmi olan toplam kodun 61 bin satırını yani yarısından fazlasını otomatik olarak üretmitir. 61 bin satır kodun kabaca 8 adam/hafta lık bir programcı emeine denk geldii düünülürse aracın kullanılmasının projedeki verime katkısı daha net bir biçimde ortaya çıkmaktadır. Kod üreticisine http://irdc.isikun.edu.tr/code_generator adresinden eriilebilmektedir. Aracın açık kaynak kodlu olarak paylaılması da düünelmektedir. 5. Referanslar [1] Code Generator, http://irdc.isikun.edu.tr/code_generator [2] Application Architecture for.net: Designing Applications and Services, http:// msdn.microsoft.com/library/en-us/dnbda/html/distapp.asp