wiki-framework-batch-kernel

BATCH KERNEL

Konu başlıkları

 

 

[düzenle] Batch Kernel Nedir ?

Batch Kernel , bir program içerisinde tekrarlanan işler bütününü istenilen şekilde yapan program parçacığıdır. Program içinde tekrarlanan görevler batch mekanizması ile yapılarak programcının üstündeki iş yükünün azaltılması amaçlanır.

Mesela , programımızda iki doğal sayıyı toplamak rutin olarak yapılan bir iş olsun. Bunun için kullanıcıdan sayıları almamız , aldığımız sayıları 0'dan küçük mü diye kontrol etmemiz , ve sayıları toplamamız gerekmektedir. Programın içinde bu işlem sürekli olarak tekrarlandığından her seferinde programcı kullanıcıdan doğal sayıları almak , bunları kontrol etmek ve toplamak ile uğraşacaktır. Bunun yerine iki doğal sayıyı alıp , kontrol eden ve toplayıp sonuç üreten bir batch mekanizma ile toplama işlemi her seferinde programcıya yük olmaktan çıkarılır.

[düzenle] Batch Kernel Sınıfı

Bu sınıf abstract bir sınıf olup , farklı görevler yapan yeni batch'ler oluşturmamıza yarar. Batch mekanizmasının iskeletini batch kernel sınıfından miras alarak yeni bir batch sınıfı oluşturabilir ve bu batch'i farklı görevler yapması için tasarlayabiliriz. BATCH_KERNEL sınfına bir göz atalım..

[düzenle] Zorunlu Fonksiyonlar

Bu fonksiyonlar pure virtual yani abstract fonksiyonlar olup, oluşturacak yeni batch mekanizmasında implement edilmek zorundadırlar. Bu fonksiyonlar batch mekanizmasının temel iskeletini oluştururlar. Bunları batch mekanizmasına yükleyeceğimiz göreve göre tasarlayarak farklı batch mekanizmaları oluşturabiliriz.

[düzenle] SETUP_FORM()

Bu fonksiyon batch için tasarladığımız formu ayarlamamızı sağlar. Form başlığı, RUN_BATCH fonksiyonunu çalıştıracak olan butonun adı, butonu üzerindeki icon, sistem çalıştığında odaklanılacak ilk widget gibi ayarlamalar yapılır.

İki sayı alan ve toplayıp sonucunu bulan bir batch örneği oluşturalım.

  • Batch ekranımız.. :

 

 

 

 

 

 

BATCH_EKRANI_TASARIMI

 

 

 

 

 

 

  • Şimdi SETUP_FORM fonksiyonumuzu kodlayalım. Burada penceremizin başlığı, ilk odaklanılacak widget, buton üzerindeki yazılar ayarlandı.. :
void TEST_SAYILAR_BATCH::SETUP_FORM ()
{
   SET_ENTER_KEY_FOR_RUN_BATCH     ( true );
   SET_NAME_OF_RUN_BATCH_BUTTON ( "SAYILARI TOPLA" );
   SET_FIRST_FOCUS_WIDGET ( m_ui->line_edit_sayi_1 );
   SET_PAGE_TITLE    (tr("SAYI TOPLAMA"));
   SET_SETTING_NAME  ("SAYI_TOPLAMA_BATCH");
   SET_HELP_PAGE     ("SAYI_TOPLAMA.html");
   REGISTER_BUTTON_WIDGET ( m_ui->widget_batch_buttons );
}
  • Batch ekran, bu akış şemasıyla hazırlanır..

 

 

 

ACILIS_EKRANI

 

 

[düzenle] CHECK_VAR()
 Not : Bu fonksiyon BATCH_KERNEL sınıfına , bu sınıfın base classından miras yoluyla gelmiştir.BATCH_KERNEL sınıfından türetilen her sınıfta implement edilmek
       zorundadır. 

Bu fonksiyon çalışma zamanında kullanıcının girdiği değerleri kontrol eder.

  • Sayın toplama örneğimize göre fonksiyonumuz kodlayalım. Bu fonksiyonda, girilen sayıların doğal sayı olup olmadıklarını ve birinci sayının 5'ten büyük olmadığını, ikinci sayının 10'dan büyük olamdığını kontrol edelim. :
int TEST_SAYILAR_BATCH::CHECK_VAR ( QObject * object )
{
   if ( object EQ m_ui->line_edit_sayi_1  ) {
       if( m_ui->line_edit_sayi_1->text().toInt() < 0  OR
               m_ui->line_edit_sayi_1->text().toInt() > 5 ){
           MSG_ERROR("Birinci sayi 0'dan kucuk , 5'ten buyuk olamaz!!!" , this);
           return CEREN_FAIL ;
       }
   }
   if ( object EQ m_ui->line_edit_sayi_2  ) {
       if( m_ui->line_edit_sayi_2->text().toInt() < 0  OR
               m_ui->line_edit_sayi_2->text().toInt() > 10 ) {
           MSG_ERROR("Ikinci sayi 0'dan kucuk , 10'dan buyuk olamaz!!!" , this );
           return CEREN_FAIL ;
       }
   }
   return CEREN_OK;
}
  • Örneğimizi çalıştırarak fonksiyonumuzun nasıl çalıştığına bakalım. 1.ci ve 2.ci sayı olarak sıfırdan küçük sayılar girelim. :
CHECK_VAR_TEST_1
CHECK_VAR_TEST_2
  • Kernel, widget'lara değerler giildiğinde bu akış şemasına göre değerleri kontrol eder.

 

 

 

CHECK_VAR_AKISSEMASI

 

 

[düzenle] CHECK_RUN()

Bu fonksiyonda batch mekanizması çalışırken işlem yapılacak bilgilerde eksik var mı diye kontrol edilir.Hata , eksik olması halinde odaklanılan widget değiştirilmeden bir sonraki adıma geçmesi engellenir.

  • Sayı toplama örneğine göre fonksiyonu kodlayalım.. Burada boş bırakılan alanları kontrol edeceğiz. :
int TEST_SAYILAR_BATCH::CHECK_RUN ()
{
   if( m_ui->line_edit_sayi_1->text() EQ NULL ){
       MSG_ERROR("HATA  : Alan 1 bos birakilamaz.." , this );
       return CEREN_FAIL ;
   }
   if( m_ui->line_edit_sayi_2->text() EQ NULL ){
       MSG_ERROR("HATA : Alan 2 bos birakilamaz.." , this );
       return CEREN_FAIL ;
   }
   return CEREN_OK ;
}
  • Örneğimizi çalıştırarak CHECK_RUN'ın nasıl çalıştığını görelim..1.ci alan ve 2.alan boş bırakıp hata mesajlarını görelim. :
CHECK_RUN_TEST_1
CHECK_RUN_TEST_2
[düzenle] RUN_BATCH()

Alınacak tüm veriler alındıktan sonra asıl amacın gerçekleştirildiği yerdir. Enter'a basıldığında yada RUN_BATCH_BUTON'una basıldığında Kernel tarafından çağırılır.

  • Sayı Toplama örneğimize göre bu fonksiyonu kodlayalım.. Bu fonksiyonda batch ekranı üzerimdeki label'a sayıların toplamını basalım.. :
void TEST_SAYILAR_BATCH::RUN_BATCH ()
{
   QString str = "Toplam : " ;
   str.append( QString::number( m_ui->line_edit_sayi_1->text().toInt() + m_ui->line_edit_sayi_2->text().toInt() ) );
   m_ui->label_toplam->setText( str );
}
  • Örneğimizi çalıştırarak fonksiyonumuzu test edelim..Sayılar girilip enter'a yada SAYILARI TOPLA butonuna basılıyor.. :
RUN_BATCH_TEST
  • Kernel , Run_Batch fonksiyonu bu akış diyagramına göre çalıştırır..

 

RUN_BATCH_AKISSEMASI

 

 

 

[düzenle] Hazir Fonksiyonlar

Bu fonksiyonlar batch mekanizmasının çalışabilmesi için tanımlanmış ve implement edilmiş fonksiyonlardır.

[düzenle] SET_PAGE_TITLE
Pencere adını kullanıcının vereceği isim yapar.
[düzenle] REGISTER_SAVER_BUTTON
Kullanıcı tarafından oluşturulan butonların , CHECK_VAR ve CHECK_EMPTY fonksiyonları ile değerleri kontrol edildikten sonra aktif olmasını sağlar.
[düzenle] SET_ENTER_KEY_FOR_RUN_BATCH
Batch ekranında enter tuşuna basıldığında RUN_BATCH() fonksiyonun çalışıp çalışmayacağını belirler.Bu bir event'tır.Default olarak aktif değildir.
[düzenle] REGISTER_BUTTON_WIDGET
Widget'a RUN_BATCH'i başlatacak olan başlama  butonunu ekler.
[düzenle] SET_NAME_OF_RUN_BATCH_BUTTON
Bu fonksiyon ile üstüne tıklanarak RUN_BATCH'i çağıracak olan butonun ismi atanabilir.Default olarak butonun ismi 'Tamam' olarak gelir.
[düzenle] SET_ICON_OF_BATCH_BUTTON
Bu fonksiyonla RUN_BATCH'i çağıracak olan butona icon atanabilir.Default olarak tanımlı bir icon atanır.
[düzenle] SET_AUTO_EXIT_BATCH
RUN_BATCH  fonksiyonundan sonra batch otomatik olarak kapatılır.
[düzenle] START_BATCH_KERNEL
Batch mekanizmasını başlatır.
[düzenle] RESET_FOCUS
Mekanizmanın widget'a odaklanmasını resetler.

[düzenle] BATCH Tasariminda Dikkat Edilmesi Gereken Kurallar

  • Fonksiyonların çalışma sırasını göz önünde bulundurarak ona göre bir görev dağılımı yapmalıyız.
  • Batch nesnesini çağıracağımız global bir fonksiyon yazmak.Batch nesnesi oluşturmak yerine bu foksiyonu çağırmalıyız.
  • Tıklandığında RUN_BATCH fonksiyonunu çalıştıracak butonu eklemeyi unutmamalıyız.
  • Batch ekranı tasarlayıp bu ekrana register buton widget'ı eklemeyi unutmamalıyız.