Merhaba arkadaşlar.

Bir proje üzerinde çalışıyoruz şu an. Projeyi C++ ile geliştiriyoruz.

Projede birden fazla server ve birden fazla da client bulunuyor. Clientlar
arası, serverlar arası ve client ile serverlar arası koordinasyon için bir
dolu kontrol mesajının akması gerekiyor.

Şu anda hızlı ilerleyebilmek amacıyla mesajları JSON ile göndermekte karar
kıldık. Sistemin geri kalanının JSON oluşturma içinde boğulmaması için
layering yapmaya karar verdik. Hem ilerde JSON yerine başka yapılara
geçecek olursak(protobuf xml vs.) var olanı değiştirmemiz daha kolay olacak.

Şöyle ki, mesajlarımızı temsil eden classlar var. Her mesaj header ve
payloaddan oluşuyor. Her mesaj classı bir header classını extend ediyor.
Her mesaj ya request ya response oluyor. Payloadla ilgili veriyi class'ın
private değişkenlerinde tutuyoruz. Bu class yapısı, mesajların JSON hali
ile uygulamanın geri kalanını birbirinden ayırıyor. Bir mesaj göndermek
istediğimizde classın private variablelarını JSON'a dönüştürüyoruz. Daha
sonra socket seviyesinde implement ettiğimiz başka bir protokol ile karşı
tarafa yolluyoruz bu JSON'ı.

Sorunumuz JSON'a dönüştürme aşamasında. Bir JSON verisi gönderirken her
mesaj için özel fonksiyon yazmaya başladık başta. 40-50 farklı mesaj tipi
olduğu için yönetilemez bir hal alacağı için başka yollar aramaya koyulduk.
Bu gibi durumlarda kullandığınız yöntemlerle ilgili bilgi verebilir misiniz?

Şöyle birşey yapmayı düşündük: Değişkenleri private olarak tutmak yerine
bir map'te key-value ikilileri olarak tutabiliriz. Değişkenlerin tiplerini
bilemeyeceğimiz için bu değişkenleri heap'ten alıp void*'a cast edip yanına
tipini string olarak iliştirebiliriz. Mesela "username" diye string bir
değişken olsun değeri de "baskin" olsun.

std::map<std::string, std::pair<void*, std::string> > variables;
std::string* uname = new std::string("baskin");
variables[std::string("uname")] = make_pair((void*)uname,
std::string("string"));

JSON'a çevirirken de bu değerin olduğu yer şu şekilde bir hal alsın dedik:

{
  ...
  "uname": {
    "type": "string",
    "value": "baskin"
  }
  ...
}

Böylece receiver değerler ile ne yapması gerektiğini bilecek. (Ne tür
değişkene atması gerektiğini)

Bu metod sizce efektif bir metod mu? Bize hem JSON'ı gereksiz büyüttüğü hem
de C++ stilinden uzak olduğu için güzel gelmedi.

Daha güzel dizayn edilmiş bir metod biliyor musunuz acaba?

Şimdiden teşekkürler, iyi çalışmalar.

Dipnot: private değişkenlerimizin tipleri int, std::string, double, float,
std::vector<struct X> (struct X yerine bizim tanımladığımız 3 farklı struct
gelebilir)

-- 
*Baskın Burak Şenbaşlar*
*Orta Doğu Teknik Üniversitesi*

*Bilgisayar Mühendisliği #3*
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php

Cevap