1.Giriş
Yazılım geliştirme teknikleri arasında son dönemde sıklıkla kullanılan hızlı uygulama geliştirme teknikleri, yazılım geliştiricilerin rutin işlemler için zamandan tasarruf ederek daha önemli işler için çalışmalarını hedeflemektedir. Kullanılan teknik, büyük ölçüde kodlama standardını da beraberinde getireceği için hata riski büyük oranda azaltmaktadır.
Birçok alanda kullanılan bu teknikler ile dinamik ya da sabit yapıda olmak üzere kodlama işleri otomatik olarak yapılmış olur. Böylece birbirine yapısal manada çok benzer kodlamalar tekrar tekrar yapılmamış olur. Belirli bir ölçüye ya da sabit davranıştaki nesneler için yalnızca nesnesel özelliklerine göre değişiklik gerektiren kodlamalarda nesne dışında kalan kodlamalar belirli standartlar ölçüsünde yapılmalıdır. Örneğin veritabanındaki bir tablo için yazılımla konuşabilmesi için yazılması gereken sorgularda tablo ve sütun bilgileri dışında neredeyse tüm sorgular aynı veritabanındaki diğer tablo için de aynıdır. Bunlar; veri okumak, yazmak, oluşturmak ve silmek gibi rutin kodlama gerektiren işlerdir. Kodlamaları her nesne için teker teker yapmak ya da bu kodlamaları belirli ölçülere, durumlara ve kurallara vb. dayandırarak otomatik oluşturmak söz konusu zaman olduğunda büyük önem taşımaktadır. Çünkü yapılması gereken iş yalnızca rutin değil, bir yığın işlevin kazandırılmasıdır. Bu kapsamda rutin işlerin otomatikleştirilerek zamandan tasarruf edilmesi gereği ortaya çıkmaktadır.
Hızlı uygulama geliştirme teknikleri arasında öne çıkan iki önemli metot vardır. Bunlar bir kere oluşturulan ya da gerektiğinde tekrar oluşturulan ve değişikliğe esneklik gösteren tekniklerdir. Her iki yöntem de artıları ve eksileri mevcut olmakla beraber çözüm üretme noktasında bazı kolaylıkları ve riskleri de beraberinde getirirler. Bu bağlamda duruma göre biri tercih edilmeli ya da her ikisi birden kullanılmalıdır.
Yazılım geliştirme altyapıları (framework); yazılımların vazgeçilmez unsurlarıdır. Özellikle veritabanı ile yazılımı konuşturma işlemleri için popüler olarak kullanılan birçok altyapı mevcuttur. Bu altyapılar genellikle veritabanı şemalarından faydalanarak temel veritabanı işlemleri olarak adlandırılan CRUD(Create(oluştur), Read(oku), Update(Güncelle) ve Delete(Sil)) işlevlerini yerine getirmekle beraber birçok işlevi ve esnekliği de beraberinde getirmektedir. Kullanılan altyapının sağladığı esneklik ölçüsüne göre rutin dışında kalan kodlama işlemleri için de aynı altyapı kullanılarak bazı geliştirmelerin yapılması gerekmektedir. Bu özel kodlama işleminin standardın dışında bir işlevin yazılıma kazandırılması zorunlu durumdadır. Bu bazen istatistiksel bir işlev olabileceği gibi bazen de özel bir güncelleme olabilir.
2. Teknik Unsurlar
Kod oluşturucu araçlarla yapılan geliştirmeler, veritabanı değişikliklerinde kod oluşturma işleminin tekrar yapılmasını zorunlu hale getirir ve otomatik oluşturulan kod üzerinde yapılan değişiklikler kodun tekrar oluşturulmasıyla kaybedilme riski taşımaktadır. Diğer yönden, geliştirilen alt yapının daha sonra geliştirilecek projeler için yeni altyapı niteliği taşıması hedeflenir ve kod oluşturma işlemleri büyük ölçüde bu gereksinimi karşılar. Uygulama altyapısının yalnızca ileriye dönük projeler için kullanılabilmesi, büyük bir kazanım olarak görülebilir ancak gerçek kazanım geliştirilen altyapının geriye dönük projeler tarafından da kullanılabilmesidir. Kod geliştiriciler bu kazanımları sağlamakta yetersiz kalabilmektedir.
Bağımlı nesnelere dayalı uygulamaların tamamında bağımlı olunan nesnede meydana gelen yapısal değişikliklerden ötürü uygulama kodlamasının elden geçirilmesi gerekir. Bu sebeple bağımlı olunan nesneler geliştirilirken yapısal değişikliklerden kaçınılmalıdır. Kullanılan hızlı uygulama geliştirme tekniğinde, yazılım geliştirme aşamasında bile sıklıkla yapının değişeceği düşünülmelidir. Müşteriden gelecek taleplerin karşılanması için gerekiyorsa yapısal manada değişikliklerin bile hızlı bir şekilde gerçekleştirilmesi gerekir. Hız ölçütü olarak zaman ele alındığında, yapılan kodlamanın değişikliklere açık olması gerekmektedir.
3. Çevik Modelleme
Takım halinde geliştirilen projelerde en temel unsur bireylerin iletişimidir. Takım çalışmasında iletişim sağlıklı değilse, projenin başarılı olması düşünülemez. Müşteriye geliştirilecek proje hakkında sunulan arayüzler ve akış şemaları, müşteride her şeyin yapıldığı izlenimini bırakabilir oysa sunulanlar yalnızca prototipten ibarettir.
Belirli işaretler, hareketler, duruş şekli bile çok önemlidir. Bilgisayarı başında kamburlaşmış ve neredeyse monitörün içine girecekmiş gibi oturan birini görmüşseniz ona yardım etmeniz gerekiyor demektir.
Yazılım geliştiricileri tarafından yapılan ya da yapılmaya zorlanan en büyük hatalardan biri, hiç şüphesiz analiz tamamlanmadan kodlamaya başlanmasıdır. Diğer yönden, henüz analizi yapılmamış işler için yapılan kodlamalardan meydana gelen sorunlar da gözardı edilmemelidir.
Bir projenin kodlamasına, hayati önem taşıyan modüllerden başlanmalıdır. Bu modüller; sağlam ve kararlı hale getirilmelidir. Sonraki aşamada ise gereklilikler belirginleştikçe analiz gözden geçirilip geliştirilecek modüller tekrar tasarlanmalıdır. Böylece belki de müşterinin hiç kullanmayacağı modüller kodlanmak zorunda kalınmaz. Her modül bağımsız çalışmalıdır ya da geliştirme bağımlılıklar en aza indirgenmelidir. Bir çok başarılı projede olduğu gibi proje teslim edildikten sonra yeni geliştirmeler hatta geliştirilen proje ile entegre çalışan projeler talep edilir. Yapılan hatalardan biri de henüz başlanmış bir projenin her geliştirmeye ve entegrasyona tam manasıyla cevap vermeye çalışmasıdır. Yazılım geliştiricilerin egosu bazı zamanlarda bunu gerektirir, ancak projenin her aşamasında basit düşünülmelidir ki yapılacak yeni geliştirmeler de aynı basitlikte uygulanabilsin.
4. Kod oluşturucular
Kod oluşturucular, genellikle kullanılacak yazılım altyapısına uygun biçimde alt yapının özel işlevlerini kullanmak üzere kullanılan uygulamalardır. Gereksinim duyulduğu anda kod yeniden oluşturulur, böylece bağımlı olunan nesnelerin son hallerine uygun kodlama otomatikleştirilmiş olur. Veri tabanı ile konuşacak olan veri erişim katmanlarında (Data Access Layer) kullanılan sınıfların tamamı hatta katmanların tamamı kod oluşturma tekniği ile topluca elde edilebilir.
Kod oluşturma şablonları kullanılan kod oluşturucunun yetenekleri çerçevesinde mümkün olduğunca esnek hazırlanmalıdır. Oluşturulan kodlar, geliştirmeye açık ve tekrar geliştirme işleminden etkilenmemelidir. Bu bağlamda; otomatik oluşturulmuş kod ile çalışan yada koda parçalı(partial) sınıf olarak geliştirilen sınıflarda yapısal değişikliklerin uygulanma süreci göz önüne alınmalıdır. Örneğin; veritabanı erişimi için kullanılan bir sınıf otomatik kod oluşturma işlemi ile elde edilip bazı özel metotların parçalı bir sınıfla geliştirildiğini düşünelim. Bu durumda senaryoya göre, bağımlı olunan veri nesnelerindeki yapısal değişiklikler oluşturulmuş kodun tekrar oluşturulması ile büyük ölçüde çözülebilir fakat parçalı sınıflardaki kullanımlar tabir yerinde ise satır satır, kelime kelime titizlikle düzeltilmelidir.
Kod oluşturma işlemleri; klasik kodlama ile yapılabilecek her şeyi kapsamaktadır. Bu; bir veritabanında yazılması gereken rutin T-SQL kodlaması, veri erişim katmanı, kullanıcı arayüzü vb... olabileceği gibi hepsini kapsayan geniş bir kod oluşturma işlemi de olabilir.
Diğer hızlı uygulama teknikleri gibi bu tekniğin de bazı yaklaşımsal sorunları mevcuttur. Otomatik kod oluşturmak, bazen kod oluşturulan kod üzerinde yapılan geliştirmelerin tekrar kod oluşturma işlemi yapıldığında kaybedilmesine yol açabilir ya da oluşturulmuş kod, geliştirmeye müsait olmayabilir. Köklü yapısal değişiklikler karşısında kod oluşturma şablonlarının (template) değiştirilmesi ya da yeni yapıya sorunsuz şekilde adapte edilmesi mümkün olmayabilir. Bu da beraberinde büyük riskleri getirir. Kullanılan şablonun hazırlanma süreci çok önemlidir ve mutlaka bu konuda uzman kişiler tarafından hazırlanmalıdır.
Kod oluşturucu bölümünde anlatılanlar CodeSmith ve Visual Studio T4 Text Templates temel alınarak yazılmıştır.
5. ASP.NET Dynamic Data
Microsoft tarafından hızlı bir şekilde veri tabanlı uygulamaya dayalı işlevsel uygulamalar geliştirilmesi için ASP.NET Dynamic Data Framework’ü hazırlanmıştır. LINQ To SQL, Entity Framework veri modellerinin yanısıra özel olarak geliştirilmiş veri erişim katmanlarıyla da çalışabilmektedir. Akıllı veri doğrulama yeteneği ile DetailsView, FormView, GridView ve ListView gibi kontroller”e büyük bir esneklik ve dinamiklik katar.
Mevcut ASP.NET veri kontrolleri ile kullanım esnekliği sağlayarak hızlı uygulama kapsamında büyük fayda sağlar. Yeni oluşturulmuş ASP.NET Dynamic Data projelerinde LINQ To SQL veya Entity Framework veri modelinin eklenmesi ve veri nesnelerinin model üzerinde tanımlanması ardından sonuç CRUD olarak tanımlanan oluşturma, okuma, güncelleme ve silme işlevlerine sahip tam bir web sitesidir. Veri listeleme sayfalarında ilgili veri tablosunun yapısına ve diğer veri tablolarıyla ilişkilerine göre filtrelemele kontrolleri dinamik olarak görüntülenir. Akıllı doğrulama ile mevcut verinin girdi ve çıktılarında tip güvenliği, alan uzunluğu, tanımsız tipteki verilerin sorunsuz çalıştırılması gibi işlevleri veritabanı kısıtlamalarına dayalı olan dinamik altyapının kullanılmasına olanak sağlar
Kod oluşturucu alternatiflerinden ön plana çıkan bir çok özelliği vardır.
Herhangi bir kod oluşturucuda yazılan kodlar yazılım geliştirmesi sırasında baştan aşağı tekrar oluşturulur. Çünkü ilişkisel bir yapıdan çok fazla söz edilemez. ASP.NET Veri erişim katmanı olarak kullanılan LINQ To SQL Classes ve Entity Framework nesneneri ilişkisel veritabanları için stabil bir altyapı sunar. ASP.NET Dynamic Data bu altyapıları kullanarak çalıştığı için veritabanı nesnesi hakkındaki tüm bilgilere sahiptir. Diğer taraftan herhangi bir kod oluşturma işlemi gerekmediğinden değişiklikleri uygulamak için şemasal değişiklik olduğunu bildirmek yeterlidir.
Kullanılacak veri ekranlarındaki esneklik son derece iyidir. Veri formları ve kullanıcı ekranları şablon(template) tabanlıdır. Veri tabanındaki nesnelerin tiplerine göre ilgili veri nesnesi oluşturulur. Mesela veritabanında doğru/yanlış olarak tanımlanmış bir alan için görüntüleme safhasında CheckBox kontrolü kullanılırken metinsel bir alan için TextBox kontrolü kullanılarak verinin doğru bir şekilde işlenmesini sağlar. Yazılım geliştirici için bu alanlarda özelleştirilebilir niteliktedir.
Veritabanına gönderilen bilgilerin kullanıcı formları tarafından kontrol edilmesi gereğine uygun olarak Dynamic Data formlarında her bir alan için yine veri tipine göre çeşitli doğrulama işlemleri gerçekleştirilir. Bu denetimler uygulamanın kararlı çalışması için yapılması gekenler arasındadır. Örneğin kullanıcı dinamik oluşturulmuş sayısal tipteki bir kolon için kullanılan TextBox nesnesinde eklenecek verinin sayısal tip olma durumu kontrol edilmelidir. Ayrıca hafıza taşması olarak adlandırılan veri taşıma kapasitesinin aşılma durumu da kontrol edilmelidir. Aksi durumlarda kullanıcı formlarında sayısız(her bir alan düşünüldüğünde) hata ile karşılaşılacaktır.
5.1 MetaData(ÜstVeri) kavramı
ASP.NET Dynamic Data hali hazırda gelen bir çok özelliği dışında özelleştirmeler için MetaData kavramını kullanır. MetaData her veri nesnesi için varolan bir kavramdır. Kısaca nesneler hakkında bilgi alabilmek için önceden hazırlanarak nesneye bağlanmış durumdaki özet bilgilerdir. Bu ASP.NET Dynamic Data’da veri erişiminde veri nesneleri hakkındaki bilgiler için kullanılırken normal bir müzik dosyasında şarkı adı, sanatçı, albüm, kapak resmi, süre vb. gibi bilgilerin erişilmesi için kullanılmasıyla benzer özellikler taşımaktadır.
MetaData bilgilerini uygulamanın başlaması ile birlikte elde eden ASP.NET Dynamic Data framework’ü veri tabanındaki yapısal değişikliklerin formlara yansıtılabilmesi için şemasal değişikliğin(yalnızca ilgili nesneler için) tekrar bildirilmesi gereği duyar. Bu bir sorun gibi görünsede aslında beraberinde hiç bir sorun getirmeyecek olması çok büyük bir kazanımdır. Veritabanınızın tamamı bile yapısal olarak değişmiş olabilir. Herhangi bir sabit kod bulunmadığından ASP.NET Dynamic Data’ya bildirilen değişikliğin ardından kullanıcı formlarının görüntülenmeside yapısal değişiklikler aynı ölçüde yansıtılacaktır. Kısaca özetlemek gerekirse veritabanın kendi yaşam döngüsünde bir sorun yoksa kullanıcı formlarında da bir sorun yok demektir. Bu da veritabanının dikkatli kurgulanması gerekliliğini bir kez daha ortaya koymaktadır.
MetaData sınıfları sıklıkla veri nesneleri için özelleştirme yapılacağı zaman kullanılır. Daha önce de belirtildiği gibi o an görüntülenmek istenen veri nesnesine uygun ASP.NET kontrolü oluşturularak kullanıcıya yansıtılır. Eğer bu alanda veri girişi yada görüntülemesi özelleşmeliyse bunun için MetaData bildirimi yapılması gerekir. Örneğin metinsel bir alan için kulanıcı tarafında metin kutusu oluşturulacaktır. Ancak bu alana yapılacak veri girişi sırasında kullanıcıdan alınacak verinin yalnızca bir kısımı yada veri üzerinde yapılacak işlemlerin ardından özet bir bilginin yazılması gerekiyor olabilir. Veri görüntüleme formlarında da bu özet bilgi ile gerçek veri hakkında bazı işlemler yapılabilir. Örneğin veritabanındaki personel tablosunda detaylı personel bilgilerinin tutulduğunu varsayalım. Personele ait fotoğrafın da aynı form üzerinden gönderilmesi gerekiyorsa bazı özelleştirmelerin yapılması gereklidir. Fotoğraf bilgisinin tutulacağı veri tipi metin ve verinin de fotoğrafın kaydedildiği yerin konumu olduğunu varsayalım. Veri girişi yapacak kişnin fotoğrafı bir yere kaydetmesi ve ardından dosya konumunu metin kutusuna yazmasını anlamsızdır. Bunun yerine yazılım geliştirici bu alanda metin kutusu yerine dosya yükleme kontrolünün görüntülenmesini ve yükleme işleminin ardından fotoğraf kaydını dosya konumu olarak düşebilir. Fotoğraf kaydının görüntüleneceği alanlarda ise dosya konumunu yerine fotoğrafın kensinin görüntülenmesi sağlanabilir. Aşağıdaki MetaData tanımlaması bu işlemi yapmak için yeterlidir.
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(PersonelMetaData))]
public partial class Personel
{
public class PersonelMetaData
{
[UIHint("DosyaYuklemeKontrolSablonu")]
public string Fotograf { get; set; }
}
}
Dynamic Data altyapısında yapılan geliştirmelerin ileriye ve geriye doğru yatırım niteliği taşır. Aynı örnek üzerinden devam edilmesi gerekirse fotoğraf yükleme işlemi için yazılan kod yalnızca personel üzerindeki fotoğraf alanı için değil bu işlemin yapılması gereken her yerde kullanılabilir. Özetle geliştirilen şablon hiç bir nesneye bağımlı değildir. Bu da aynı şablonun sonraki projelerde kullanılabileceği gibi daha önce yapılmış projelerde bile kullanılabileceği anlamı taşımaktadır. Üstelik tek yapılması gereken MetaData bildirimidir.
MetaData bildirimleri genellikle kod ile veri erişim katmanındaki tablo nesnelerine parçalı sınıf yazılarak tanımlanırlar. Benzer şekilde bu bildirimler özelleştirilerek tanımlanabilirler. Bu yöntem dışında yaygın olarak kullanılan iki yöntem vardır. Xml dosyasına bildirimleri kaydetmek ve uygulama başladığında okuyup yüklemek. Diğer yöntem ise özel olarak geliştirilmiş bir sınıf üzerinden bildirimleri veritabanı vb kaynaklardan okuyup yükletmektir. Bunun manası şudurki geliştirdiğiniz altyapı, kullanıcı yada müşteri istekleri ne olursa olsun altyapının sağladığı ölçüde bir editör tarafından hiç kod yazılmadan tüm sistemin oluşturulabileceğidir. Basit bir veritabanı editörü ve bu editörün oluşturduğu veri erişim katmanına MetaData bildirimlerini yapılabilmesi için aynı basitlikte MetaData editörü tüm işi halledecektir. Bu da bazı yönetim yazılımlarında ön plana çıkartılan NO PROGRAMING slonganını Dynamic Data ile geliştirilen yazılımlarda bir miktar efor sarfettikten sonra kullanılabileceğini göstermektedir.