Forrester 2025 Enterprise Architecture Wave raporuna göre Domain-Driven Design (DDD) uygulayan kurumsal yazılım ekipleri, geleneksel katmanlı mimariye kıyasla yeni özellik teslim süresini %47 kısaltırken üretim hatalarını %38 azaltıyor. Eric Evans’ın 2003’te yayımladığı “blue book”un üzerinden 22 yıl geçmesine rağmen DDD, ThoughtWorks Technology Radar 2025 sonbahar sayısında hâlâ “Adopt” halkasında yer alıyor. Karmaşık iş kuralları içeren finans, sigorta, lojistik, sağlık ve regülasyona tabi sektörlerde DDD; kod ile iş dünyası arasındaki tercüme kaybını ortadan kaldıran tek olgun mimari yaklaşım olarak öne çıkıyor. Bu rehberde stratejik DDD kavramlarını (bounded context, ubiquitous language, context mapping), taktik desenleri (aggregate, entity, value object, domain event, repository, service), event-driven mimariye geçiş yolunu ve gerçek kurumsal vaka analizini 2026 perspektifiyle ele alıyoruz.

Stratejik DDD: Bounded Context ve Ubiquitous Language

DDD’nin kalbi stratejik tasarımdır; teknik tasarım ondan sonra gelir. Bounded context, içinde bir kavramın tek ve net anlama sahip olduğu sınırdır. Örneğin “Müşteri” kavramı, satış context’inde potansiyel alıcı (lead, prospect) iken; fatura context’inde vergi numaralı tüzel kişidir; hasar context’inde ise poliçe sahibi sigortalıdır. Aynı kelime, farklı bağlamlarda farklı veri modeli, farklı invariant ve farklı yaşam döngüsü taşır. Ubiquitous language, geliştirici ile iş uzmanının aynı sözlüğü kullanmasını sağlayan birleştirici dildir; kod isimleri, veritabanı kolonları, API endpoint’leri, hatta Jira ticket başlıkları bu dile uymalıdır.

Vaughn Vernon’un Implementing Domain-Driven Design kitabında vurguladığı gibi, stratejik tasarım kararları taktik kararlardan 10 kat daha kritiktir; yanlış çizilmiş bir bounded context sınırını sonradan düzeltmek tüm aggregate’leri yeniden tasarlamak demektir. DDD Europe 2025 konferansında “context discovery” oturumlarının payı %42’ye yükseldi; topluluk artık taktik patternleri rüştünü ispat etmiş kabul ediyor ve enerjiyi sınır çizmeye yönlendiriyor.

  • Conway uyumu: Bounded context sınırları, organizasyon yapısı ile uyumlu olmalıdır; aksi halde sistemin yapısı ekip iletişim ağının yapısını kopyalamaya zorlanır ve karmaşıklaşır.
  • Veri ayrımı: Her bounded context kendi veritabanı şemasına (mümkünse kendi instance’ına) sahip olur; cross-context join yapılmaz, iletişim API veya event üzerinden gerçekleşir.
  • Context map: Diğer bağlamlarla ilişkiler (partnership, customer-supplier, conformist, anti-corruption layer, open host service, published language) bir context map ile görsel olarak tanımlanır ve sürüm kontrolünde tutulur.
  • Sözlük disiplini: Ubiquitous language sözlüğü, kod isimleri ile bire bir eşleşmelidir; “Customer” sınıfı varsa iş uzmanı da onu “Customer” olarak anmalı, geliştirici “User” yazmamalıdır.
  • Core domain odağı: Bir organizasyonda 3–5 bounded context “core domain” sayılır; gerisi supporting veya generic’tir. En iyi mühendisleri core domain’e ata.

Taktik Building Blocks: Entity, Value Object, Aggregate, Domain Event

Aggregate, transactional tutarlılığın korunduğu sınırı tanımlar. Bir aggregate root, kendi içindeki tüm değişiklikleri koordine eder ve invariant’ları korur. Vernon’un kuralı net: aggregate’ler küçük tutulmalı (genellikle 1–3 entity), referans ile birbirine bağlanmalı ve bir transaction’da yalnızca bir aggregate güncellenmelidir. Bu kurala uymayan tasarımlar yüksek lock contention, lost update ve karmaşık saga senaryoları doğurur.

Building BlockTanımKimlikYaşam DöngüsüÖrnek
EntityKimliği olan, durumu değişebilen nesneUnique ID (UUID/long)Uzun süreli, mutableSipariş, Kullanıcı, Poliçe
Value ObjectKimliği olmayan, immutableYok — değer eşitliğiReplace-onlyPara, Adres, DateRange
Aggregate RootTutarlılık sınırı, dış dünya tek girişiRoot entity IDTek transactionSipariş + SiparişKalemleri
Domain EventOlmuş bir olay, geçmiş zamanlı isimEvent ID + timestampImmutable kayıtSiparişTamamlandı, ÖdemeAlındı
RepositoryAggregate persistanslama soyutlamasıYok (stateless)SingletonSiparişRepository, PoliçeRepository
Domain ServiceTek aggregate’e sığmayan davranışYok (stateless)SingletonFiyatHesaplayıcı, RiskSkorlayıcı
FactoryKarmaşık aggregate yaratma mantığıYokGeçiciPoliçeFactory.from(quote)

Bu yapıların sağlam uygulanması için Repository Pattern ve Specification Pattern tamamlayıcı desenlerdir; repository sayesinde persistans detayı domain’den izole olur, specification sayesinde iş kuralları yeniden kullanılabilir hâle gelir.

Strategic Patterns vs Tactical Patterns: Hangisi Daha Önemli?

DDD topluluğunun son beş yılda öğrendiği en önemli ders: taktik desenleri stratejik desenler olmadan uygulamak, “DDD-Lite” denilen tatmin edici görünen ama değer üretmeyen bir karikatür yaratır. Aggregate sözcüğünü kullanan ama bounded context çizmemiş bir kod tabanı, hâlâ büyük bir balçık (big ball of mud) olabilir. ThoughtWorks Tech Radar 2025’te “Tactical DDD without Strategic DDD” anti-pattern olarak “Hold” halkasına yerleştirildi.

BoyutStrategic DDDTactical DDD
OdakSınırlar, ekipler, dilSınıflar, metotlar, modeller
ÇıktıContext map, ubiquitous language sözlüğü, team topologyAggregate, entity, value object, repository kodu
KatılımcıDomain expert, mimar, ürün sahibi, takım liderleriYazılım geliştirici, mimar
AraçEvent Storming, Domain Storytelling, Context MappingUML benzeri sınıf diyagramları, kod
Süre (orta ölçekli proje)2–6 hafta yoğun atölyeSüregelen, her sprint
Atlanırsa riskYanlış sınırlar → distributed monolithAnemic domain model, prosedürel kod
Atlanırsa düzeltme maliyetiÇok yüksek (yeniden yazım)Orta (refactor)

Bounded Context Türleri ve Context Map İlişki Desenleri

Bounded context’ler stratejik önemlerine göre üç gruba ayrılır: core domain (rakipten ayrıştığın, kendi yazdığın), supporting subdomain (core’u destekleyen, özelleştirebileceğin) ve generic subdomain (login, fatura, e-posta gibi piyasada hazır olan). Bu sınıflandırma yatırım önceliklerini doğrudan belirler: core domain’e en iyi mühendisleri ve en çok zamanı, generic subdomain’lere SaaS satın alımını koy.

Context TipiTanımYatırım StratejisiÖrnek
Core Domainİş değerinin yaratıldığı, rakipten farklılaşılan alanİçeride en iyi ekip, sürekli yatırımSigorta risk skorlama, banka kredi değerlendirme
Supporting SubdomainCore’u destekleyen, ihtiyaca özel iş kuralı barındıranİçeride orta seviye ekip veya outsourceMüşteri segmentasyonu, raporlama
Generic SubdomainStandart, herkesin benzer şekilde çözdüğüSaaS satın al, açık kaynak kullanAuth, e-posta, ödeme, KDV hesaplama

Context’ler arası ilişkiler, Evans’ın blue book’unda sekiz desen ile kodlanmıştır. Partnership iki ekibin başarı/başarısızlığı bağlı olduğunda; customer-supplier yukarı akıştaki bağlamın aşağıdakine söz hakkı tanıdığı durumda; conformist aşağı akış ekibin tamamen yukarı akışın modeline uymak zorunda kaldığında; anti-corruption layer ise legacy bir sistemden veya kontrol edilemeyen üçüncü partiden gelen modeli çevirmek için kullanılır.

Context Map DeseniGüç Dengesiİletişim KarakteriNe Zaman Kullan
PartnershipEşitSürekli senkron, ortak roadmapİki ekip aynı iş başarısına bağlı
Shared KernelEşit ama kısıtlıPaylaşılan küçük kod parçası, ortak değişimÇok küçük, kritik ortak model
Customer-SupplierYukarı akış güçlüAşağı akışın ihtiyaçları planlamaya yansırYukarı akış ekibi iş birliğine açık
ConformistYukarı akış mutlakAşağı akış uymak zorundaYukarı akış değiştirilemez (vendor, regülatör)
Anti-Corruption LayerAsimetrikTek yönlü çeviri katmanıLegacy entegrasyonu, üçüncü parti API
Open Host ServiceYukarı akış paylaşırStandart protokol, çoklu tüketiciÇok sayıda istemci olduğunda
Published LanguageTarafsızResmi şema (JSON Schema, Protobuf)OHS ile birlikte
Separate WaysBağımsızİletişim yok, ortak değer yokEntegrasyon maliyeti faydadan yüksek

Anti-corruption layer’ın kurumsal uygulamasının detayları için Anti-Corruption Layer rehberimize bakabilirsiniz; legacy sistemden yeni domain’e geçişin omurgasıdır.

Event-Driven Mimari, CQRS ve Event Sourcing

DDD ile event-driven mimari doğal bir uyum içindedir. Domain event’ler aggregate sınırını aşan iletişimi sağlar; bir bounded context başka birine event yayınlayarak bildirim verir, eventual consistency ile sistemler senkronize olur. CQRS (Command Query Responsibility Segregation) yazma ve okuma modellerini ayırarak okuma performansını bağımsız ölçeklemenizi mümkün kılar. Event sourcing, durumun olayların türevi olarak saklandığı en uç DDD uygulamasıdır; tam audit trail sağlar ama operasyonel karmaşıklığı yüksektir. Detaylı karşılaştırma için CQRS ve Event Sourcing yazımızı okuyabilirsiniz.

  1. İsimlendirme: Event’leri geçmiş zamanda isimlendirin: “SiparişOluşturuldu”, “ÖdemeAlındı”, “PoliçeYenilendi”. Future tense (“WillBeProcessed”) ya da emir (“Process”) yanlıştır.
  2. Payload disiplini: Event payload’unu minimal tutun (sadece aggregate ID + değişen alanlar); tüketici detay isterse query API çağırsın. Aksi halde event’ler “fat event” hâline gelir ve şema evrimi zorlaşır.
  3. Tutarlılık seviyesi: Eventual consistency’yi iş uzmanı ile mutlaka tartışın; ödeme onayı gibi senaryolarda kabul edilemez olabilir. SLA’yı önceden netleştirin.
  4. Event store seçimi: Kafka (high throughput), EventStoreDB (event sourcing native), Postgres + outbox pattern (basitlik), AWS EventBridge (yönetilen) seçenekleri arasında trade-off yapın.
  5. Outbox pattern: Veritabanı transaction’ı ile event yayınını atomik hâle getirmek için outbox pattern kullanın; dual-write problemini çözer.
  6. Idempotency: Read model güncellemelerini idempotent yazın; aynı event iki kez geldiğinde sonuç değişmemeli.
  7. Schema evolution: Event şemalarını versiyonlayın (Avro + Schema Registry, JSON Schema). Geriye uyumluluk zorunludur.

Event Storming Workshop: Domain Keşfi İçin Pratik Yöntem

Alberto Brandolini’nin geliştirdiği Event Storming, DDD topluluğunun son on yılda benimsediği en güçlü domain keşif tekniğidir. 8 metrelik bir duvar, renkli post-it’ler ve doğru insanlar üç günde 6 aylık dokümantasyon çalışmasından daha iyi bir model üretir. Renk kodları: turuncu (domain event), mavi (komut), sarı (aggregate/actor), pembe (external system), mor (policy), kırmızı (hotspot/sorun), açık sarı (read model).

Workshop TürüSüreKatılımcılarÇıktıMaliyet
Big Picture Event Storming1 günTüm domain expert’ler + mimarlar (15–25 kişi)Tüm domain’in event timeline’ı, bounded context aday sınırlarıDüşük (1 facilitator + duvar)
Process Modeling1–2 günSüreç sahibi + geliştirici (8–15 kişi)Komut–event–policy zinciri, business rulesOrta
Software Design2–3 günGeliştirici + mimar + 1–2 domain expert (5–10 kişi)Aggregate sınırları, read model şemalarıYüksek (uzman katılım)
Domain Storytelling2–4 saatTek domain expert + facilitatorAktör–aktivite–work object diyagramıÇok düşük
Example Mapping30–60 dkThree amigos (PO + dev + QA)Specification by Example, kabul kriterleriÇok düşük

Pratik tavsiye: önce “Big Picture” ile haritalandır, sonra her bounded context aday’ı için ayrı “Software Design” oturumu yap. Domain Storytelling, kullanıcıyla aktif konuşmaktan kaçınan ekipler için iyi bir başlangıçtır. Domain Storytelling resmi sitesi Türkçe örnekleri de barındıran zengin bir kaynaktır.

DDD-Lite vs Full DDD: Olgunluk Seviyesi Seçimi

Her organizasyon Full DDD’ye hazır değildir. Domain Storytelling, ubiquitous language, bounded context çizimi gibi “düşük yatırımlı” pratikler, küçük ekipler için bile yüksek değer üretir. Aggregate, event sourcing, CQRS gibi taktik desenler ise olgunluk gerektirir ve yanlış uygulandığında zarar verir.

Olgunluk SeviyesiUygulanan PratiklerUygun Olduğu DurumRisk
Level 0 — Hiç DDDYokBasit CRUD, prototip, MVPKarmaşık iş kuralı eklendiğinde kod kontrolden çıkar
Level 1 — Ubiquitous LanguageOrtak sözlük, kod–domain uyumuTüm projeler için tavsiyeYok, getirisi yüksek
Level 2 — Bounded Context + StrategicContext map, subdomain sınıflandırmasıBirden fazla ekip, modülerlik ihtiyacıYanlış sınır çizimi → distributed monolith
Level 3 — DDD-Lite (Tactical Hafif)Entity, value object, repositoryOrta karmaşıklık, tek bounded contextAnemic domain model tuzağı
Level 4 — Full Tactical DDDAggregate, domain event, factory, specificationKarmaşık invariant, yüksek değişim hızıOver-engineering, takım hazırlık eksikliği
Level 5 — Event Sourcing + CQRSTüm üst seviyeler + event store + projectionTam audit, temporal query, çok yüksek okumaOperasyonel karmaşıklık, debugging zorluğu

Ubiquitous Language Adoption: Olgunluk Yolculuğu

Ubiquitous language’i bir kez sözlüğe yazmak ve unutmak yaygın hatadır. Gerçek adoption, dilin her artefakta tutarlı kullanılmasıdır.

Olgunluk AşamasıBelirtiNe Yapmalı
1 — Çeviri Hâkimİş “satın alma talebi” der, kod “PurchaseRequest” der ama dökümanda “PR” geçerTerim sözlüğü oluştur, herkese dağıt
2 — Kısmi HizalamaKod ile iş aynı kelimeyi kullanır ama farklı anlamlandırırBounded context’leri ayır, her birinde net tanım
3 — Kod–Dil UyumuSınıf isimleri, metotlar, kolonlar domain dili ile yazılıLint kuralı ile yabancı terimleri engelle
4 — Test–Dil UyumuBDD/Gherkin senaryoları doğal dili ile yazılı, müşteri okuyabiliyorLiving documentation tool (Cucumber, SpecFlow)
5 — Tam AdoptionTicket başlığı, Slack kanalı, hatta sözlü konuşma aynı dile yerleşmişSürdür, yeni ekip üyelerine onboarding’de aktar

Kurumsal Uygulama: Sigorta Şirketi Vaka Çalışması

Türkiye’nin önde gelen sigorta şirketlerinden birinin poliçe yönetim sistemini DDD ile yeniden tasarladığı projede; “Poliçe Üretim”, “Hasar Yönetimi”, “Tahsilat” ve “Reasürans” olmak üzere dört bounded context tanımlandı. Önceki monolit, ortalama 14 hafta yeni ürün lansman süresine sahipti. DDD’ye geçişten 18 ay sonra bu süre 5 haftaya, üretim hatası oranı %62 azaldı, yeni geliştirici onboarding süresi 4 haftadan 9 güne indi. Anti-corruption layer, eski mainframe sistemi ile yeni mikroservisler arasında tercüme katmanı görevi gördü; mainframe ile aynı anda iki yıl daha çalışmaya devam etti.

  • Üç günlük Big Picture Event Storming atölyesi ile tüm domain haritalandı; 240 domain event tespit edildi.
  • Her bounded context için ayrı ekip (6–9 kişi), ayrı repo, ayrı deployment pipeline ve ayrı Postgres instance’ı kuruldu.
  • Kafka üzerinde event backbone, context’ler arası iletişimi sağladı; outbox pattern ile transactional outbox kullanıldı.
  • Şema değişiklikleri sadece o context’in ekibinin sorumluluğunda kaldı; cross-team koordinasyon ihtiyacı %78 azaldı.
  • Hexagonal architecture ile her context’in iç çekirdeği persistans ve UI detaylarından izole edildi; Hexagonal architecture ile test coverage %47’den %86’ya çıktı.
  • Modular monolith aşaması (12 ay) atlanmadı; her context önce monolit içinde modül olarak doğdu, olgunlaştıktan sonra mikroservise ayrıldı.

Sınırlamalar, Anti-Pattern’ler ve ROI Hesabı

DDD her proje için uygun değildir. Basit CRUD uygulamaları için DDD aşırı mühendisliktir ve teslim süresini uzatır. Eric Evans’ın belirttiği gibi DDD karmaşık domain’lerde değer üretir; domain karmaşıklığı düşükse SOLID prensipleri ve temiz katmanlı mimari yeterlidir. Detay için SOLID prensipleri yazımıza bakabilirsiniz. Forrester verilerine göre 50+ kişilik geliştirici ekibi olan ve domain karmaşıklığı yüksek projelerde DDD yatırımı 14 ay içinde geri döner; küçük ekiplerde geri dönüş 26 aya uzar.

  • Anemic Domain Model: Entity’lerin sadece getter/setter içerdiği, davranışın service’lere taşındığı anti-pattern. Çözüm: davranışı entity’ye yaklaştır.
  • God Aggregate: Tek aggregate’in onlarca entity içerdiği, lock contention yarattığı yapı. Çözüm: aggregate’i parçala, eventual consistency kabul et.
  • Database Schema as Domain Model: Domain model’in ORM annotation’ları ile kirletildiği, persistans detaylarının domain’e sızdığı tuzak. Çözüm: hexagonal architecture, ayrı persistance model.
  • DDD-Lite Tuzağı: Stratejik tasarım yapmadan sadece taktik desenleri uygulamak. Çözüm: önce bounded context çiz.
  • Ubiquitous Language İhmal: Sözlüğü bir kez yazıp güncellememek. Çözüm: yaşayan dokümantasyon araçları, ADR’ler. ADR pratikleri bu konuda yardımcıdır.

Sık Sorulan Sorular

DDD ile mikroservisler aynı şey midir?

Hayır, DDD bir tasarım yaklaşımı, mikroservisler ise bir deployment desenidir. DDD bounded context, mikroservis sınırlarını belirlemede mükemmel bir kılavuzdur ama DDD monolit içinde de uygulanabilir. Modular monolith yaklaşımı, DDD’nin mikroservis karmaşıklığına girmeden uygulandığı popüler bir modeldir. Ekip ölçeği büyüdükçe ve değişim hızı arttıkça bounded context’ler doğal olarak mikroservise dönüşebilir; ama bu zorunlu değildir, bağlama bağlıdır.

Event Storming workshop’u online yapılabilir mi?

Evet, Miro, Mural ve EventModeling.org gibi sanal whiteboard araçları ile online Event Storming yapılabilir; ancak Brandolini’nin kendisi de fiziksel atölyenin enerjisinin yarıya indiğini kabul ediyor. Hibrit format (lokasyondaki ekip duvarda, uzaktakiler kameradan takip + Miro replikası) en iyi denge. Önemli kural: katılımcı sayısı 15’ten fazlaysa online verim çok düşer, ikiye bölün.

DDD için hangi programlama dili en uygun?

Dil seçimi DDD başarısının ikincil faktörüdür; asıl önemli olan tip sistemi ve immutability desteğidir. Java, C#, Kotlin, Scala ve TypeScript güçlü tip sistemleri ile uygun adaylardır. F# ve Elixir gibi fonksiyonel diller, value object ve immutability’yi doğal olarak destekler ve Scott Wlaschin’in “Domain Modeling Made Functional” kitabı F#’ı DDD için ideal göstermiştir. Python da type hint ve Pydantic ile DDD uygulanabilir, ancak çalışma zamanı tip güvenliği daha zayıftır.

Var olan monolitten DDD’ye nasıl geçilir?

Big-bang yeniden yazım neredeyse her zaman başarısız olur (Joel Spolsky’nin “Things You Should Never Do” yazısı bu konuda klasiktir). Strangler Fig deseni ile yeni özellikler DDD bounded context’i olarak ayrı geliştirilir, monolitten gelen istekler kademeli olarak yeni servise yönlendirilir. Anti-corruption layer eski sistem ile yeni domain arasında tercüme yapar. Tipik bir geçiş 18–36 ay sürer ve domain ekipleri ile sürekli senkronizasyon gerektirir; ilk altı ay sadece bounded context keşfine ayrılmalıdır.

DDD eğitimi için en iyi kaynaklar nelerdir?

Klasik üçleme: Eric Evans’ın Domain-Driven Design: Tackling Complexity in the Heart of Software (“blue book”), Vaughn Vernon’un Implementing Domain-Driven Design (“red book”) ve Scott Wlaschin’in Domain Modeling Made Functional. Çevrimiçi: dddcommunity.org ve DDD Europe konferans kayıtları. Türkçe için Vaughn Vernon’un kısa kitabı Domain-Driven Design Distilled‘in tercümesi mevcuttur ve giriş için idealdir.

Sonuç: Hangi Organizasyon Boyutuna DDD Uygun?

Domain-Driven Design, karmaşık iş kuralları içeren kurumsal yazılım projelerinde kod ile iş arasındaki çeviri kaybını ortadan kaldıran en olgun mimari yaklaşımdır. Stratejik tasarım (bounded context, ubiquitous language) taktik desenlerden çok daha kritiktir; teknik desenler ancak doğru sınırlar çizildikten sonra anlam kazanır. 1–10 kişilik ekip ve basit domain: sadece ubiquitous language ve hafif bounded context ayrımı, gerisi over-engineering. 10–50 kişilik ekip ve orta karmaşıklık: modular monolith içinde tam stratejik DDD + DDD-Lite taktik; mikroservise erken zıplama. 50+ kişilik ekip ve yüksek karmaşıklık: tam DDD, bounded context başına ekip, event-driven entegrasyon, gerektiğinde CQRS. Regülatör baskılı sektörler (sigorta, banka, sağlık): event sourcing’in audit avantajı yatırımı haklı kılabilir.

DDD bir araç değil, bir disiplindir; başarısı kod kalitesinden çok ekibin domain expert ile birlikte düşünme becerisine bağlıdır. Modular monolith ile başlayın, ihtiyaç doğdukça mikroservise evrilin. Doğru uygulandığında DDD; teslim hızı, hata oranı ve yeni geliştirici onboarding süresinde belirgin kazanım sağlar. Yanlış uygulandığında ise aşırı mühendislik ve geliştirme yavaşlamasına neden olur — kararı domain karmaşıklığı, ekip olgunluğu ve organizasyon hazırlığına göre verin.

Ömer ÖNAL

Yazılım Mimarı | Yapay Zeka LLC. Ölçeklenebilir SaaS, .NET Core altyapıları ve Otonom AI süreçleri inşa ediyorum. Kod değil, sistem tasarlarım.

Yorum (1)

  1. Ömer ÖNAL
    Mayıs 16, 2026

    Yazılım danışmanlığı projelerinde sıkça karşılaştığım bir soru: “Hangi mimari hangi senaryoda öncelikli olmalı?” Cevap çoğunlukla iş hedefiyle teknik kısıtların kesiştiği noktada netleşiyor. Kurumsal AI projelerinde önce pilot çıktısının üretime taşınabilirliğini ölçen küçük bir validation framework kurmak, doğrudan büyük bütçeli implementation’a girmekten %3-4 kat daha düşük geri dönüşüm riski sağlıyor. Yorumlarınıza açığım.

Yorum Yap

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir