# Dependency Inversion Principle

### 5. DIP - Dependency Inversion Principle

{% hint style="info" %}
**A.** Üst düzey modüller alt düzey metotlara bağımlı olmamalıdır. Her ikisi de soyutlamalara (abstractions) bağımlı olmalıdır.&#x20;

**B.** Soyutlamalar detaylara bağımlı olmamalıdır. Detaylar soyutlamalara bağımlı olmalıdır.
{% endhint %}

* Üst düzey modüllerin alt düzey modüllere bağımlılığını ortadan kaldırarak yeniden kullanımlarını sağlar.
* Inversion ifadesinin anlattığı gibi, bağımlılık ters yöne yani alt düzeyden üst düzeye doğru değişmez. (Aslında bağımlılık ve kontrol frameworke, sisteme devredilir.) Her iki düzey de soyutlamalara bağımlı olur.
* Abstractlar (arayüzler) implementasyonlardan ayrı paketlerde olursa, yeniden kullanımları daha kolay olur.
* Tasarım kalıpları:
  * Strategy pattern (detaylar soyutlamalara bağımlı olmalıdır sorununu çözer.)
  * Inversion of Control
    * Dependency Injection
    * Service Locator
    * Oluşturma ya da Factory metotları
  * Template Method
  * Factory
* Uygulamayı oluşturan üst düzey modüllerdir. Alt modüllerdeki değişiklikler bunları etkilememeli.
* Yeniden kullanılabilecek modüller de bu üst düzey modüllerdir. Yani bu modülleri yeniden kullanılabilir yapmaya bak.
* Çirkin bölümleri izole et. Detaylarla başkaları uğraşsın. (Alt düzeyler)
* Kötü tasarım özellikleri:
  * katı - rigid (birçok yer aynı anda değişiyor)
  * kırılgan – fragile (bozulabilir, hataya açık)
  * hareket edemez - immobile (yeniden kullanılabilirlik yok)
