Optimizasyonu çok seviyorum. Yaptığım testler sonucunda x kadar performans gösteren bir kodun 2x performans göstermesi benim için çok tatmin edici bir şey. Bu yazıda yeterince beni tatmin eden ama henüz olgunlaşmamış, tam olarak pişmemiş bir şeyi anlatacağım. Ve tam pişmesini beklemeden…
Her şey Linkedin’de bu gönderiye denk gelmemle başladı. Böyle deneysel şeyler düşünmek iyi geliyor. Sınırları zorlamayı sağlıyor. Başta gönderiyi hızlıca okuyup geçtim. Çok hasta olduğum bir dönemdi. Bu nedenle uzanmam gerekiyordu ve telefona çok bakamıyordum. Düşünmek için çok vaktim vardı. İstemsizce kafamda bir şablon oluştu. Aha! dedirten noktaya gelince ben de gönderiye yorum atıp ayrıca profilimde şunu paylaştım.

Evet hızlı bir taslak için güzel gözüküyor olabilir ama rahatsız edici. Veriye müdahale ediyor. Ama iki gönderinin de arkasındaki mantık bence yerinde. JSON formatında anahtar değerlerin tekrarlanması sorununa değiniyor. Bu taslaktaki rahatsız eden şeyi çözmeli ve formatı son haline getirmeliydim. Deneye yanıla ve bir iki güne yayarak en sonunda bir formata ulaştım. İsim olarak Brief kelimesinin Fransızca’sı “Bref” ismini tercih ettim. Ayrıca basit bir logo olarak da DNA emojisini seçtim. Küçük bir alana çok veri. Detaylarına geçelim.
Bref neyi değiştiriyor?
JSON formatında çok standart bir yapı var. Bu güzel bir şey. Bir bakışta ne olduğu anlaşılıyor. Ama büyük veriler için aynı şemaların sürekli tekrarlanmasına sebep oluyor. Yeni formatımız JSON’u default olarak desteklemeli. Çünkü her veri tekrarlı değil. Örneğin ayar dosyaları gibi anahtarların çok tekrarlanamadığı dosyalarda tamamen JSON yazabilmeliyiz. Genelde veritabanından çekilen tekrarlı verilerde ise bu format fark yaratmalı. Amaç tekrarlayan anahtarları ortadan kaldırmak.
Tüm bunları göz önüne alınca da format kendiliğinden beliriyor. Önce bir JSON verisini görelim.
[
{
"title": "Bohemian Rhapsody",
"duration": "5:55",
"genre": "Rock",
"album": {
"title": "A Night at the Opera",
"year": 1975,
"band": {
"name": "Queen",
"country": "UK"
}
},
"streams": 1980000000,
"is_favorite": true
},
{
"title": "Smells Like Teen Spirit",
"duration": "5:01",
"genre": "Alternative Rock",
"album": {
"title": "Nevermind",
"year": 1991,
"band": {
"name": "Nirvana",
"country": "USA"
}
},
"streams": 1750000000,
"is_favorite": true
},
{
"title": "Hotel California",
"duration": "6:30",
"genre": "Rock",
"album": {
"title": "Hotel California",
"year": 1976,
"band": {
"name": "Eagles",
"country": "USA"
}
},
"streams": 1640000000,
"is_favorite": false
},
{
"title": "Wonderwall",
"duration": "4:18",
"genre": "Alternative Rock",
"album": {
"title": "(What's the Story) Morning Glory?",
"year": 1995,
"band": {
"name": "Oasis",
"country": "UK"
}
},
"streams": 1430000000,
"is_favorite": true
}
]Bref haline bakalım.
:artist { name, country }
:album { title, year, artist:artist }
:song { title, duration, genre, album:album, streams, is_favorite }
[
{
"Bohemian Rhapsody", "5:55", "Rock",
{ "A Night at the Opera", 1975, { "Queen", "UK" } },
1980000000, true
},
{
"Smells Like Teen Spirit", "5:01", "Alternative Rock",
{ "Nevermind", 1991, { "Nirvana", "USA" } },
1750000000, true
},
{
"Hotel California", "6:30", "Rock",
{ "Hotel California", 1976, { "Eagles", "USA" } },
1640000000, false
},
{
"Wonderwall", "4:18", "Alternative Rock",
{ "(What's the Story) Morning Glory?", 1995, { "Oasis", "UK" } },
1430000000, true
}
]: songBu kadar. Önce veri formatlarını tanımlıyoruz. Altta verilerimiz var. Bu verilerde tip tanımını belirtiyoruz. Gerisini Bref parser hallediyor.
ANA KURAL
Tip tanımladığınız objelerde anahtar değerleri yazmak zorunda değilsiniz.
En basit haliyle Bref tanımlaması
:song { title, duration, streams, is_favorite }
{ "Bohemian Rhapsody", "5:55", 1980000000, true }: songBunun çıktısı şu:
{
"song": {
"title": "Bohemian Rhapsody",
"duration": "5:55",
"streams": 1980000000,
"is_favorite": true
}
}İç içe verilerde nasıl yapacağız peki. çok basit her katmandaki veri tipini ayrı ayrı tanımlayacağız.
:song { title, duration, genre, album:album, streams, is_favorite }
:album { title, year, band:band }
:band { name, country }
{
"Bohemian Rhapsody", "5:55", "Rock",
{ "A Night at the Opera", 1975, { "Queen", "UK" } },
1980000000, true
}: songGördüğünüz gibi objelerde : işaretiyle tip tanımlamasını verebiliyoruz. Bunun çıktısı da aşağıdaki gibi:
{
"title": "Bohemian Rhapsody",
"duration": "5:55",
"genre": "Rock",
"album": {
"title": "A Night at the Opera",
"year": 1975,
"band": {
"name": "Queen",
"country": "UK"
}
},
"streams": 1980000000,
"is_favorite": true
}Birden fazla song tipindeki veriyi tanımlarken bir kolaylık olarak direkt dizinin kendisine tip tanımlaması yapabiliriz.
:song { title, duration, genre, album:album, streams, is_favorite }
:album { title, year, band:band }
:band { name, country }
[
{
"Bohemian Rhapsody", "5:55", "Rock",
{ "A Night at the Opera", 1975, { "Queen", "UK" } },
1980000000, true
},
{
"Smells Like Teen Spirit", "5:01", "Alternative Rock",
{ "Nevermind", 1991, { "Nirvana", "USA" } },
1750000000, true
}
]: songArray tipindeki verilerin tip tanımlamasını da [] işareti ekleyerek yapıyoruz. Bu sayede tipi tanımlarken array formatında veri geleceğini belirtiyoruz.
:song { title, duration, genre, album:album, streams, is_favorite }
:album { title, year, band:band, tracks:track[] }
:band { name, country }
:track { title }
[
{
"Bohemian Rhapsody", "5:55", "Rock",
{
"A Night at the Opera", 1975, { "Queen", "UK" },
[ { "Love of My Life" }, { "You're My Best Friend" } ]
},
1980000000, true
}
]: songTamamen JSON desteği
Özünde Bref formatı JSON tip tanımlamayı sağlayan bir format olduğundan JSON veri tipini tamamen destekliyor.
:song { title, duration, genre, album:album, streams, is_favorite }
:album { title, year, band:band, tracks:track[] }
:band { name, country }
:track { title }
[
{
"Bohemian Rhapsody", "5:55", "Rock",
{
"A Night at the Opera", 1975, { "Queen", "UK" },
[ { "Love of My Life" }, { "You're My Best Friend" } ]
},
1980000000, true
},
{
"title": "Blinding Lights"
}
]: songİkinci veride JSON veri formatına uygun olarak tanım yaptığımız için bu veri geçerli oluyor. Dizide tanımlı olan song veri formatını override ediyor.
Dökümantasyon
Diğer tanımlamaları burada uzun uzun göstermeyeceğim. Bunun için bir dökümantasyon sitesi hazırladım. Bref veri formatının tüm detaylarını bu siteden inceleyebilirsiniz.
Bref Dökümantasyonu: https://bref-docs.vercel.app
Devam Edecek…
Bu konuda görüşlere tamamen açığım. Ek not olarak, parsing işlemini yavaşlattığı için daha optimize kalabilmek adına bazı özellikleri çıkaracağım. Formatın son halini yazı dizisinin en sonunda netleştireceğim. Bir sonraki yazıda parser aracını yapay zeka kullanarak nasıl yaptığımı ve bu aşamada fark ettiğim bazı ilginç detayları anlatacağım. Benchmark testlerini de bir sonraki yazıda ekleyeceğim.
Bref #1: sanırım sağlam bir şey bulduk.