12 Nisan 2014 Cumartesi

XML ÖZELLİKLERİ

Extensible Markup Language (Genişletilebilir İşaretleme Dili, kısaca XML),
hem insanlar hem bilgi işlem sistemleri tarafından kolayca okunabilecek dokümanlar
oluşturmaya yarayan, W3C tarafından tanımlanmış bir standarttır ve hiç bir kurum yada firmanın tekelinde değildir.
Bu özelliği ile veri saklamanın yanında farklı sistemler arasında veri alışverişi
yapmaya yarayan bir ara format görevi de görür.

XML günümüzde en en yaygın kullanılan teknoloji konumundadır. Belgenin hem yapısını hemde görünümünü
tanımlamak için kullanılan uluslar arası bir standart konumundadır. Bu özellik bakımından HTML'den
ayrılmaktadır. HTML sadece görünüm ile alakalıdır.XML'i bu kadar ön plana çıkaran
özelliklere bakacak olursak.

Özellikleri

  • Xml platform bağımsız bir teknolojidir aynı java dili gibi yani her durumda her türlü ortamda çalışabilmektedir. 
  • Veri tabanlarına XML servisleri kullanarak verilerin dış sisteme taşınmasına olanak sağlar.
  • Kendi etiketlerinizi oluşturmaya olanak tanır bu durum rahat programlamaya zemin hazırlar. Bu etiketlerin kendi içerisinde bir standartı vardır.bu yüzden oldukça esnek bir dildir. 
  • XML HTML gibi markup bir dildir. HTML'in çocuğu diyebiliriz. Genel olarak bu dillerin başında SGML gelmektedir.
  • XML bir meta-dildir yani etiketler (tags) yardımıyla başka bir dil tanımlamaya olanak sağlar yani XML ile yeni bir dil tanımlanabilir.

Verileri Nasıl Saklar

  • XML verileri içerikleri ile birlikte etiketler arasında saklar ve taşınmasına olanak sağlar.
  • XML halinde tutulan verilerde istediğimiz anda istediğimiz bilgiyi çok rahat birbirinden ayırabiliriz.

Belgelerinin Kod Yapısı

  • XML belge yapısı hiyerarşik ağaç yapısına benzer bir kök ve onun altında birbirine bağlı  birden fazla node bulunmaktadır.Belgede en üst seviyedeki eleman köktür (root node). 
  •  Belgemizdeki her elemanın bir başlangıç ve bir bitiş etiketi bulunmak zorundadır. Bu etiketlerin adlandırılması programlama dillerindeki değişken tanımlama kuralları ile aynıdır. 

Amacı

  • XML'in esas amacı verileri taşımak ve görüntülemektir. Kurum ve kuruluşlar arasında alışverişe olanak sağlar. Örnek olarak bir yer .NET başka bir yer java ortamında çalışıyorsa XML bu ortamlara arasında veri taşınmasına olanak sağlar
  • XML standart olarak tanımlandığı için veri alışverişinde kolaylık sağlamaktır.
Örnek bir XML kod parçasına bakacak olursak. 

Yukarıda not defterinde yazılmış bir xml kod parçası bulunmaktadır. Burada dikkat edilmesi gereken nokta XML tag'larımızdır. Her açılan tag başka bir tag ile kesişmeyecek şekilde / işareti ile kapatılmalıdır.  Bu şekilde standartlara uygun şekilde kodlama yapılmaktadır. Aksi takdirde XML kodumuz hatalı olacaktır.
XML ile kod geliştirmek ve bu kodu derleyip çalıştırmak için ek bir yazılıma gerek duyulmaz. Not defterinde bulunan kodumuzu bir web tarayıcısında bile görüntüleyebiliriz.


XML hakkında daha detaylı bilgi ve eğitimini almak isterseniz buraya tıklayabilirsiniz. 


Zaman ayırdığınız için teşekkürler J
Lütfen yorum yapınız ...



3 Eylül 2013 Salı

COMMAND PATTERN NEDİR ( C++ UNDO İLE )

              
      Command Pattern yapısı çok kullanılan ve benimde sevdiğim pattern yapılarından biridir. Bu yapı temel metod çağrışımlarını birbirinden soyutlamayı amaçlar. Peki ne anlama geliyor bu açıklamaya çalışalım.

          
      Commad Patternde genel olarak hep bir buton kalıbı geçer yani runtime anında durumları değişikliğe uğraması. Durumlar değişirken bir nesne istek yapar ve o isteği başka bir nesne alıp gerçekler. Gerçekleme durumunun nasıl olduğundan istek yapan nesne sorumlu değildir. Böylelikle isteği yapan ve onu alan nesneyi birbirinden ayırmış oluyoruz. Bu işlemi program kısmında nasıl gerçekliyoruz birde ona bakalım şimdi. 



Yandaki Command Pattern uml diagramındır. Şekilde de görüldüğü gibi tüm komutlarımız ( Command) commaand base sınıfı altında tek bir arayüzde toplanmıştır. Bu bize kontrol panelindeki butonlara Command tipinde nesneler atamamızı sağlamaktadır. Yapılmasını istediğimiz her bir istek için yeni bir Command sınıfı oluşturmamız gerekmektedir.

          Ben yazdığım programda 3 farklı cihazı tek bir kontrol panelinden yönetmeyi sağlayan basit bir yapı oluşturmuştur. Aşağıdaki kod kısmında da göreceğimiz gibi bir kumanda yardımıyla birden çok cihazı kontrol edebiliyoruz. Tabi bu kontrol edilebilecek cihazların sayısı, türü, ve konbinasyonları tamamen bizim isteklerimize ve ihtiyaçlarımıza bağlıdır.

Undo:   

Command pattern yapısında çok araştırılan diğer bir yapıda undo kalıbıdır. Undo kalıbı en son yaptığımız işlemi geri almamızı sağlar aynı evlerimizdeki televizyon kumandalarında olduğu gibi. Programa uygulanması ise oldukça kolaydır yapmamız gereken Command base sınıfına undo fonksiyonu ekleyip her bir komutun yaptığı işlemi tam tersi şekilde yapmasını sağlamaktır. Kontrol panelinde undo komutunu çalıştırmak için ek bir fonksiyon yazmamız undo komutu için yeterlidir. Anlattıklarıma birde kod üzerinde bakarsak daha anlaşılır olacaktır.

Kod :


#include <iostream>
#include<string>

using namespace std;

/////////////////////////////////////////////////////
//    Kumandanın işlem yapıcağı classlar
/////////////////////////////////////////////////////

class Light
{
private:
       string name;

public:
       Light(string x) : name(x){}
       ~Light(){}

       void On()
       {
             cout << name <<" Light on ..." << endl;
       }

       void Off()
       {
             cout << name <<" light off ..." << endl;
       }
};

class Tv
{
private:
       string name;

public:
       Tv(string x) : name(x){}
       ~Tv(){}

       void On()
       {
             cout << name << " Tv on..." << endl;
       }
       void SetVolume()
       {
             cout << name << " Volume : 15 ..." << endl;
       }
       void setChannel()
       {
             cout << name << " Channel : 1 ..." << endl;
       }

       void Off()
       {
             cout << name << " Tv off..." << endl;
       }
};

/////////////////////////////////////////////////////
//    Üstteki sınıfların commandleri
/////////////////////////////////////////////////////

class Command
{

public:
       Command(){}
       ~Command(){}

       virtual void execute() = 0;   // komutlarımızın çalışmasını sağlıyan fonksiyon.
       virtual void undo() = 0;       // bir önceki komutu çalıştıracak fonksiyon.
        
};

class lightOnCommand : public Command
{
private:
       Light *light;

public:
       lightOnCommand(Light *light)
       {
             this->light = light;
       }

       ~lightOnCommand(){}

       void execute()
       {
             light->On();
       }
       void undo()
       {
             light->Off();
       }
};

class lightOffCommand : public Command
{
private:
       Light *light;

public:
       lightOffCommand(Light *light)
       {
             this->light = light;
       }
       ~lightOffCommand(){}

       void execute()
       {
             light->Off();
       }
       void undo()
       {
             light->On();
       }
};


class TvOnCommand : public Command
{
private:
       Tv *tv;

public:
       TvOnCommand(Tv *tv)
       {
             this->tv = tv;
       }
       ~TvOnCommand(){}

       void execute()
       {
             tv->On();
             tv->setChannel();
             tv->SetVolume();
       }
       void undo()
       {
             tv->Off();
       }
};

class TvOffCommand : public Command
{
private:
       Tv *tv;

public:
       TvOffCommand(Tv *tv)
       {
             this->tv = tv;
       }
       ~TvOffCommand(){}

       void execute()
       {
             tv->Off();

       }
       void undo()
       {
             tv->On();
             tv->setChannel();
             tv->SetVolume();
       }
};

class NoCommand : public Command
{
public:
       NoCommand(){}
       ~NoCommand(){}
       void execute()
       {
             cout << "NoCommand..." << endl;
            
       }
       void undo()
       {
             cout << "NoCommand..." << endl;
            
       }
};

/////////////////////////////////////////////////////
//    Kontrol paneli yani kumanda
/////////////////////////////////////////////////////

class RemoteControl
{

private:
       static const int slot = 4;      // kumandamızın tuş sayısı.
       Command *OnSlot[slot];
       Command *OffSlot[slot];
       Command *noCommand;
       mutable Command *undo;

public:
       RemoteControl()
       {
             noCommand = new NoCommand();
             for (int i = 0; i < slot; i++)
             {
                    OnSlot[i] = noCommand;   // başlangiçta boş oldukları için yapılandırıcıda 
                    OffSlot[i] = noCommand;  // nocommand olarak değer ataması yapılır...
             }
             undo = noCommand;
       }
       ~RemoteControl()
       {
             delete noCommand;
       }

       void setCommand(int slot, Command* onCommand, Command* offCommand){
             OnSlot[slot] = onCommand;     // kumandamızın on ve off butonlarına atama
             OffSlot[slot] = offCommand;   // yapmak için set fonksiyonumuz
       }

       void onButtonWasPushed(int slot) const
       {
             OnSlot[slot]->execute();      // girilen slottaki on buton çalışacak
             undo = OnSlot[slot];
             cout << "---------------------------------" << endl;
       }

       void offButtonWasPushed(int slot) const
       {
             OffSlot[slot]->execute();     // girilen slottaki off buton çalışacak
             undo = OffSlot[slot];
             cout << "---------------------------------" << endl;
       }
       void undoButtonWasPushed()
       {
             undo->undo();
             cout << "---------------------------------" << endl;
       }
};

       int main()
       {
             RemoteControl *remoteControl = new RemoteControl(); // Kumandamızı oluşturuyoruz.

             Light *kitchenLight = new Light("Kitchen"); ///
             Light *bathRoomlight = new Light("Bath Room");  ///  kontrol edilecek aletlerimizi oluşturuyoruz.
             Tv *tv = new Tv("Television");            ///  

             lightOnCommand *KitchenLightOn = new lightOnCommand(kitchenLight);
             lightOffCommand *KitchenLightOff = new lightOffCommand(kitchenLight);
            
             lightOnCommand *BathroomLightOn = new lightOnCommand(bathRoomlight);
             lightOffCommand *BathroomLightOff = new lightOffCommand(bathRoomlight);
              
             TvOnCommand *tvOn = new TvOnCommand(tv);      //  bu kısımda ise on ve off buton pointer
             TvOffCommand *tvoff = new TvOffCommand(tv);   //  oluşturuyoruz.

             remoteControl->setCommand(0, KitchenLightOn, KitchenLightOff);     //
             remoteControl->setCommand(1, BathroomLightOn, BathroomLightOff);  //   kuamandamızın tuşlarına değerleri atıyoruz.
             remoteControl->setCommand(2, tvOn, tvoff);                       //

             remoteControl->onButtonWasPushed(0);
             remoteControl->onButtonWasPushed(2);
             remoteControl->onButtonWasPushed(1);
             remoteControl->offButtonWasPushed(0);
             remoteControl->undoButtonWasPushed();
             remoteControl->offButtonWasPushed(2);
             remoteControl->onButtonWasPushed(3);
             remoteControl->undoButtonWasPushed();


             system("pause");
             return 0;

       }

Output : 




Programımızda da görüldüğü gibi tüm komutlar tek bir nesne üzerinden yürütülüyor yani kontrol panelinden. Command Pattern özelliği de bu kısım için geçerlidir. İstek yapılır ama isteğin nasıl gerçekleştirildiği bizi ilgilendirmez. Undo komutları çıktımız da da görüldüğü gibi en son yapılan işlemi geri almaktadır.

Zaman ayırdığınız için teşekkürler J
Lütfen yorum yapınız ...