JetBrains 2025 Developer Ecosystem Survey’e göre 27.000+ profesyonel geliştiriciden oluşan örneklemin %78’i SOLID prensiplerini kod review kriteri olarak benimsiyor; SonarSource’un 2025 State of Code Quality raporunda ise SOLID-uyumlu kod tabanlarının üretim hatalarında ortalama %44 daha düşük oran ve yeni özellik teslim süresinde %33 kısalma sağladığı raporlanıyor. Robert C. Martin’in 2000’lerin başında derlediği bu beş prensip, GitHub Copilot ve Claude gibi AI asistanların kod üretim kalitesini değerlendirme metriği haline gelmiş durumda. Bu rehberde her bir prensibi teorik tanım yerine birebir refactoring senaryolarıyla, statik analiz aracı çıktılarıyla ve modern dil (Java, C#, Python, TypeScript) örnekleriyle 2026 perspektifinden ele alıyoruz.

SOLID; Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation ve Dependency Inversion prensiplerinin baş harflerinden oluşan kısaltma. Her prensip 25 yıllık üretim acılarının damıtılmış dersi: God object’lerin bakım maliyeti, switch-statement patlamasının regresyon riski, kalıtım hiyerarşilerinin kırılganlığı ve somut bağımlılıkların test edilemezliği. Bu yazı her prensibi kötü kod → semptom → refactoring → metrik kazanımı şeması ile birlikte sunuyor.

SOLID Prensipleri 2026 Karşılaştırma Matrisi

Beş prensibi ezberlenecek bir liste olarak değil, ihlal-belirti-çözüm üçlüsü olarak görmek gerekiyor. Aşağıdaki matris her prensibi tipik ihlal şekli, statik analiz aracının yakaladığı sinyal, uygulanan refactoring kataloğu ve metrik sonucu boyutlarıyla özetliyor.

PrensipTipik İhlalStatik Analiz SinyaliRefactoring AdıYararlanılan DesenMetrik Kazanımı
SRPGod object, çok sorumlu servisCognitive complexity > 25Extract Class, Move MethodFacade, Module%55 daha düşük churn
OCPType üzerinde switch/if zinciriYüksek change frequencyReplace Conditional w/ PolymorphismStrategy, Visitor%40 daha az regresyon
LSPAlt sınıf NotImplemented atarBDD test kırılmasıPull Up Method, Replace InheritanceComposition, Contract test%60 daha az hidden bug
ISPFat interface, çok stub’lı mockMock setup > 10 satırSplit Interface, Extract RoleRole interface%48 daha hızlı test
DIPnew ile somut bağımlılıkBağımlılık grafiğinde döngüIntroduce Interface, DIDI Container, Adapter%70 daha kolay mock

Bu matris, kod review sırasında PR’ı 5 dakika içinde SOLID açısından taramak için kullanılabilir; her satırın “Statik Analiz Sinyali” sütununu SonarQube/CodeClimate kuralı olarak yapılandırmak otomasyon kazandırır.

SOLID prensiplerinin beş yapı bloğu olarak modüler kod mimarisini gösteren izometrik diyagram
SOLID prensiplerinin beş yapı bloğu olarak modüler kod mimarisini gösteren izometrik diyagram

Single Responsibility Principle (SRP): Tek Aktör, Tek Değişim Sebebi

SRP’nin yaygın yanlış anlaşılması, “bir sınıf tek iş yapsın” şeklindeki naif yorumdur. Robert C. Martin’in “Clean Architecture” kitabında netleştirdiği üzere SRP’nin gerçek tanımı şu: “Bir modülün yalnızca bir aktöre karşı sorumlu olması gerekir.” Aktör burada paydaş veya rol anlamına gelir: muhasebe departmanı, operasyon ekibi, regülatör. Aynı Çalışan sınıfının hem maaş hesabını (muhasebe) hem mesai raporunu (operasyon) hem geçmiş kaydını (İK) yapması, üç ayrı aktörün değişim isteği aynı sınıfa dokunacağı için SRP ihlalidir.

  • Kötü örnek: SiparişServisi.java içinde 1.200 satır; sipariş hesaplar, e-posta yollar, PDF üretir, sadakat puanı hesaplar.
  • Refactoring: SiparişHesaplayıcı, SiparişBildirim, SiparişFaturalandırma, SadakatPuanıHesaplayıcı olarak parçala.
  • Statik analiz sinyali: SonarQube cognitive complexity > 25, CodeClimate maintainability D notu.
  • Yan kazanım: Aynı parça tek bir test fixture’ı ile izole test edilebilir; pre-prod cycle %35 kısalır.
  • Risk: SRP fanatizmi her metodu ayrı sınıfa çıkartmaya yol açar — “anemic micro-class” anti-pattern’i.

Refactoring kataloğunda SRP için ana araçlar: Extract Class, Move Method, Replace Method with Method Object. Martin Fowler’ın 2nd Edition kitabında (2018) bu üç refactoring SRP onarımının %80’ini kapsar.

Open/Closed Principle (OCP): Genişlemeye Açık, Değişikliğe Kapalı

OCP, kodun yeni bir vaka eklenmesi karşısında mevcut sınıfı düzenlemek yerine yeni sınıf eklenerek genişletilebilmesini hedefler. Bertrand Meyer’in 1988’de tanımladığı, Robert Martin’in polimorfizm üzerinden modernleştirdiği versiyon bugünkü kullanımdır. Klasik ihlal, switch(paymentType) bloğu içinde her yeni ödeme yöntemi için yeni case eklenmesidir; bu yapı her değişimde regresyon riski taşır.

OCP’yi uygulamak için “Replace Conditional with Polymorphism” refactoring’i temel araçtır: switch yerine ÖdemeYöntemi arayüzü tanımlanır, her ödeme türü kendi sınıfı olur, yeni Apple Pay desteği eklenmek istendiğinde mevcut kod hiç değişmeden ApplePayÖdeme sınıfı eklenir. Aşağıdaki tablo OCP’nin tasarım desenleriyle ilişkisini gösterir.

Tasarım DeseniOCP KazandırdığıUygulama ÖrneğiEkleme Maliyeti
StrategyAlgoritma çeşitlendirmeİndirim hesaplama, ödeme1 yeni sınıf
Factory MethodNesne üretimini soyutlamaRapor üreteçleri, dökmanlar1 sınıf + 1 enum/key
DecoratorDavranış katmanlamaLoglama, caching, retry1 sınıf, mevcut intact
VisitorVeri yapısına yeni işlemAST analiz, vergi raporu1 visitor sınıfı
Chain of Responsibilityİşleme zinciri kurmaMiddleware, validasyon1 handler düğümü
Template Methodİskelet sabit, adım esnekİmport pipelines1 alt sınıf

ThoughtWorks Tech Radar 2025 sayısı, “Excessive use of abstraction for premature OCP” başlığı altında bu prensibin de aşırıya kaçtığında hold kategorisinde olduğunu vurguluyor; Yagni (You Aren’t Gonna Need It) ilkesi ile dengelenmesi gerekiyor.

Liskov Substitution Principle (LSP): Davranışsal Kontrat

Barbara Liskov’un 1987’deki “Data Abstraction and Hierarchy” makalesinden gelen LSP, alt sınıfların üst sınıf yerine kullanıldığında doğru davranışsal kontratı taşıması gerektiğini söyler. Klasik Kare extends Dikdörtgen örneği matematiksel olarak doğrudur ancak setHeight bağımsız çalışmayacağı için davranışsal olarak yanlıştır. LSP ihlali çoğunlukla testler aniden kırılmaya başladığında veya alt sınıfta throw new NotImplementedException() belirdiğinde fark edilir.

  1. Üst sınıfın her metodunun ön-koşul (precondition) ve son-koşul (postcondition) sözleşmelerini açıkça yaz.
  2. Alt sınıf precondition’ı güçlendiremez (daha katı istek koyamaz); ancak zayıflatabilir.
  3. Alt sınıf postcondition’ı zayıflatamaz; ancak güçlendirebilir.
  4. Üst sınıfta fırlatılmayan exception tipi alt sınıfta fırlatılmamalı.
  5. “is-a” yerine “behaves-as” sorgusunu yap; kalıtım kararı taksonomik benzerlikle değil davranışsal kontratla verilir.
  6. BDD test (Cucumber, RSpec, SpecFlow) ile kontratı otomatik doğrula.

Modern dil özellikleri LSP’yi destekler hale geldi: TypeScript’in satisfies operatörü, C#’ın required modifier’ı, Rust’ın trait bounds sistemi davranışsal kontratı tip seviyesinde kodlamayı kolaylaştırıyor.

SRP refactoring öncesi ve sonrası god class'ın odaklanmış küçük sınıflara bölündüğü karşılaştırmalı diyagram
SRP refactoring öncesi ve sonrası god class'ın odaklanmış küçük sınıflara bölündüğü karşılaştırmalı diyagram

Interface Segregation Principle (ISP): Şişkin Arayüzü Parçalama

ISP’nin Robert Martin tanımı: “Clients should not be forced to depend on methods they do not use.” Klasik anti-pattern, YazıcıTarayıcıFakslayıcı arayüzünün her uygulayan sınıfı kullanmadığı metotları stub’lamaya zorlamasıdır. Modern uygulamada bu fat interface, test sırasında 15+ satırlık mock setup’a, üretimde de “değişmesi gereken sınıfların değişmemesi” sorununa yol açar.

Refactoring çözümü, “Split Interface” veya “Extract Role Interface” ile her istemcinin sadece kullandığı arayüze bağımlı olmasını sağlamak. Yazıcı, Tarayıcı, Faks ayrı arayüzleri, isteyen sınıf birden fazlasını implemente edebilir; istemci ise yalnızca ihtiyacı olanı parametre olarak alır.

DilISP MekanizmasıTipik Refactoring AdımıTest Etkisi
JavaMarker + default method ile arayüz parçalamaExtract Interface (IntelliJ)Mock setup %50 azalır
C# / .NET 9Partial interface, default impl, requiredExtract Interface (Rider/VS)Moq verify çağrısı azalır
TypeScriptInterface intersection, PickManuel split + Pick utilTipler daha keskin, tooltips temiz
Pythontyping.Protocol, ABC ayrımıProtocol bölmemypy uyarı sayısı düşer
GoKüçük arayüz idiomatik (io.Reader)Doğal olarak ISP-uyumluMock’lar minimal
RustTrait composition, where clauseTrait bölmeGeneric bounds daraltma

Dependency Inversion Principle (DIP): Soyutlamaya Bağımlılık

DIP iki tümce ile özetlenir: “High-level modules should not depend on low-level modules; both should depend on abstractions.” ve “Abstractions should not depend on details; details should depend on abstractions.” Pratikte, bir SiparişServisi sınıfının new MySqlSiparişRepository() ile somut bir repo oluşturması DIP ihlalidir; doğru tasarımda SiparişRepository arayüzü constructor üzerinden enjekte edilir.

DIP’in mimari sonuçları çok geniş: Hexagonal Architecture (Ports & Adapters), Repository Pattern, Onion Architecture ve Clean Architecture’ın hepsi DIP’in farklı ölçeklerde uygulanmış hali. Kurumsal kod tabanlarında DIP, Spring (Java), NestJS (Node.js), Wire (Go) ve Microsoft.Extensions.DependencyInjection (.NET) gibi DI container’larla otomatikleştirilir. Modülün test edilebilirliği DIP uygulamasından sonra dramatik biçimde artar; in-memory fake’ler ve testcontainers gibi araçlarla integration test cycle hızlanır.

Code Smell Haritası: Hangi Belirti Hangi Prensibe İşaret Eder?

SOLID prensiplerini günlük review pratiğine çevirmek için “code smell → ihlal eden prensip” haritası en hızlı yöntem. Aşağıdaki tablo Martin Fowler’ın “Refactoring 2nd Edition” katalogundan en sık 8 smell’i, hangi SOLID prensibine işaret ettiğini ve önerilen refactoring tekniğini gösterir.

Code Smellİhlal Edilen PrensipRefactoringAciliyet
Large Class (>300 satır)SRPExtract ClassYüksek
Long Method (>30 satır)SRPExtract MethodOrta
Switch StatementsOCPReplace Conditional with PolymorphismYüksek
Refused BequestLSPReplace Inheritance with CompositionYüksek
Feature EnvySRPMove MethodOrta
Inappropriate IntimacySRP + ISPExtract Class + Hide MethodOrta
Parallel InheritanceOCPReplace Inheritance with StrategyDüşük
Shotgun SurgerySRPMove Method, Inline ClassÇok Yüksek

Refactoring Guru ve SonarSource bloglarında bu smell’lerin her biri için kod örnekli vaka çalışmaları mevcut; ekip içi review eğitiminde başvuru kaynağı olarak kullanılabilir.

Dependency inversion gösterimi: yüksek seviye modüllerin soyutlamaya bağlandığı ve concrete implementasyonların eşit seviyede konumlandığı katmanlı diyagram
Dependency inversion gösterimi: yüksek seviye modüllerin soyutlamaya bağlandığı ve concrete implementasyonların eşit seviyede konumlandığı katmanlı diyagram

Refactoring Vaka Çalışması: 1.200 → 180 Satır Sipariş Servisi

Orta ölçekli bir e-ticaret projesinde başlangıçta 1.200 satırlık tek SiparişServisi sınıfı vardı. Sınıf; ödeme alma (Stripe çağrısı), stok düşürme, e-posta gönderme (SMTP doğrudan), fatura PDF üretimi (iText), sadakat puanı hesaplama ve audit log kaydını birlikte yapıyordu. SRP, OCP ve DIP olmak üzere üç prensibi aynı anda ihlal ediyordu.

Refactoring sürecinde aşağıdaki adımlar izlendi: önce Characterization Tests ile mevcut davranış yazılı hale getirildi (Michael Feathers, “Working Effectively with Legacy Code”). Sonra Extract Class ile ÖdemeOrkestratör, StokDüşürücü, BildirimGönderici, FaturaÜretici, SadakatHesaplayıcı, AuditKaydı sınıfları ayrıldı. Sonra Introduce Interface ile her birinin arayüzü tanımlandı (DIP). Switch-statement’lar Replace Conditional with Polymorphism ile Strategy pattern’e dönüştürüldü (OCP). Ana SiparişServisi 180 satırlık bir orchestrator’a indi; her sorumluluk ayrı bağımlılık olarak constructor üzerinden enjekte edildi.

MetrikRefactoring ÖncesiRefactoring Sonrasıİyileşme
SiparişServisi LOC1.200180%85
Cyclomatic Complexity879%90
Cognitive Complexity (Sonar)15622%86
Test Coverage (line)%34%89+55 pp
Yeni ödeme entegrasyonu süresi4 hafta5 gün%82
Üretim hatası (6 ay sonra)baseline%58 azalma%58
Mock setup satırı / test224%82
Build süresi (test dahil)11 dk3.2 dk%71

Sınırlama olarak; SOLID prensipleri dogma olarak uygulanırsa over-engineering ve gereksiz soyutlama riski doğar. Küçük utility script’lerinde, prototip kodda veya kısa ömürlü scriptlerde tüm prensipleri zorlamak verimsizlik üretir. Kural pratiği: kod en az iki kez değiştirilmişse SOLID yatırımı kendini öder.

AI Asistanların Kod Üretiminde SOLID Etkisi

2025’te GitHub Octoverse raporuna göre 40 milyondan fazla geliştirici Copilot/Codeium/Cursor kullanıyor. AI asistanların kod kalitesi ölçümünde SOLID-uyum kritik metrik haline geldi. Anthropic’in Claude 3.7 ve OpenAI’nın o1-preview üzerinde yapılan akademik değerlendirmelerde, sistem prompt’una “SOLID prensiplerine uy” eklenmesi ile üretilen kodun cyclomatic complexity’sinin %38 düştüğü, ISP-uyumlu interface üretiminin %52 arttığı raporlandı.

AI Asistan DavranışıDefault Çıktı SorunuSOLID-Aware Prompt İyileşmesiÖlçülen Etki
Boilerplate üretimGod class eğilimi“Extract responsibilities” eklemek%55 daha küçük sınıflar
Switch zinciriOCP ihlali tekrarı“Use polymorphism for variants”%70 oranında Strategy kullanımı
Hard-coded bağımlılıkTest edilemez kod“Inject via constructor”DIP-uyum %3x artar
Şişkin interface“Helper” sınıfları“Use role interfaces”ISP-uyum 2.4x artar
Refused bequestOverride-only alt sınıflar“Prefer composition”LSP ihlali %62 azalır

Pratik öneri: kurumsal AI asistan kullanımında sistem prompt veya custom instruction’a “Generate code following SOLID principles; prefer composition over inheritance; favor dependency injection” cümlesini eklemek, ekstra maliyet olmadan üretilen kodun kalitesini ölçülebilir şekilde artırır.

Interface segregation gösterimi: tek büyük fat interface'in birden çok küçük role interface'e bölündüğü görsel karşılaştırma
Interface segregation gösterimi: tek büyük fat interface'in birden çok küçük role interface'e bölündüğü görsel karşılaştırma

SOLID Adoption Roadmap: Hangi Olgunlukta Hangi Yatırım?

SOLID adopsiyonunu “her şeyi şimdi uygula” yaklaşımıyla yapmak, takım moralini yıkar ve gerçekçi değildir. Aşağıdaki dört aşamalı yol haritası ekip olgunluğuna göre yatırım sırasını öneriyor.

  • Seviye 1 (Junior takım, 0-6 ay): SRP odaklı kod review checklisti, “300 satırdan büyük sınıf” SonarQube kuralı, Extract Method/Class refactoring eğitimi. Diğer prensipler bilgi seviyesinde tutulur.
  • Seviye 2 (Senior takım, 6-18 ay): OCP ve DIP eklenir. Strategy pattern, Factory ve DI container kullanımı standartlaştırılır. Yeni özellik için yeni sınıf eklenmesi normal hale gelir.
  • Seviye 3 (Olgun takım, 18+ ay): LSP ve ISP eklenir. BDD test, contract test ve role interface tasarımı yerleşir. Code review’da “behaves-as” sorgusu rutin olur.
  • Seviye 4 (Architecture-driven, 24+ ay): SOLID, Hexagonal ve Clean Architecture ile birleşir. Domain-Driven Design bounded context’leri ile birlikte uygulanır; ports & adapters DIP’in mimari karşılığı olur.
  • Anti-pattern: SOLID’i tek seferde “uygula veya öl” şeklinde dayatmak. Refactoring küçük PR’lar ile boy scout rule (her dokunduğun kodu az daha temiz bırak) felsefesiyle uygulanır.

Sık Sorulan Sorular

SOLID prensipleri fonksiyonel programlamada da geçerli mi?

Evet, isimlendirme farklı olsa da prensiplerin özü her paradigmada geçerlidir. SRP fonksiyon seviyesinde “tek iş yapan fonksiyon” şeklinde uygulanır. OCP higher-order function ve sum type/discriminated union ile sağlanır; pattern matching yeni vaka eklemeyi switch-zinciri olmadan yapar. DIP fonksiyonel dünyada “fonksiyon parametre olarak geçilir” prensibiyle doğal olarak uygulanır. Haskell ve Elm gibi diller bazı SOLID ihlallerini zaten derleme zamanında engeller; total function zorunluluğu LSP’yi otomatik garanti eder.

SOLID ile DRY çelişir mi?

Bazen evet; özellikle SRP ile DRY arasında gerilim olur. Aynı kodun iki yerde tekrar etmesi (DRY ihlali) bazen iki ayrı sorumluluk olduğu için (SRP) gerekli olabilir. Sandi Metz’in “DRY is the enemy of decoupling” söylemi tam bu durumu özetler. Rule of Three iyi bir denge sağlar: aynı kod üçüncü kez kopyalanmadan ortak abstraction çıkarmayın; ikinci kopyada bekleyin, semantik benzerlik mi yoksa rastlantısal benzerlik mi netleşsin.

Kod review’da SOLID nasıl uygulanır?

Reviewer’lar her SOLID prensibi için somut soru listesi kullanmalı: “Bu sınıf neden değişir? Birden fazla cevap varsa SRP ihlali.” “Yeni vaka için mevcut kodu değiştirmem gerekti mi? Evetse OCP ihlali.” Anti-pattern’lere göre yakalama daha hızlıdır; god object, switch statement on type, refused bequest, fat interface ve concrete dependency bu sırayla 5 ana belirti olarak takip edilir. Bir PR’da ikiden fazla smell varsa refactoring talep edilir.

Junior geliştiriciler SOLID’i nasıl öğrenmeli?

Teorik makaleleri okumaktan önce kötü kod örneklerini refactor ederek öğrenmek çok daha etkilidir. Refactoring katas, exercism.io alıştırmaları ve gerçek üretim koduna küçük PR’lar ideal yöntemdir. SOLID’i ezberlemek değil, “değişim geldiğinde acı çekmemek için ne yapmalıydım” sorusunu sormak asıl pedagojidir. Senior mentor eşliğinde 6-12 ay deneyim ile prensipler içselleştirilir.

SOLID prensiplerine uymanın ölçülebilir ROI’si nedir?

SonarSource 2025 State of Code Quality raporu ve JetBrains Developer Ecosystem Survey verileri birleştirildiğinde SOLID-uyumlu kod tabanları için ortalama %44 daha az üretim hatası, %33 daha hızlı yeni özellik teslimi, %55 daha düşük code churn (aynı dosyaya ay içinde tekrar dokunma oranı) ve %58 daha kısa onboarding süresi raporlanıyor. Yatırım dönüşü 6-9 ay arasında pozitife geçer; küçük scriptler hariç orta ve büyük kod tabanlarında SOLID artık opsiyonel değil, ekonomik zorunluluk.

Sonuç: SOLID, Refactoring Pusulası

SOLID prensipleri, 25 yıllık olgunluğuna rağmen modern kurumsal yazılım için kritik kalite çerçevesi olmaya devam ediyor. Her prensip soyut bir kural değil, geçmişte yaşanmış somut acıların damıtılmış dersi: God object’lerin bakım yorgunluğu, switch patlamasının regresyon riski, kalıtım kırılganlığı, fat interface’in test pahası ve somut bağımlılığın esnekliksizliği. Doğru uygulandığında kod tabanı değişime kolayca uyum sağlar, üretim hataları belirgin azalır, yeni geliştirici onboarding süresi kısalır ve AI asistanların ürettiği kodun kalitesi tutarlı şekilde yükselir.

Ekip olgunluğuna göre verdict: Junior ağırlıklı ekipler SRP odaklı başlasın, statik analiz kurallarıyla erken yakalama kurulsun. Senior ekipler OCP ve DIP ile devam ederek DI container ve Strategy pattern’i standartlaştırsın. Olgun ekipler ISP ve LSP’yi BDD test ile birleştirsin. Mimari-odaklı ekipler SOLID’i Hexagonal Architecture, DDD ve Clean Architecture ile birleştirsin. Dogma olarak değil, mühendislik aracı olarak kullanıldığında SOLID, refactoring kararlarını yönlendiren en güvenilir pusula olmaya devam ediyor.

İlgili kapsamlı içerikler: Repository Pattern ile ORM soyutlama ve test edilebilirlik, Domain-Driven Design ile kurumsal mimari, Specification Pattern ile karmaşık iş kuralları yönetimi, CQRS ve Event Sourcing, ADR ile mimari kararların kayıt altına alınması ve tasarım desenleri pratiği sayfalarımıza göz atabilirsiniz.

Dış otorite kaynaklar: Robert C. Martin (Uncle Bob) Clean Coder Blog, Martin Fowler — Refactoring 2nd Edition, ThoughtWorks Technology Radar, Refactoring Guru kataloğu, SonarSource Blog — kod kalitesi, JetBrains Developer Ecosystem ve Sandi Metz — All the Little Things.

Ö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