Keywords: Nokia Qt 5.0, Microsoft Visual Studio C++ 2010, Eclipse CTD 8 C/C++, SmartFace Designer 3
Bu çalışmada Nokia QT, Eclipse CTD C++, Microsoft Visual Studio C++ ve Smartface Designer geliştirme ortamlarının proje oluşturma ve saklama için yapılandırmaları incelenmiştir.
Nesnelerin serileştirilmesi(serialization – parsing) ve yeniden oluşturulması (deserialization) tüm bu geliştirme ortamlarında ortak olarak kullanılmış bir yapıdır.
IDE’lerin grafik arayüz tasarlayıcıları ele alındığında Eclipse IDE’si farklılık gösterir. Eclipse IDE’sinin grafik arayüz tasarlanması için kendi kütüphaneleri yoktur. Ancak Eclipse IDE için üstün bir özellik olarak düşünebileceğimiz, çok sayıda farklı IDE için tasarlanmış plug-in’ler hali hazırda bulunmaktadır. QT, VS .Net Swing vb. çok sayıda grafik arayüz tasarlayıcı Eclipse IDE’ye entegre olabilir.
QT, Eclipse ve VS .Net IDE’lerinin C++ kodlama saklama yapısı yaklaşık olarak ortakdır. Tümü her bir WinForm sayfası için .cpp, .h dosyaları üretir. Smartface Designer ise application studio tarzında bir IDE olduğundan kodlama yapısını statik kütüphane olarak saklar.
Grafik arayüzlerin saklanması tüm IDE’lerde serileştirme uygulanarak gerçekleştirilmiştir. Hız faktörü düşünülerek serileştirme işlemi ile bir projede yer alan nesnelerin grafik özelikleri, işlevleri bir saklama ortamına (harddisk) aktarılır. Proje başlatıldığında ise yeniden oluşturma ile IDE bu nesnelere yeniden ulaşır. Örnek bir sözde kodlama ile tüm IDE’lerin temel xml serileştirme mantığı şu şekilde tanımlanabilir.
Pencere sınıfından bir pencere nesnesi üretilir.
1 2 3 4 |
Pencere pencere = newPencere(); pencere.sekil = "Default"; pencere.bgrenk = "Sari"; pencere.txtrenk = "Siyah"; |
Serilestirme islermi icin bir serilestirme methodu çağrılır ve nesne bir .xml içerisinde tanımlanır.
1 |
XMLserilestirici serilesitirici = newXMLserilestirici(pencere); |
Sonuc olarak gozlemlenebilecek bir .xml dosyası şu şeklidedir.
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-16"?> <Pencere xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <sekil>Default</sekil> <bgrenk>Sari</bgrenk> <txtrenk>Siyah</txtrenk> </Pencere> |
Belirtilen geliştirme ortamları için proje saklama yapılandırmaları ayrıntılı olarak incelenmiştir.
VS .Net IDE üzerinde bir proje üretildiğinde, IDE projenin dosya ve dizin yapısını versiyonlar küçük farklılıklar gösterse de temel olarak şu sekilde tanımlar.
saveFileTestGUIButTxt
|
|
saveFileTestGUIButTxt.sdf
saveFileTestGUIButTxt.sln
saveFileTestGUIButTxt.suo
|
|
+— saveFileTestGUIButTxt
.vcxproj
.vcxproj.filters
.vcxproj.user
Main.cpp
Form1.cpp
Form1.h
Form1.resx
Form2.cpp
Form2.h
Form2.resx
…
FormN.cpp
FormN.h
FormN.resx
app.ico
app.rc
AssemblyInfo.cpp
stdafx.cpp
stdafx.h
saveFileTestGUIButTxt.sln VS C++ çözüm dosyasıdır. Cözümün ve çözümün içerdiği projelerin donanımdaki yeri ve yapılandırması burada global olarak tanımlanır (debug, release seçenekleri ve çalışma alanlarının tanımlanması vb.)
saveFileTestGUIButTxt.suo çözüm için kullanıcı tarafından kullanılabilecek tüm proje opsiyonlarını içerir. Binary olarak kaydedilmiştir.
saveFileTestGUIButTxt.vcxproj
proje dosyasıdır. İçeriği incelendiğinde bir çok MSBuild elementinin belli bir sıraya göre tanımlandığı görülür. Microsof’un kurulum motoru MSBuild .xml dilinde bir proje oluşturma formatı sunar ve .vcxproj bu format üzerinde tasarlanmıştır. Items, ItemGroup, Labels bu yapı üzerinde tanımlanmış elemenlerdir ve belli bir sıra ile proje format şablonunda (template) yer alırlar. Kısacası projenin build seçenekleri burada gömülüdür.
Bir projede birden çok Form yapısı kullanıldığında (Smartface Designer yapısında sayfa olarak düşünülebilir) her form için .cpp .h ve .resx üretilir. Bu formlar içerisinde kullanılan tüm birimlerin (düğme, text girişi, panel vb.) özellikleri, konumları, action metodları ana form için atanan header ve source içerisinde tasarlayıcıda tasarlanmalarına göre otomatik olarak tanımlanır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// listBox1 this->listBox1->FormattingEnabled = true; this->listBox1->Location = System::Drawing::Point(51, 81); this->listBox1->Name = L"listBox1"; this->listBox1->Size = System::Drawing::Size(120, 95); this->listBox1->TabIndex = 1; // button1 this->button1->Location = System::Drawing::Point(190, 202); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 2; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; |
.resx
resource dosyası xml yapısında olup, form üzerindeki nesnelerin tanımlar. Aslında nesnelerin ne şekilde serileştirildiğinin ve nasıl yeniden oluşturulacağının bilgisini tutar.
Şimdiye kadar bir çözümün içerisindeki bir proje yapısı üzerinde durduk. Ancak bir çözüm, birden çok proje içerebilir. Böyle bir durumda dizin yapısı şu şekilde oluşur.
saveFileTestGUIButTxt
|
|
saveFileTestGUIButTxt.sdf
saveFileTestGUIButTxt.sln
saveFileTestGUIButTxt.suo
|
+— saveFileTestGUIButTxt
.vcxproj
.vcxproj.filters
.vcxproj.user
…
+— saveFileTestGUIButTxt2
.vcxproj
.vcxproj.filters
.vcxproj.user
…
Bu durumda çözümdeki bir proje için geçerli olan tanımlamalar aynı şekilde ikincisi için de geçerlidir.
Özet: Bir projede bulunan tek bir ana form yapısı içerisindeki elementler (düğme, panel, resim vb.) için ayrı ayrı xml dosyası açılmaz. Formda kullanılan tüm elemenlerin yapıları ve serileştirme türleri xml (.resx) olarak tutulur. Elementlerin grafik özellikleri, anaform üzerindeki konumları gibi bilgiler ise anaform için oluşturulan .h ve .cpp içerisinde otomatik olarak tanımlanır. Birden çok anaform tasarlandığında (birden çok sayfa) yeni .resx, .h, .cpp dosyaları otomatik olarak yaratılır.
Birden çok proje içeren çözümler için, tek bir projede yaratılan dosyalar herbir proje için tekrar ayrı dosyalar olarak oluşturulur.
II. NOKIA QT IDE
QT IDE projelerin yapılandırılması konusunda basit ve kolay anlaşılır bir yapı ortaya koyar. IDE üzerinde tasarlanan bir proje için dosya ve dizin yapısı şu şekilde oluşur.
+saveFileGUIwithButtons
.pro
.pro.user
main.cpp
Form1.ui
Form1.cpp
Form1.h
Form2.ui
Form2.cpp
Form2.h
…
FormN.ui
FormN.cpp
FormN.h
.prodosyası otomatik olarak QTCreator editörü (üretec) tarafından üretilir. (kullanıcı tarafından değiştirilebilir, qmake ile compile edilir). Projede kullanılan giriş, çıkış ve tanımlamaların belirtildiği dosyadır. İçeriği aşağıda gösterildiği gibi örneklenebilir. Ancak çok farklı şekillerde de üretilebilir. Bir üretec methodu ya da doğudan kullanıcı tarafından debugging parametreleri dahil bir çok tanımlama işlemi .pro işerisinde yaratılabilir.
QT += core gui
TARGET = saveFileGUIwithButtons
TEMPLATE = app
SOURCES +=main.cpp\
mainwindow.cpp \
newform.cpp
HEADERS += mainwindow.h \
newform.h
FORMS += mainwindow.ui \
newform.ui
.uidosyası, her form içerisinde oluşturulan tüm elementlerin .xml formatında serileştirilmiş olarak kaydedildiği dosyadır. Serileştirici <class>, <widget>, <property>, <rect>, <x>, <y>, <width>, <height>, <brush>, <palette> vb. xml elementleri üretir ve bu elementler ile oluşturulan tüm ana-formlar (Form yapısı altındaki tüm alt-formlar) ayrı ayrı .ui dosyaları şeklinde tanımlanır.
Sınıf .h altında tasarlanır. Sınıfa ait methodlar ve signal-slot bağlantıları ise .cpp altında tanımlanır.
.pro.user kullanıcı seçeneklerini içerir. Proje saklandığı anda editör için kullanıcı tarafından atanmış ya da default seçenekler, proje explorer ağaç yapısı, build parametreleri, degugging, hata ayıklama için (Valgrind vb.) ayarları, compile parametreleri bu dosya içerisinde xml formatında saklanmıştır.
Temel xml yapısında <data>, <variable>, <valuemap> ve <value> elementlerini (child element) ve type ile key tanımlamalarını barındırır. Örneğin oluşturduğum projede editör kurulumu şu şekilde tanımlanmıştır.
Özet: Bir projede bulunan tek bir ana form yapısı içerisindeki elementler (düğme, panel, resim vb.) bu anaforma ait .ui uzantılı bir dosya içerisinde saklanır . Formda kullanılan tüm elemenlerin yapıları ve grafik özellikleri bu dosya içerisinde xml formatında serileştirilmiştir.
Her form’un tanımı aynı isimli sınıf şeklinde .h uzantılı kütüphane dosyasında tanımlanır. Bu sınıf içerisindeki tüm methodlar, signal-slot yapısı şeklinde .cpp uzantılı kaynak kodu içerisinde kullanıcı tarafından yazılır.
III. Eclipse C++ IDE
Eclipse C++ IDE modüler bir yapılandırmaya sahiptir. Kendisine ait arayüz tasarlayıcı kütüphaneleri yoktur. Bir çok fonksiyonel yapılandırmayı plug-in şeklinde IDE’ye eklemek mümkündür. Tüm IDE’ler arasında en kapsamlı IDE olarak düşünülebilir.
Çalışma alanı seçilip o çalışma alanı üzerinde projeler geliştirilir. Proje kayıt aşamasında ise tüm çalışma alanının özellikleri kaydedilir. Proje tekrar açıldığında son çalışma alanı IDE’ye yüklenir ve proje en son çalışıldığı haliyle incelenmeye hazırdır. Kendine has arayüz tasarlayıcı modülü bulunmaz ancak örneğin QT ya da VS .Net IDE’lerinin arayüz geliştirme kütüphanelerini plug-in olarak Eclipse IDE’ye eklemek mümkündür. Diğer IDE’lerin Eclipse IDE’sine entegrasyonları sağlanmıştır. Eclipse IDE’de proje kayıt işlemi sırasında QT ya da VS .Net kütüphaneleri için daha önce anlatılan saklama işlemleri geçerlidir ancak plug-in’ler Eclipse IDE’sine uyum sağlar ve kayıt işlemi sanki Eclipse C++ projesi kayıt ediyormuşuz gibi yapılır.
Eclipse C++ IDE’nin projeleri kaydetmek için kullandığı dosya ve dizin yapısı şu şekildedir.
+saveFileTest01
.autotools
.cproject
.project
Configure.ac
Makefile.am
+—src
Makefile.am
saveFileTest01.cpp
.project otomatik olarak yaratılmış .xml formatlı bir proje dosyasıdır. Eclipse calışma alanı üzerinde işlem yaptığından ve çalışma alanının özelliklerini kaydettiğinden doğrudan proje dosyası şeklinde açılmaz, yani projenin harddiskteki yerine ait tam bağlantı .project dosyası içerisinde kaydedilmez. Ancak çalışma alanı en son kaydedildiğinde çalışma içerisinde var olduğundan çalışma alanı yüklendiğinde otomatik olarak proje yüklenir. Yükleme işleme sırasında Eclipse IDE autotools kullanır ve autoscan ile eriştiği configürasyon bilgileriyle projenin tekrar oluşmasını sağlar. Temel elementleri <description>, <project>, <buildSpec>, <buildcommand>, <argument>, <natures>, <nature> şeklinde tanımlanmıştır.
.cproject .xml formatlı ve projenin tüm ayarlamalarının yapıldığı dosyadır. Hangi modüllerin ekleneceği, hangi autotools ayarlamalarının yapılacağı, kullanıcı için profiling işleminin nerede saklanacağı bilgilerinin tamamı bu dosyada belirtilir. <storageModule>, <configuration>, <folderInfo>, <toolChain>, <tool>, <autodiscovery>, <entry> gibi temel elementler üzerinden serileştirme işlemi yapılır.
.autotools dosyası IDE’de kullanılan autotools ya da autoconf makro kütüphanelerinin çalışma alanında kaydedilmiş ayarlarının .xml formatında tutulduğu dosyadır. <configurations>, <configuration>, <option>, <flag>, <flagvalue> gibi temel elementler kullanılır.
configure.ac, autoscan programının projede yeralan .cpp, .h ve resource dosyalarını tarayarak oluşturduğu farklı platformlarda configurasyon yapmayı sağlayan bir ayarlama dosyasıdır. .cpp bir dosya olarak düşünülebilir. Iceriğinde bulunan bazı makrolar şu şekilde sıralanabilir.
AC_INIT AC_PREREQ AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE AC_EXEEXT AC_PROG_CC
AC_PROG_CXX AM_PROG_LIBTOOL AC_DEFINE
AC_OUTPUT
src dizininde makefile ile .cpp ve .h dosyaları bulunur. Bunlar projede bulunan kaynak ve kütüphane dosyalarıdır. makefile ise derleme için gerekli yapıyı tutar. Kaynak kodlarının, kütüphane dosyalarının, derlemenin şeklinin, derlenen dosyanın bilgilerinin ve dışarıdan eklenen .lib/.dll dosyalarının bilgileri buradadır. QT IDE’sindeki .pro dosyasına eş bir yapısı olduğu düşünülebilir.
Özet: Üzerinde çalışılan projelerin tamamının kaydı çalışma alanının kaydedilmesiyle gerçekleştirilir. Kayıt işlemi sırasında proje ait bilgiler autotools ve configürasyon makroları kullanılarak kaydedilir ve geri oluşturma sırasında bu verilerden yararlanılır. Eclipse IDE’sinde de nesneler .xml olarak serileştirilerek kaydedilir. Arayüz tasarlayıcı plug-in olarak IDE’ye eklenir. Plug-in’in yapısı eklenmeden önce Eclipse IDE’nin kayıt yapılandırmasına uyumlu hale getirilir.
1. Mobinex Smartface Designer IDE
Smartface tasarlayıcı IDE için dosya ve dizin kayıt yapısı şu şekildedir.
saveFileTest.sfpx
+—saveFileTest_data
saveFileTest.lib
+— datatables
+—Localization Strings
+— resources
+— Animations
+— Htmls
+— Images
+— Sounds
+— Videos
.spfx dosyası smartface tasarlayıcıda oluşturulan proje dosyasıdır. Tasarlayıcı arayüzde kaydedilmiş tüm ana-formlara (sayfalar) ait grafik özellikler, konumlar, text formatları ve çıktı üretilecek cihazı ilgilendirdiğini düşündüğüm ve device özellikleri olarak tanımlayabileceğim arayüz üzerindeki tüm ayarlamalar nesne elementi altında tanımlanmaktadır. Temel olarak <Platform>, <PAGES>, <PAGE>, <OBJECTS>, <BUTTON>, <Properties>, <Location>, <Text>, <Images>, <Picture> vb. şeklinde tanımlanmış elementler kullanılarak serileştirme işlemi yapılmaktadır.
saveFileTest.libProjectName_data dizini altında nesne tanımlarının, fonksiyonların statik olarak tanımlandığı dosyadır. Projenin tasarlayıcıda açılmasının ardından derleme aşamasında tüm bu nesne ve fonksiyonlar tasarlanan projeye bağlı olarak çağrılır ve derleyici çıktısı oluşur. Serileştirme yapısı, action call ve sayfalarda oluşturulan formlarla ilgili metodlar bu dosyaya gömülmüştür. Boş bir proje kaydedildiğinde boyutu 672 kb civarındadır. Projeye yeni sayfalar eklendiğinde, hali hazırdaki nesneler ve metodlar kullanılarak, Nokia QT ve VS C++ IDE’lerinde tanımlanan .cpp ve .h dosyalarına benzer dosyalar statik kütüphane şeklinde burada kaydedilmektedir.
resources dizini altında proje için gerekli resim, video vb. tüm yan araçlar kaydedilmektedir.
Smartface Designer üzerinde kaydedilen bir projede tüm anaformlar (sayfalar) tek bir proje dosyası içerisinde .xml formatında kaydedilmektedir. Nesne tanımları ve gerekli metodler saveFileTest.lib dosyasında statik olarak kaydedilmiştir.
İncelenen dört IDE arasında karmaşıklık bazında en uygun aday Nokia QT IDE’si olur. Proje kayıt yapısı, arayüz tasarlama ve saklama yapısı çok iyi tanımlanmış ve modülerdir. Visual Studio .Net C++ IDE’sinde de benzer bir yapı vardır ancak kayıt tanımlamalarının yapısı QT’den farklıdır. Formlardaki elementlere ait grafik ve konum özellikleri .h ve .cpp dosyaları altında saklanır. Ayrıca MSBuilder engine kullanıldığından yapıya ait bilgiye erişmek zordur.
Kullanıcı arayüzü tasarlayıcılar ile birden çok proje ya da bir den çok ana-form oluşturulduğunda QT ve VS .NET IDE’leri her yeni ana-form için yeni tanım dosyaları oluşturur. Proje tanım ve derleme ayarları ayrı dosyalar halinde tutulur. Smartface Designer IDE tüm projeyi, formların grafik özellikleri ve konumlarını, derleme seçeneklerini tek bir dosya içerisinde tutar. Açık kaynak kodlu bir yapısı olmadığından derleme bilgilerini, nesne ve metod yapılarını ise statik kütüphane şeklinde tanımlamıştır. Eclipse entegre bir yapıya sahip olduğundan arayüz tasarlama projelerinde plug-in karmaşıklığını da kendi karmaşıklığı üzerine ekler. Çok büyük projeler için ideal olabilir ancak küçük ölçekli projelerde Eclipse yapısında bir IDE üretmek mantıklı değildir. En başarılı proje kayıt yapısına sahip IDE olarak gördüğüm Nokia QT IDE’sinin kayıt mantığı Smartface Designer IDE’sinin yapısına entegre edilebilir.
Recent Comments