ECO Programlamaya Giriş
Günümüzde yazılım şirketleri, karışık ve ağır projelerin altından kalkabilmek için programcı sayısını artırmaktadır. Projede çalışan programcıların sayısı artmakla beraber, aralarındaki iletişim de o nispette azalmaktadır. Bu problemin üstesinden gelebilmek için çeşitli yöntemler geliştirilmiştir. Bu yöntemlerin en etkililerinden bir tanesi de şüphesiz model tabanlı programlamadır. Projede kullanılan yöntemler, algoritmalar, fonksiyonlar ve veritabanları herkesin anlayacağı bir model yapısında birleştirilmekte, böylece proje yöneticisi programcıyı, programcı da proje yöneticisini anlamakta zorluk çekmemektedir. Model programlamada Borland’ın raflarına baktığımızda ise yeni gözdesi ECO teknolojisini görmekteyiz. Nasılki modeller, karmaşık projeleri daha az karmaşık hale getirip kolaylaştırıyor, aynen öyle de ECO da, model programlamayı o denli kolaylaştırıyor. Bu makalemizde ECO’ya girşi yapıp, kod yazmadan ya da çok az kod yazarak işlerimizi nasıl rahat hallettiğimize şahit olacağız. Eğer ilginizi çektiyse devam edelim.
İçindekiler
Arayüzü ECO ile İlişkilendirmek
Verilerin Kalıcılığını Sağlama
Giriş
Delphi 8 ile birlikte yeni bir framework ile tanıştık: ECO™ (Enterprise Core Object). ECO, model tabanlı geliştirmeye (Model Driven Development) imkan tanıyan bir platformdur. Çok az kod yazarak, belki hiç kod yazmadan uygulama geliştirebildiğimiz bu platform sayesinde, veritabanları, uygulamalar ve arayüzler kolay bir biçimde entegre edilip, yönetilebilir. ECO uygulamaları geliştirmek, zaman kazancı ile beraber üretimin artırılması noktasında size deneyim de kazandıracaktır. Özelikle yazılım şirketlerinin ve bu sektörde çalışanların üretim artırımı noktasında sorunlarını çözeceği aşikardır.
Bu makale serisinde, ilk başta basit olarak modelleme konusuna değinmek istiyorum. Ardından ECO ile basit bir uygulama geliştirip, ECO hakkında genel bir bilgi edinmeye çalışacağız. Devam eden konularda ECO’nun nesne tabanlı programlamayı ne kadar çok bistelştirdiğini anlamış olacağız.
Makaleye devam edebilmek için asgari şunlara ihtiyacınız olacak: ECO kurulu olan sürüm 8 veya yukarısı bir Delphi, basit veritabanları kuracak kadar delphi bilgisi ve ECO’yu öğrenmek için gereken istek.
Model Tabanlı Geliştirme
Bir model, bir şeyin gösterimi ya da tanımıdır. Mesela bir uçak modeli, gerçek bir uçağı göstermektedir. Aynen bunun gibi de bir yazılılm modeli, yazılım geliştirme alanındaki problemleri ve çözümleri özetleyen ve gösteren bir yapıdır. Tabi ki bir çok yazılım projesi için çok çeşitli modeller geliştirilmesi mümkündür. Model ayrıca, takım çalışmalarında geliştiriciler arasında iletişimi basitleştirir. Böylece büyük projelerde geliştiriciler birbirlerini anlamak için kaybedecekleri zamanı işlerine vermiş olacaklardır.
Çok çeşitli modeller tanımlayarak, karmaşık yazılım sistemlerini problem alanıdaki görüntü kümeleri olarak ifade edebiliriz. Bu yapıdaki bir modelin dezavantajı ise, zamanla bir problem tanımını derece derece, metin tanımlamalarından kaynak kod ve veritabanı şemalarına çevirmemizdir. Ki bunları sadece geliştirici ve derleyici anlayabilir. Diğer bir değişle, iş veya meslekî anlayıştan derleyici anlayışına dönüştürmedeki problem, her defasında kodu değiştirmemiz olacaktır. Başkaları tarafından yazılmış kodları anlamak istediğimizde veya anlatmak istediğimizde ise bunları kaynak koddan iş mantığına çevirmemiz gerekecektir.
ECO, el ile yapılan bir çok dönüşüm işlemlerini kaldırmayı sağlıyor. ECO, geliştiriciye iş mantığını daha yakından ifade eden bir problemi modellemesine izin verir. Böylelikle kompleks uygulamaları daha kolay ve rahat bir şekilde anlamamıza ve değiştirmemize imkan tanır.
ECO’da modelleri oluşturduğumuz zaman, sınıflara, İş sınıfları veya Alan sınıfları olarak isim veririz. Çalışma zamanında bunlara İş nesneleri veya Alan nesneleri deriz. Bu isimleri kullanmamızın nedeni, bir işin problem alanındaki nesneleri direk olarak göstermesidir. Mesela bir okul kayıt uygulamasında, iş sınıfı olarak "Öğrenci", "Öğretmen" ve "Ders" olarak tanımlamamız gerekecektir.
Buraya kadar anlattıklarımız daha çok soyut açıklamalardı. ECO ve modellemenin mantığını anlamak için bu kadar bilgi yeter kanaatindeyim. Å?imdi örnek bir uygulamaya geçip, ECO’ nun nasıl çalıştığına göz gezdirelim.
Örnek Uygulama
Bu uygulamamız, basit olarak adres ve telefonları XML dosyasında tutan bir adres defteri olsun. Uygulamamız aşağıdaki özelliklere sahip olmalıdır:
Å?ahıslar için irtibat bilgilerini tutabilmeli
Å?irketler için irtibat bilgilerini tutabilmeli
Uygulamamız ile ilgili bu problemleri tanımladıktan sonra uygulamamızı modelleyebiliriz.

Å?ekilde görülen yapı UML(Unified Modeling Language™) diye isimlendirdiğimiz, modelleri ifade etmemize yardımcı olan bir modelleme dilidr. Å?ekil bize, dikdörtgenlerle ifade edilen 3 sınıfı göstermektedir. İrtibat sınıfı şekilde gösterilmese de, abstract(soyutlanmış) bir sınıftır. Baş tarafında ok bulunan çizgiler, Å?ahıs ve Å?irket sınıflarının, İrtibat sınıfından türediğini göstermektedir. Model bize, aşağıdaki iş kurallarını ifade etmektedir:
Abstract Sınıflar Bu konu, nesneye dayalı programlama konusu olup, ilgili makale ve kitaplarda ayrıntılı bilgi bulunabilir. Kısaca bahsetmek gerekirse, bir sınıfın abstract olması demek, o sınıfın metodlarının tanımlamaları alt sınıflarda yapılacak demektir. Bunun birçok faydasından bir faydası şu olacaktır. Aynı özelliğie ve metodlara sahip sınıflar isteniyorsa, her sınıfın tanımlamasında aynı olan bu özellikleri tekrar tekrar oluşturmak yerine, bu özellikleri ve metodları içeren bir abstract sınıf oluşturursunuz. Böylelikle metodların ve özelliklerin tanımlamalarını alt sınıflara bırakmış olursunuz. Bu abstract sınıfdan türeyen bütün sınıflar da kardeş hükmüne geçip aralarındaki geçişler ve atamalar çok rahat bir şekilde halledilmiş olur. Abstraction hakkında daha fazla bilgi için: |
Bir İrtibat, bir isme, bir telefon numarasına ve bir de adrese sahiptir.
Bir İrtibat, Å?ahıs veya Å?irket olmalıdır.
Problem tanınımızı ve buna bağlı model yapımızı oluştuduktan sonra yavaş yavaş ilk ECO uygulamamızı oluşturmaya geçebiliriz. Uygulamayı Delphi 2005 ile yapacağız ama ECO destekli herhangi bir sürümde kullanabilirsiniz.
İşe ilk başta bir ECO uygulaması oluşturmakla başlayalım.
Menüden File / New / Other.. seçeneğini seçelim.
Karşımıza New Items penceresi çıkacak. Delphi.NET Projects altından ECO Windows Forms Application seçeneğini seçelim.
Karşımıza New Application penceresi çıkacaktır. Burada uygulamamız için bir isim verelim ve uygun bir yer seçelim.

Bu adımlardan sonra Delphi, boş bir ECO uygulaması oluşturacaktır. Project Manager’ a baktığınızda normal Delphi uygulamasından farklı olarak fazladan 2 dosya daha göreceksiniz. Biri AdresDefteriEcoSpace.pas ve diğeri CoreClassesUnit.pas.
CoreClassesUnit.pas
Bu unit, ECO uygulamamızda sınıfları oluşturduğumuz UML paketidir. Normalde daha çok paket oluşturulabilir ama biz bu uygulamada varsayılan olarak gelen bu paketi kullanacağız.
AdresDefteriEcoSpace.pas
Bu dosya, uygulamamızın ECO Space‘ini tutar. ECO Space, uygulamamızın çalışma zamanındaki nesnelerini tutar. Diğer bir değişle nesneleri tutan bir taşıyıcıdır. Nasıl ki bir nesne, bir sınıfın örneğidir(instance), aynen öyle de bir ECO Space, bir modelin örneğidir. ECO Space tarafından tutulan nesneler, alanların(domain) özelliklerini ve modelde tanımlı ilişkileri tutar.
Bir nesne taşıyıcısı olarak ECO Space, hem iş gören içerik hem de önbellektir. ECO Space’in içindeki Persistence Mapper denen bileşen, XML dosyası, RDBMS gibi Persistence Katmanı ile modelde tanımlı sınıfların arasında bir kanal veya bir köprü olarak kullanılmaktadır. İlerleyen bölümlerde burayı daha iyi kavrayacağız.
Bir ECO Modeli Oluşturalım
ECO, modelleme dili olarak UML’i kullanır. En çok kullanılan bölümleri Class Diagram ve Object Constraint Language (OCL) ‘dir.
Å?imdi önceki oluşturduğumuz AdresDefteri uygulamasına geçelim. ModelView penceresi altından CoreClasses‘ a çift tıklayalım. Bundan sonra modelleme arayüzü karşımıza çıkacaktır. Bununla birlikte "Tool Palette" penceresinin de değiştiğini göreceksiniz.

Yeni bir sınıf oluşturabilmek için ister Tool Palette’i isterseniz de modelleme alanına sağ tuş ile tıklayarak gelen menüyü kullanabiliriz. Å?imdi Modelleme alanına yeni bir sınıf (ECO Class) ekleyelim. İsim olarak da "İrtibat" girelim. Ne olursa olsun .NET programlamada Türkçe karakter serbesttir. .NET unicode tabanlı olduğu için Delphi’de buna uyum sağlamışa benziyor. Her neyse, bu sınıf seçili iken Object Inspector’dan Abstract özelliğini True yapalım. Çünkü bu sınıfımız Abstract’dır(soyut). Abstract sınıflar ile ilgili makalenin başlarında bir açıklama kutucuğu bulabilirsiniz.

Oluşturduğumuz bu sınıfa bir Attribute (özellik) ekleyelim. Bunun için yeni oluşturmuş olduğumuz İrtibat sınıfımızı gösteren dörtgene sağ tuş ile tıklayıp Add / Attribute seçeneğini seçelim. Name özelliğine İsim (Türkçe karakter serbest) ve Type özelliğine de string girelim. Sınıfımızın son hali şu şekilde olacaktır.

Ardından "Telefon" ve "Adres" için de Attribute ekleyelim.
Å?ahıs ve Å?irket adı ile iki tane sınıf daha oluşturalım. Ama bu sınıflar İrtibat sınıfından türeyeceği için Abstract özelliğini False olarak bırakalım. Å?imdi aşağıda gösterildiği gibi Å?ahıs sınıfı ile İrtibat sınıfı arasında ilişki kuracağız. Bunun için Tool Palette’de bulunan Generalization / Implementation aracını kullanıyoruz.

Aynı ilişkiyi Å?irket sınıfı içinde yapalım. Böylelikle Å?irket ve Å?ahıs sınıfları İrtibat sınıfından türemiş sınıflar oldular. Eğer nesneye dayalı programlama mantığını biliyorsanız bu kısmı çok rahat anlamışsınızdır. Diğer bir değişle İrtibat sınıfında bulunan bütün özellikler Å?ahıs ve Å?irket sınıfında da bulunacaktır. Modelimiz en son hali ile şu şekli alacaktır:

ModelView penceresine göz gezdirdiğimizde eklediğimiz sınıfları görebiliriz. Ayrıca CoreClassesUnit altında da bazı sınıfları görebiliriz.

Görüldüğü gibi iki tip model yapımız var. Domain Model yapısında direk olarak bizim oluşturduğumuz sınıflar mevcut. Implementation Model ise, ECO tarafından otomatik olarak kod üzerinde oluşturulan gerçek Delphi sınıflarıdır.
Arayüzü ECO ile İlişkilendirmek
Modelimizi tamamladığımıza göre kullanıcı arayüzünü hazırlamaya geçebiliriz.
Önemli: Bu aşamadan sonra projemizi derlememiz gerekmektedir. Çünkü arayüz tasarımcısı model bilgilerini alabilmesi için derlenmesi gerekmektedir. ECO’ nun çalışma düzeneği, .Net Reflection üzerine kuruludur. Reflection için projemizi derlememiz gerekmektedir. Å?imdi devam etmeden önce elimizi F9′a götürelim…
Å?imdi WinForm’ a geçelim. Forma 2 adet button, 3 adet DataGrid ve Enterprise Core Objects kategorisinden 3 adet ExpressionHandle ekleyelim. Butonlarından birini btnÅ?irketEkle, diğerini de btnÅ?ahısEkle olarak isimlendirelim. Text özelliklerini de "Å?ahıs Ekle" ve "Å?irket Ekle" olarak değiştirelim. ECO uygulaması oluşturma sihirbazı form üzerine bizim eklediklerimiz dışında bir kaç bileşen ekler. Bunlar arasında rhRoot isimli ReferenceHandle bileşeninin EcoSpaceType özelliğini bizim EcoSpace’imize bağlıyoruz. Yani buraya:
AdresDefteriEcoSpace.TAdresDefteriEcoSpace
gireceğiz. Bundan sonra eklediğimiz 3 adet ExpressionHandle bileşenini ayarlamamız gerekmektedir. Bu bileşenleri ehİrtibat, ehÅ?ahıs ve ehÅ?irket olarak isimlendirelim. Hepsinin RootHandle özelliğini biraz önce ayarlamış olduğumuz rhRoot yapalım. Å?imdi aşağıda gösterildiği gibi, her bileşenin Expression özelliğini kendi sınıfının allInstance özelliğine ayarlayalım.

Eğer rhRoot bileşenini doğru bir şekilde ayarlamadıysanız muhtemelen resimdeki gibi bir sınıf listesini göremeyeceksiniz. Bir ReferenceHandle bileşeni, tüm ECOSpace’ler içinde belirli bir EcoSpace’i seçmemize yarar. Bu örneğmizde EcoSpaceType özelliği ile AdresDefteri için oluşturduğumuz EcoSpace’i seçtik.
Forma eklediğimiz DataGrid bileşenlerine dgİrtibat, dgÅ?ahıslar ve dgÅ?irketler isimlerini verelim. Herbirinin DataSource özelliğini de kendilerine ait olan ExpressionHandle bileşenine ayarlayalım. Mesela dgİrtibat için DataSource ehİrtibat olacak. Å?imdi btnÅ?ahısEkle düğmesini çalışır hale getirelim. Bunun için iki seçeneğimiz var. İster kod girerek istersek de kod girmeden. İlk başta herhangi bir kod girmeden herşeyi IDE ile halledelim. btnÅ?ahısEkle düğmesinin özelliklerinden BindingContext özelliğini dgÅ?ahıslar olarak seçelim. Ardından EcoListAction olarak düğmeye basıldığında ne gibi bir işlevi olacağını ayarlayalım. Örneğimizde bu özelliği Add olarak seçeceğiz. RootHandle özelliği olarak da Å?ahıslar sınıfına bağlı ExpressionHandle bileşenini seçelim yani bu örnek için ehÅ?ahıslar. Gördüğünüz gibi kod girmeden işlerimjizi hallettik. Å?imdi de btnÅ?irketEkle düğmesini kod girerek yapalım. Düğmenin OnClick olayına şu kodları ekleyelim:
procedure TWinForm.btnÅ?irketEkle_Click(sender: System.Object; e: System.EventArgs); begin Å?irket.Create(EcoSpace); end;
Eğer eksik bir şey yapmadıysak programı çalıştırdığımızda 2 düğmemiz de ekleme işlemlerini yapacaktır.

Verilerin Kalıcılığını Sağlama
Buraya kadar yaptığımız işlemler ile programımız çalışır hale geldi. Fakat eklediğimiz veriler hafızada tutuluyor ve program kapatıldığında da hafızadan siliniyor. Å?imdi bu verileri bir XML dosyasına yazarak kalıcı hale getirelim.
ECO ile beraber 2 basit kalıcılığı sağlayan(persistence) metod bulunmaktadır. Bu metodlardan birisi XML dosyalarına kaydederken diğeri de RDBMS’e kayıt yaparken kullanılmaktadır. Bu örnekde daha basit ayarlandığından dolayı XML dosyalarında kalıcılık gösterilecektir.
ProjectManager’dan AdresDefteriEcoSpace.pas dosyasına çift tıklayalım. Açık değilse Design kısmına geçip, Enterprise Core Object kategorisinden PersistenceMapperXML bileşenini ekleyelim. Bu bileşenin ismine pmXML ve FileName özelliğine de bir dosya ismi yazalım mesela "veri.xml". Eğer Object Inspector’da EcoSpace’imizin PersistenceMapper özelliğine göz atarsak, otomatik olarak yeni eklemiş olduğumuz pmXML bileşenine ayarlandığını görebiliriz.

Å?imdi WinForm’ a geri dönelim ve bir button ekleyelim. Button’nun ismine btnKaydet, ve Text özelliğine de Kaydet girelim. Burada yine iki seçeneğimiz bulunakta. İster kod girerek istersek de kod girmeden kaydetme işlemini yapabiliriz. Kod girmeden yapabilmek için Button’ nun EcoAction özelliğini UpdateDatabase olarak değiştirelim. Programı çalıştırıp yeni bir kayıt ekleyelim ve kayıt tuşuna basalım. Hepsi bu kadar. Programın bulunduğu klasörde xml dosyamızı görebiliriz. Ayrıca her programı çalıştırmada ECO, otomatik olarak xml dosyasını tekrar yükleyecektir. Eğer kod girerek yapmak istersek, sadece button’nun onClick olayına şu kodu yazmamız yeterli olacaktır:
EcoSpace.UpdateDatabase;
Auto Forms
En son olarak bu bölümde Auto Form’ lardan da bahsetmek istiyorum. ECO Shiribazı ile oluşturmuş olduğumuz programımıza otomatik olarak eklenen bileşenler arasında ECOAutoForms bileşenini görebilirsiniz. Bu bileşen sayesinde aşağıda görüldüğü gibi DataGrid üzerine çift tıkladığımızda, ECO bizim için bir düzenleme formu çıkaracaktır. Bu özelliği aktifleştirmek için, herhangi bir DataGrid’in EcoAutoForm özelliğini True yapmamız yeterlidir.

Sonuç
Bu bölümde Model Driven Development kavramını, ECO’ nun OOP ve model programlamaya getirdiği kolaylıkları, basit bir ECO programının yapılışını görmeye çalıştık. İlerleyen bölümlerde ECO ile daha çok haşir neşir olacağız.
Bu makalde yaptığımız örnek programın kodlarını buradan indirebilirsiniz. Ama kaynak kodları sadece takıldığınız yerlerde bakmak şartıyla indirebilirsiniz. 
Bu bölüm için bir kaç kaynaktan yararlandım. Başta Delphi 2005′in Help’i çok işimi gördü. Bununla birlikte makalenin taslağı olarak(başlıklar ve konu) Bdn’ deki bir makaleyi örnek aldım. Ama bu makale, onun çevirisi değildir. Makalenin adresi aşağıda bulunmaktadır:
http://www.borland.com/us/products/delphi/tutorial/tutorial1.html
Makale ile ilgili yorum, eleştiri ve sorularınızı bekliyorum.
Fatih Tolga Ata © Eylül 2005
Son Güncelleme: 25 Ocak 2007




Güzel bir makale olmuş. Başlangıç için iyi. Ama yeni çıkan ECO bileşenleri ile ilgili de makale bekliyoruz.