JetBrains 2026 Developer Ecosystem raporuna göre kurumsal kod tabanlarının %71’inde en az üç GoF (Gang of Four) tasarım deseni aktif olarak kullanılıyor; doğru pattern seçimi bug yoğunluğunu %32 azaltırken yeni mühendisin onboarding süresini %41 kısaltıyor. 2026’da Factory, Observer ve Strategy desenleri özellikle event-driven mimari, modüler monolit ve AI agent orkestrasyonu yaklaşımıyla yeniden popülerleşti. Stack Overflow 2026 Developer Survey’e göre profesyonel geliştiricilerin %68’i en az bir GoF desenini haftalık olarak uyguluyor. Diğer yandan yanlış uygulanan tasarım deseni, overengineering tuzağına düşüp kod karmaşıklığını %58 artırabiliyor; ThoughtWorks Technology Radar Volume 31 raporu “Pattern obsession” başlığı altında bu riski ayrı bir anti-pattern olarak işaretledi.

Bu rehberde Factory, Observer ve Strategy desenlerini gerçek dünya senaryoları, anti-pattern uyarıları, dil idiomatic kalıpları ve 2026 uygulama örnekleriyle inceliyoruz. GitHub’da iluwatar/java-design-patterns reposunun 92.000 yıldızı geçmesi ve Refactoring Guru’nun ayda 4.2 milyon ziyaretçiye ulaşması, desenlerin hâlâ profesyonel literatürün omurgası olduğunu gösteriyor. Hedefimiz “her şeye desen uygulayalım” değil; doğru sorunu doğru desenle çözmektir.

Tasarım Desenleri Neden Hâlâ Önemli?

Gang of Four kitabının 1994’te yayınlanmasının üzerinden 32 yıl geçti, ancak desenlerin çözmeye çalıştığı temel sorunlar (nesne oluşturma, gevşek bağlılık, davranış değiştirilebilirliği, sorumluluk ayrımı) değişmedi. Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides’in orijinal kitabı bugüne kadar 750.000 baskı yaptı; Amazon’da yazılım mühendisliği kategorisinde hâlâ ilk 100’de. Modern dillerin (Kotlin, Swift, Rust, TypeScript) idiomatik kalıpları çoğu deseni daha az kodla ifade ediyor fakat kavramsal model olarak hâlâ vazgeçilmez. Desenler kod yazmaktan çok ekip içinde ortak dildir: “Burayı Strategy ile soyutladım” cümlesi 10 satırlık açıklamanın yerine geçer.

  • Yaratıcı (Creational): Factory Method, Abstract Factory, Builder, Singleton, Prototype – nesne yaratımını yönetir.
  • Yapısal (Structural): Adapter, Facade, Decorator, Proxy, Composite, Bridge – nesneleri ve sınıfları daha büyük yapılara birleştirir.
  • Davranışsal (Behavioral): Observer, Strategy, Command, State, Chain of Responsibility, Iterator – nesneler arası iletişimi ve sorumluluk dağılımını yönetir.
  • Eşzamanlılık (Concurrency): Reactor, Active Object, Half-Sync/Half-Async – GoF dışı ama eşit derecede modern.

GoF Desen Kategorileri ve Sıklık Tablosu

Desenlerin sınıflandırılması “ne işe yaradığına” göre yapılır. Refactoring Guru kaynaklı sınıflandırma 23 GoF desenini üç ana kategoriye ayırır. Hangi kategorinin daha sık kullanıldığı; ürün tipine, ekip olgunluğuna ve mimariye bağlıdır. Aşağıdaki tablo, JetBrains 2026 raporu ile GitHub design-patterns konulu repoların commit dağılımının kesişiminden üretildi.

KategoriTemel NiyetPopüler DesenlerKurumsal Kullanım %Tipik Anti-Pattern
CreationalNesne yaratımını kontrol etmeFactory, Builder, Singleton%78Aşırı Singleton (global state)
StructuralSınıf/nesne kompozisyonuAdapter, Facade, Decorator%64Facade arkasına kütüphane gizleme zorlaması
BehavioralSorumluluk ve iletişimObserver, Strategy, Command%82Tek implementasyonlu Strategy
ConcurrencyEşzamanlı işlem koordinasyonuReactor, Active Object%41Lock yerine pattern arayışı
Cloud-NativeDağıtık sistem ihtiyaçlarıCircuit Breaker, Saga, CQRS%56Her şeye Saga uygulamak

Tabloya göre davranışsal desenler en yaygın kategori; çünkü modern uygulamaların büyük kısmı “kim ne zaman ne yapacak” sorusunu çözer. Cloud-native desenler ise Saga, Outbox, Sidecar, Circuit Breaker gibi yeni nesil kalıpları kapsar ve GoF dışında kalsa da tamamlayıcı niteliktedir. Yapısal desenler kütüphane sınır katmanında (Adapter, Facade) en sık tercih edilirken yaratıcı desenler dependency injection container’larıyla bütünleşerek görünmez hale gelir. Bir kod tabanında her dört kategoriden de örnekler görülmesi sağlıklı bir mimarinin işaretidir; tek kategori baskınsa (örneğin sadece Singleton ve switch-case) takım pattern okuryazarlığı henüz olgunlaşmamış demektir.

Factory Pattern: Nesne Oluşturmayı Soyutlama

Factory deseninin temel niyeti, somut sınıf adını çağrı sahibinden gizleyerek “ne yaratıldığını” değil “ne döndürüldüğünü” görünür yapmaktır. Spring Framework’ün BeanFactory’si, .NET’in IServiceProvider’ı, Symfony’nin ContainerInterface’i ve Node.js NestJS modüllerindeki provider sistemi ticari ölçekte Factory uygulamalarıdır. Doğru kullanımda yeni bir alt tipin eklenmesi tek satır konfigürasyona indirgenir; çağrı yapan kod hiç değişmez. Factory Method tek bir ürün yaratırken Abstract Factory bir ürün ailesini (örneğin macOS button + macOS scroll bar + macOS dropdown) tutarlı şekilde üretir.

Factory Abstract Factory ve Builder olusturma desenleri uc panelli izometrik gorsel

Factory, Abstract Factory ve Builder Karşılaştırması

Üç yaratıcı desen sıklıkla karıştırılır. Aralarındaki seçim, ürünün karmaşıklığına ve değişkenlik kaynağına bağlıdır. SourceMaking kaynağına göre kritik soru şudur: “Ne değişir, ürün tipi mi yoksa kurulum adımları mı?”. Aşağıdaki tablo karar çerçevesini özetler.

BoyutFactory MethodAbstract FactoryBuilder
Ürün sayısıTek ürün, çoklu alt tipİlişkili ürün ailesiTek karmaşık ürün
Kurulum adımıTek adımTek adım, çoklu ürünÇoklu adım
Parametre sayısı0-30-3 her ürün için4+ (telescoping kaçınma)
İmmutable destekOrtaOrtaYüksek (fluent API)
Tipik örnekORM, Plugin loaderUI toolkit, DB driverStringBuilder, HTTP request
Test edilebilirlikYüksek (mock factory)Yüksek (test factory ailesi)Yüksek (deterministik kurulum)

Pratik kural: ürün tipi değişiyorsa Factory; ürün ailesi değişiyorsa Abstract Factory; yapım adımları değişiyor veya parametre sayısı dördü geçiyorsa Builder doğru tercihtir. Java 21’in record sınıfları ve Kotlin’in named arguments + data class kombinasyonu, basit Builder ihtiyaçlarını dil seviyesinde karşılar; bu durumlarda ayrı Builder sınıfı yazmak overengineering olur.

Observer Pattern: Olay Yayını Mimarisi

Observer deseni, bir subject (yayıncı) nesnesi ile bir veya daha fazla observer (abone) nesnesi arasında bire-çok bağımlılık tanımlar; subject’in durumu değiştiğinde tüm observer’lar otomatik bilgilendirilir. Reactor pattern, Node.js EventEmitter, C#’ın event keyword’ü ve Java’nın PropertyChangeSupport sınıfı Observer’ın modern türevleridir. Reactive Streams (RxJS, Project Reactor, Kotlin Flow) backpressure ekleyerek desenin asenkron versiyonunu sunar. Martin Fowler “Event Collaboration” yazısında klasik Observer ile modern event-driven mimarinin sürekliliğini detaylandırır.

Observer pattern subject ve abone akisini gosteren olay yayini diyagrami

Observer Modern Alternatifleri Karşılaştırması

ThoughtWorks 2026 Technology Radar’a göre Observer pattern, event-driven mikroservis mimarisinde “default” olarak benimsenmiş durumda; ancak ölçek büyüdükçe klasik Observer in-process kalıyor, üzerine Pub/Sub veya Reactive Stream katmanları ekleniyor. Aşağıdaki tablo üç alternatifin sınırlarını netleştirir.

BoyutKlasik ObserverPub/Sub (Broker)Reactive Stream
CouplingSubject observer’ı bilirTamamen decoupledDecoupled + tip güvenli
KapsamIn-processCross-process / clusterIn-process veya cluster
BackpressureYokBroker’a göre değişirYerleşik (request-n)
PersistenceYokVar (Kafka, NATS JetStream)Opsiyonel
Tipik araçEventEmitter, C# eventKafka, RabbitMQ, NATS, SNSRxJS, Project Reactor, Kotlin Flow
Kullanım senaryosuUI tepkileri, in-app callbackMikroservis entegrasyonuStream işleme, UI state

Pratik kural: tek process içinde kalan tepki zincirleri için Observer veya Reactive Stream; servisler arası asenkron iletişim için Pub/Sub broker tercih edilmelidir. Aynı sistemde her üçü birlikte yaşar; örneğin Kafka’dan gelen event Reactive Stream’e dönüşüp UI içinde Observer ile dinlenebilir. Kurumsal projelerde sık karşılaşılan hata, in-process bir tepki için Kafka topic’i kullanmak veya basit UI olayını broker’a göndermektir; bu yanlış katman seçimi gereksiz latency, ek operasyonel yük ve borçlanılan operasyon ekibi anlamına gelir. Ölçek küçükken Observer ile başla, scope büyüyünce Pub/Sub’a geç.

Strategy Pattern: Algoritmaları Değiştirilebilir Kılma

Strategy deseni, bir algoritma ailesini tanımlar, her birini ayrı sınıfa alır ve birbiriyle değiştirilebilir hale getirir. Context sınıfı algoritmaya referans tutar; if/switch yerleştirmek yerine doğru strategy’i çalışma zamanında seçer. Ödeme akışları (kart, havale, kripto, BNPL), kargo yöntemleri, sıkıştırma algoritmaları, dil-spesifik formatter’lar ve fiyatlandırma kuralları kanonik Strategy örnekleridir. Doğru uygulamada yeni bir strateji eklemek tek bir sınıf yazmak ve DI container’a kaydetmek anlamına gelir; context sınıfı asla değişmez.

Strategy pattern context icine takilan degistirilebilir algoritma kartlari izometrik
  1. Algoritmanın değişen kısmını bir arayüzde izole edin (örnek: PaymentStrategy.calculate()).
  2. Her somut algoritmayı ayrı sınıf olarak yazın; bağımlılık container’ı kullanarak çalışma zamanında inject edin.
  3. Context sınıfında if/switch zinciri yerine strategy referansı tutun; Open-Closed Principle ihlallerini engelleyin.
  4. Strategy seçimini dış konfigürasyona (feature flag, kullanıcı segmenti, A/B test variant) bağlayın; deploy gerektirmeden deneyim mümkün olsun.
  5. Unit test her strategy’i izole olarak test edin; context yalnızca doğru strategy’nin çağrıldığını doğrulasın.
  6. Eğer üç aydan fazla tek strateji kullanılıyorsa interface’i geri kaldırın; YAGNI ihlali engellenir.

Strategy ve State Pattern Ayrımı

UML diyagramı neredeyse aynı olan iki desen geliştiriciyi en çok şaşırtanlardandır. Ayrım yapı değil niyettir: Strategy “ne yapacağım?” sorusunu dışsal seçimle, State “şimdi hangi modda olduğumu?” sorusunu içsel geçişle yanıtlar. Aşağıdaki karşılaştırma karar verirken yararlı olur.

BoyutStrategyState
Seçim kaynağıDışsal (kullanıcı, config, A/B test)İçsel (nesnenin mevcut durumu)
GeçişlerTek seferlik enjeksiyonState içinden başka State’e geçiş
TarihçeÖnemsizÖnemli (PENDING’den PAID’e doğru sıra)
Strateji bilinçliliğiBirbirinden habersizState’ler genelde komşularını bilir
Tipik örnekÖdeme yöntemi, sıkıştırmaSipariş yaşam döngüsü, yetkilendirme akışı
Karmaşıklık eşiği3+ algoritma3+ durum geçiş matrisi

Dil Bazlı Idiomatic Pattern Uygulamaları

Modern programlama dillerinde “Java vari” pattern uygulaması artık ideal değildir; her dilin idiomatik karşılıkları vardır. Python’da first-class function ve duck typing, Java’da functional interface, C#’ta delegate, TypeScript’te discriminated union sayesinde aynı niyet çok daha az kodla ifade edilir.

DesenPython IdiomaticJava 21 IdiomaticC# .NET 9 IdiomaticTypeScript Idiomatic
StrategyCallable + ProtocolFunctional interface + lambdaFunc delegateType alias + arrow function
Factory__init_subclass__ registrySealed interface + switchGeneric factory + DIDiscriminated union + factory fn
Observerasyncio.Queue, async generatorjava.util.concurrent.FlowIObservable + Rx.NETRxJS Subject, EventEmitter
SingletonModule-level değişkenEnum singletonDI container singleton lifetimeModule pattern + closure
StateEnum + dict dispatchSealed class + pattern matchRecord + switch expressionDiscriminated union + exhaustive check

Pratik sonuç: GoF deseninin niyetini anlayın ama dilin verdiği araçları kullanın. Python’da AbstractStrategy ABC’sini yazıp on satırlık alt sınıflara bölmek, yerine basit callable’ı dict’te tutmaktan daha kötü bir tasarımdır. ThoughtWorks Tech Radar‘ın Volume 31 raporundaki “pattern over-application” uyarısı tam olarak buna işaret eder; rapor 2025 ve 2026 yıllarında bu anti-pattern’i ısrarla işaretlemeye devam etti. Kotlin’in functional interface’leri (fun interface) ile single abstract method patterns’ları çağrılabilir hale getirmesi, ya da Rust’ın trait object + closure kombinasyonu, Java’nın eski “interface + 10 satır anonim class” çözümünden hem daha okunaklı hem daha az kod üretir. Karar verirken sorulacak soru her zaman aynıdır: “Bu abstraction olmadan kod hâlâ okunabilir mi?” Eğer cevap evetse pattern eklemeyin.

Modern Mimarilerde Desen Kombinasyonları

Tek desen nadiren tek başına çözer; gerçek kurumsal kod tabanlarında desenler birbirini tamamlar. Spring uygulamalarında Factory + Strategy + Observer üçlüsü en yaygın kombinasyondur: ödeme akışında PaymentStrategyFactory uygun stratejiyi seçer, strateji yürütülür ve PaymentEventPublisher abonelere bildirim yapar. Domain-Driven Design yaklaşımında Repository Factory ile, Specification ise Strategy’nin filtreleme alt türü olarak kullanılır. CQRS mimarisinde Command desenle yazma işlemleri ayrılırken, Query tarafında Observer event sourcing’i besler.

  • Spring DI container: Bean tanımıyla Factory ve Strategy aynı anda sağlanır; @Qualifier annotation ile strategy seçimi run-time bağlanır.
  • DDD aggregate ile Repository: Repository Pattern + Specification kombinasyonu sorgu mantığını encapsulate eder.
  • CQRS + Event Sourcing: Command pattern ile değişimler kaydedilir, Observer ile projeksiyonlar güncellenir.
  • Hexagonal Architecture: Port ve Adapter ikilisi, Strategy desenin yapısal varyantıdır; dış sistemler context’in stratejisi haline gelir.
  • AI Agent orkestrasyonu: ReAct ve Plan-and-Execute akışları Chain of Responsibility + Strategy bileşimidir; her tool çağrısı bir strategy seçimi gibidir.

Anti-Pattern Uyarıları ve Overengineering Maliyeti

Tasarım desenlerinin yanlış kullanımı, doğru kullanımdan daha pahalıdır. Robert C. Martin’in Clean Code perspektifine göre üç tipik anti-pattern öne çıkar: gereksiz Singleton (global state kötülüğü), tek implementasyonlu Strategy (abstraction lüksü) ve unsubscribe edilmeyen Observer (bellek sızıntısı). DataDog 2026 production telemetrisine göre Java uygulamalarında bellek sızıntılarının %19’u observer listener’larının temizlenmemesinden kaynaklanıyor. Doğru uygulanan desen yatırımı 6-9 ayda amorti olur; yanlış uygulanan ise teknik borca dönüşerek 18 ay içinde kod tabanını yavaşlatır. Refactoring stratejisi doğru pattern eklemekle aşırı pattern temizliği arasında denge kurar.

Asiri soyutlama overengineering anti-pattern karmasik dolasik yapilari sembolize eden uyari grafigi
Anti-PatternTipik BelirtiMaliyetSağaltma
Tek-strateji StrategyStrategyXImpl tek somut sınıfTest kompleksitesi +%30Interface’i kaldır, sınıfı direkt kullan
Singleton spamHer servis static instanceTest mockability %40 düşerDI container, scoped lifetime
Aboneliği unutulan ObserverDetach çağrılmıyorJVM heap %19 sızıntı oranıWeakReference, try-with-resources
God Factory500+ satır switch-caseYeni tip ekleme süresi 4xRegistry + auto-discovery
Decorator zinciri15+ wrapper, debug imkansızMean time to debug %200 artarComposition root sadeleştirme
Premature Visitorİki ziyaretçi için 8 sınıfEkip onboarding +2 haftaPattern matching + sealed type

Karar kuralı: “İkinci uygulama gelene kadar abstraction yazma” (Rule of Three). İlk implementasyonda hard-coded çözüm kabul edilebilir; ikincisinde tekrar ortaya çıkarsa pattern’i çıkarın. Bu yaklaşım, Sandi Metz’in Practical Object-Oriented Design kitabında ve kod kalitesi metrikleri rehberinde teknik borcu en az tutan stratejidir.

Test Edilebilirlik ve SOLID İlkeleri

Tasarım desenlerinin asıl katkısı test edilebilirliği artırmasıdır. Strategy ve Factory dependency injection ile birleştiğinde test sırasında mock implementasyon vermeyi kolaylaştırır. Observer pattern asenkron davranışı test ederken event yakalama yardımcılarıyla doğrulamayı sadeleştirir. SOLID prensiplerinden Open-Closed Principle (OCP) ve Dependency Inversion (DIP), bu üç desenin doğal olarak desteklediği ilkelerdir. JetBrains 2026 raporuna göre OCP uyumlu modüllerde test kapsamı ortalaması %78, ihlal eden modüllerde %52.

  • Constructor injection: Strategy seçimi test sırasında mock ile sağlanır; hard-coded factory çağrıları test bağımlılığı yaratmaz.
  • Test doubles ayrımı: stub (sabit dönen), mock (çağrı doğrulayan), fake (basit gerçek implementasyon) ve spy (gerçek + kayıt) ayrımı net olmalı.
  • Property-based testing: Strategy implementasyonlarının kontratını invariant’larla doğrular; QuickCheck, Hypothesis, FsCheck kütüphaneleri standart.
  • Contract test: Aynı interface’i implemente eden tüm Strategy’ler için ortak test paketi, polimorfizmin doğru çalıştığını garantiler.

Sık Sorulan Sorular

Modern dillerde tasarım desenleri hâlâ gerekli mi?

Evet, ancak farklı şekilde. Kotlin’in object/companion object’i Singleton’ı, Scala’nın case class’ı Visitor’ı, Rust’ın enum + match’i State’i dil seviyesinde sağlar. Bu, desenlerin gereksizleştiği anlamına gelmez; tersine, kavramsal model olarak hâlâ vazgeçilmezdir. JetBrains 2026 raporuna göre Kotlin geliştiricilerinin %73’ü Strategy ve Observer’ı haftalık uygularken, Singleton ve Prototype dil özellikleriyle bastırılmış durumda. Pattern bilgisi olmadan modern framework kodu okumak ve takım içi mimari tartışmalarına katılmak çok zorlaşır.

Factory ile Builder arasındaki temel fark nedir?

Factory tek bir adımda tam ürünü döner ve hangi alt sınıfın yaratılacağını encapsulate eder. Builder ise çok adımlı kurulum gerektirir; immutable nesneleri net bir API ile inşa etmek için kullanılır. Java’nın StringBuilder, Kotlin’in apply bloğu, Rust’ın builder pattern’i ve gRPC mesajlarının protobuf builder’ı klasik Builder örnekleridir. Parametre sayısı dört ve üzerine çıktığında ya da telescoping constructor problemi belirdiğinde Builder okunabilirliği belirgin biçimde artırır. Java 21 record sınıfları ile Kotlin data class + named arguments kombinasyonu, basit durumlarda Builder’a olan ihtiyacı tamamen ortadan kaldırabilir.

Observer ile Pub/Sub aynı şey mi?

Hayır, ama akrabadır. Klasik Observer’da subject ve observer birbirini doğrudan bilir; Pub/Sub’da ise message broker araya girer ve yayıncı abonelerden habersizdir. Mimari ölçek büyüdükçe Pub/Sub (Kafka, RabbitMQ, NATS, AWS SNS, Google Pub/Sub) Observer’ın yerini alır. Martin Fowler’ın Event Collaboration yazısına göre Observer “in-process”, Pub/Sub “cross-process” iletişim için doğru tercihtir. Modern sistemlerde her ikisi de bir arada kullanılır: Kafka’dan gelen event servis içinde Observer ile dağıtılır.

Strategy ile State arasındaki fark nedir?

Her ikisi de polimorfizmle davranış değiştirir ama Strategy’de seçim dışsaldır (kullanıcı, konfigürasyon, A/B test), State’de seçim içsel olarak nesne durumuna bağlıdır. Sipariş akışı (PENDING -> PAID -> SHIPPED -> DELIVERED) State, ödeme yöntemi (kart, havale, kripto, BNPL) Strategy örneğidir. UML diyagramları neredeyse aynıdır; ayrım niyettedir, yapıda değil. Pratik bir test: “Eğer bu nesne kendi kararlarına göre davranışını değiştiriyorsa State, dışarıdan algoritma seçilip kullanıyorsa Strategy” doğru olur.

Tasarım desenleri öğrenmek için en iyi kaynak hangisi?

Üç kaynak hâlâ standart kabul edilir: Gang of Four’un orijinal kitabı (kavramsal otorite), Eric Freeman ve Elisabeth Robson’un Head First Design Patterns kitabı (öğretici görsel anlatım) ve Alexander Shvets’in Refactoring Guru sitesi (interaktif örnekler ve dil bazlı kod). Pratik için GitHub’da iluwatar/java-design-patterns reposu, .NET tarafında MarkSeemann/AutoFixture, Python tarafında faif/python-patterns en çok yıldız alan kaynaklardır. Öğrenme sırası: temel kavram (GoF) -> görsel çalışmalar (Head First) -> dilde uygulama (Refactoring Guru) -> gerçek proje refactor pratiği.

Sonuç

Yazılım tasarım desenleri 2026’da hâlâ kurumsal kod tabanının iskeletidir, ancak araç değil dildir. Factory soyutlamayı, Observer gevşek bağlılığı, Strategy davranış değişebilirliğini sağlar; üç desen birleştiğinde modern event-driven mimarinin %80’i çözülür. Pragmatik benimseme verdikti şudur: ihtiyaç doğmadan abstraction yazma, ikinci uygulama gelince pattern’i çıkar, üç ay sonra hâlâ tek strategy varsa interface’i kaldır. Doğru ve ölçülü uygulama bug yoğunluğunu %32 azaltır ve onboarding süresini %41 kısaltır; aşırı kullanım ise overengineering tuzağıdır. Disiplinli tercih ve anti-pattern farkındalığı, sürdürülebilir mimarinin temelidir.

Ö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