Forum: Ders Arası RSS
D Şirketi'nin başı, JSON ile belada...:)
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D Şirketi'nin başı, JSON ile belada...:)
Baba ve oğulun patron olduğu bir D ailesi şirketimiz var ve biz bunu JSON ile şu şekilde ifade ediyoruz:

string veri = `
{
    "patron":
    {
          "oğul":{"ismi":"Ahmet"},
          "baba":{"ismi":"Mahmut"}
    }
}`;

Kurallara uygun mu? Uygun, çünkü şu şekilde okuyabiliyoruz...

    writefln("Oğul patron, %s bey ise", parseJSON(veri).object["patron"]
                                                       .object["oğul"]
                                                       .object["ismi"].str);
 
    writefln("Baba patron, %s beydir!", parseJSON(veri).object["patron"]
                                                       .object["baba"]
                                                       .object["ismi"].str);

Ancak bunu "data structures" kodunu (yapısını) nasıl kuracağız? Şöyle bir şey aklıma geliyor, saçma oldu gibi!

struct Patron 
{
    struct oğul 
    {
        string ismi;
    }
    struct baba 
    {
        string ismi;
    }
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
JSON düzeninden koda geçmek doğru olmayabilir. Gördüğüm kadarlık koda bakarak patron kavramının içindeki 'oğul'un ve 'baba'nın bir tür referans olduklarını görüyorum.

Yani aslında İnsan diye bir tür de var ve Patron'un içindeki üyeler İnsanlar topluluğunun içindeki iki insana referans oluyorlar gibi. Öyle mi? Yani Patron insanlardan oluşmaz, başka yerde duran insanlara referanstan oluşur. "Bu firmadaki patronlar şu ve şu kişilerdir" dediğimizde yalnızca kişilere gönderme yapıyoruz.

O yüzden şu doğru:

struct Patron
{
    string oğul;
    string baba;
}

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında XML ile kolaylıkla yapabileceğimiz "nested data structure" gerçekleştirmek istiyorum. Yani hiyerarşik bir yapı söz konusu ki bu sadece şirket patronlardan oluşmayacak. Örneğin;

Ortaklardan biri (baba ve oğul dememin sebebi samimi görünmesi içindi) pazarlama ve satış müdürlerinden sorumlu, daha doğrusu altındaki bu müdürler ona rapor vermekteler, diğer ortak ise satın alma ve muhasebe müdürlerini kapsamakta. Öyleyse yapı şöyle olabilir:

Yöneticiler (kök)
  • Baba
    • Satın Alma Müdürü
    • Muhasebe Müdürü
  • Oğul
    • Pazarlama Müdürü
    • Satış Müdürü

Elbette bu müdürler altında yardımcı idareciler (chief, supervisor, leader vb.) de olacağı için hiyerarşiyi sürdürebilmeliyiz...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sıradüzeni JSON ile ifade etmekte bir sorun yok. Yanıtlanması gereken şu: Kişiler diye ayrı bir topluluk var da Yöneticiler onun içindeki insanlara referans mı taşıyor? Bence öyle olmalı. Ondan sonra referansın kişi ismi mi yoksa Kişi göstergesi mi olduğuna karar verilir.

Yani örneğin her Kişi türünün yaş, maaş, vs. bilgileri olacak. Bu bilgilerin Yöneticiler türünün içinde olmasını istemiyorsun, değil mi? Yöneticiler yalnızca sıradüzeni tutar ama her kişinin bilgisi yandaki Kişiler topluluğunda durur.

Yöneticiler de bir ağaç yapısı. Her düğümünde Görev ve İsim olması yeterli. İsim ile Kişiler içindeki hangi kişi olduğu bilinir.

Ben öyle anlıyorum.

Ali
Kadir Can #5
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Daha fazla veri için işe yaramayabilir ama sadece birkaç bilgi kullanılacaksa eşleme tablolarının kullanımı uygun olmaz mı?
Örnek;
string[][string] yöneticiler = [ "baba" : ["Patron", "Satın Alma Müdürü", "Muhasebe Müdürü"],
                                 "oğul" : ["Patron", "Pazarlama Müdürü", "Satış Müdürü"],
                                 "yeğen": ["İdareci", "Satın Alma Müdür Yardımcısı"] ];
Bana makul göründü.Hatta  "Şirket" yapısı içinde "Patron" yapısı tanımlayıp onun içine "Bölüm Müdürü" yapısını tanımlayıp değer kısmında onu kullanabilirsek daha iyi olur gibi geliyor:
//Tanım kısmından emin değilim, boş bırakıyorum
/* */ yöneticiler = [ "baba" : [ şirket.patron.müdür.satın_alma, şirket.patron.müdür.muhasebe ] ];
Böyle bir esneklikten faydalanabiliyorsak birçok alanda çok faydalı olur.
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2012-06-13, 16:29.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hepsi olabilir. Birincisi bir "kişiler ve ünvanları" tablosu anlamına gelmiş. İkincisi de "şu kişi şu görevlerden sorumludur" gibi.

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
acehreli:
Yani örneğin her Kişi türünün yaş, maaş, vs. bilgileri olacak. Bu bilgilerin Yöneticiler türünün içinde olmasını istemiyorsun, değil mi?
Tam tersi, daha kapsamlı olacak. Bunun, personelin bir çok verisini tutan bir ERP yazılımı olduğunu düşünelim; ve bu şirketteki hiyerarşik düzenin önemli olduğunu...

Hatta bunun global bir firma olduğunu kim kimle ilişki kurmuş ve nasıl yazışmış. Bağlantıları hangi sıra ile olmuş CRM yazılımı olarak da düşünebiliriz.

Özetle hiyararşinin iliklerimizde hissedebileceğimiz kadar bir yapı (nested structure) olacak. Standart child mantığı işte ve JSON bunu bize verebiliyor ama nasıl kullanacağımı (okuma tamam da, yazma!) henüz keşfedemedim...:(

Peki hiyerarşiyi şöyle anonim bir örnek ile işlesek nasıl olur?
import std.stdio, std.json;
 
void main() {
    string veri = `
{
"aile": {
        "anne": {
            "ismi":"Havva"
        },
        "baba": {
            "ismi": {
                "ilkadı":"Adem"
            },
            "oğlu": {
                "ismi":"Kabil"
            }
        }
    }
}`;
 
    with (parseJSON(veri).object["aile"]) {
        writef("%s'dan olma ", object["anne"].object["ismi"].str);
        writef("%s'in oğlu: ", object["baba"].object["ismi"].object["ilkadı"].str);
        writefln("%s", object["baba"].object["oğlu"].object["ismi"].str);
    }
}
Çıktısı:
Havva'dan olma Adem'in oğlu: Kabil

acehreli:
Hepsi olabilir. Birincisi bir "kişiler ve ünvanları" tablosu anlamına gelmiş. İkincisi de "şu kişi şu görevlerden sorumludur" gibi.

Ali
Sanırım bu satırlar İstanbul'dan gelen elektronlar sayesinde yazıldı. Öyleyse hoş geldin...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-06-14, 12:23.
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım oldu...:)

Şimdi sıra, bunu OOP mantığına oturtmak...
/*
    hiyerarşi.d (15.06.2012)
*/
import std.stdio, std.json;
 
void main() {
    JSONValue json;
    JSONValue[string] kat1, kat2,
                      kat3a, kat3b,
                      kat4a, kat4b;
    string veri;
 
    json.type = JSON_TYPE.STRING;
    {
        json.str = "Havva"; kat3a["ismi"] = json;
        json.str = "Adem";  kat4a["ilkadı"] = json;
        json.str = "Kabil"; kat4b["ismi"] = json;
    }
 
    json.type = JSON_TYPE.OBJECT;
    {
        json.object = kat3a; kat2["anne"] = json;
        json.object = kat2;  kat1["aile"] = json;
    }
 
    json.object = kat1;
    veri = toJSON(&json);
    veri.writeln;
 
    json.type = JSON_TYPE.OBJECT;
    {
        json.object = kat4a; kat3b["ismi"] = json;
        json.object = kat4b; kat3b["oğlu"] = json;
        json.object = kat3b; kat2["baba"] = json;
        json.object = kat2;  kat1["aile"] = json;
    }
 
    json.object = kat1;
    veri = toJSON(&json);
    veri.writeln;
 
    with(parseJSON(veri).object["aile"])
    {
        writef("%s'dan olma ", object["anne"].object["ismi"].str);
 
        with(object["baba"])
        {
            writef("%s'in oğlu: ", object["ismi"].object["ilkadı"].str);
            writefln("%s", object["oğlu"].object["ismi"].str);
        }
    }
}/*
Çıktısı:
{"aile":{"anne":{"ismi":"Havva"}}}
{"aile":{"anne":{"ismi":"Havva"},"baba":{"ismi":{"ilkadı":"Adem"},
                                 "oğlu":{"ismi":"Kabil"}}}}
Havva'dan olma Adem'in oğlu: Kabil
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-06-15, 12:03.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 05:04:10 (UTC -08:00)