Çözüldü Open Closed ve Dependency Inversion arasındaki fark nedir?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
11 Eylül 2020
Mesajlar
1.857
Çözümler
6
Yer
Almanya
Daha fazla  
Cinsiyet
Erkek
Meslek
König
Merhaba. Solid prensiplerindeki OCP ve DIP arasındaki fark tam olarak nedir? OCP, bize sınıfın geliştirmeye açık değiştirilmeye kapalı olmasını söylüyor, DIP ise direkt olarak bir nesneye bağımlı olmak yerine bir interface gibi birşeye bağımlı olarak bağımlılığın tersine çevrilmesini söylüyor. OCP yi uygulamak için DIP dışında bir yol var mı?
 
Çözüm
OCP'yi daha genel, DIP'i ise OCP'yi tamamlayan bir prensip gibi düşünmeliymişiz. Birbirlerine oldukça yakın sayıldıkları için sadece birini violate eden bir örnek bulmak zor. Şu örnek güzel, What is difference between the Open/Closed Principle and the Dependency Inversion Principle?

Daha iyi anlamak için oradaki örneği klasik örnekler gibi gözümüzde canlandırabileceğimiz şekilde düşünebilirsin.

Abstract sınıf -> çalışanlar abstract sınıfı olsun, dependency1 ve dependency2 de şirketin her çalışana verdiği şirkettelefonu ve şirketaracı olsun.
Bu abstract sınıfı extend eden standart çalışan, kıdemli çalışan vb. sınıflar olabilir. Mesela sisteme yönetici diye bir çalışan tipi eklemek istediğimde diğer kodları değiştirmeme gerek kalmadan abstract sınıfı extend eden yönetici diye bir sınıf ekleyebilirim (mesela yönetici sınıfına şirketuçağı, uydu telefonu vb. tanımlayabilirim). Open-closed a uyumlu görünüyor.

Ancak bu adamın örneğini düşünürsen bu DIP'e ters bir durum, telefondur, taşıttır o cins alt seviye sınıflara bağımlı durumda. DIP'e uyumlu olması için nasıl bir değişiklik yapılabilir: Çalışanın vasıtasına bakıp da tamam sen arabayla git, sen uçakla git vb. kullanılması yerine seyahatEt() iletisimKur() gibi interface implementasyonları olmalı, calisan.iletisimKur() şeklinde method çağırılmalı.
Bildiğim kadarıyla DIP' yi örneğin N katmanlı mimaride bir katman ile farklı bir katman arasında ilişki kurmak istediğinize (bir katman diğer bir katmandaki metotlara erişiyorsa) kullanıyoruz. OCP ise örneğin product sınıfınız var ve bu sınıftan kalıtılan PhysicalProduct ve DigitalProduct sınıfınız olsun. Siparişi yönetmek için ayrı ayrı PysicalProduct ve DigitalProduct için metotlar yazmak yerine Product için bir metot yazmanız yeterli olacaktır.
 
OCP'yi daha genel, DIP'i ise OCP'yi tamamlayan bir prensip gibi düşünmeliymişiz. Birbirlerine oldukça yakın sayıldıkları için sadece birini violate eden bir örnek bulmak zor. Şu örnek güzel, What is difference between the Open/Closed Principle and the Dependency Inversion Principle?

Daha iyi anlamak için oradaki örneği klasik örnekler gibi gözümüzde canlandırabileceğimiz şekilde düşünebilirsin.

Abstract sınıf -> çalışanlar abstract sınıfı olsun, dependency1 ve dependency2 de şirketin her çalışana verdiği şirkettelefonu ve şirketaracı olsun.
Bu abstract sınıfı extend eden standart çalışan, kıdemli çalışan vb. sınıflar olabilir. Mesela sisteme yönetici diye bir çalışan tipi eklemek istediğimde diğer kodları değiştirmeme gerek kalmadan abstract sınıfı extend eden yönetici diye bir sınıf ekleyebilirim (mesela yönetici sınıfına şirketuçağı, uydu telefonu vb. tanımlayabilirim). Open-closed a uyumlu görünüyor.

Ancak bu adamın örneğini düşünürsen bu DIP'e ters bir durum, telefondur, taşıttır o cins alt seviye sınıflara bağımlı durumda. DIP'e uyumlu olması için nasıl bir değişiklik yapılabilir: Çalışanın vasıtasına bakıp da tamam sen arabayla git, sen uçakla git vb. kullanılması yerine seyahatEt() iletisimKur() gibi interface implementasyonları olmalı, calisan.iletisimKur() şeklinde method çağırılmalı.
 
Son düzenleyen: Moderatör:
Çözüm
OCP'yi daha genel, DIP'i ise OCP'yi tamamlayan bir prensip gibi düşünmeliymişiz. Birbirlerine oldukça yakın sayıldıkları için sadece birini violate eden bir örnek bulmak zor. Şu örnek güzel, What is difference between the Open/Closed Principle and the Dependency Inversion Principle?

daha iyi anlamak için oradaki örneği klasik örnekler gibi gözümüzde canlandırabileceğimiz şekilde düşünebilirsin.

abstract sınıf -> çalışanlar abstract sınıfı olsun, dependency1 ve dependency2 de şirketin her çalışana verdiği şirkettelefonu ve şirketaracı olsun.
Bu abstract sınıfı extend eden standart çalışan, kıdemli çalışan vb. sınıflar olabilir. Mesela sisteme yönetici diye bir çalışan tipi eklemek istediğimde diğer kodları değiştirmeme gerek kalmadan abstract sınıfı extend eden yönetici diye bir sınıf ekleyebilirim (mesela yönetici sınıfına şirketuçağı, uydu telefonu vb. tanımlayabilirim). Open-closed a uyumlu görünüyor.

Ancak bu adamın örneğini düşünürsen bu DIP'e ters bir durum, telefondur, taşıttır o cins alt seviye sınıflara bağımlı durumda. DIP'e uyumlu olması için nasıl bir değişiklik yapılabilir: çalışanın vasıtasına bakıp da tamam sen arabayla git, sen uçakla git vb. kullanılması yerine seyahatEt() iletisimKur() gibi interface implementasyonları olmalı, calisan.iletisimKur() şeklinde method çağırılmalı.
Peki hocam bir nesneyi direkt new ile kullanmak DIP ı bozar mı? Herşeye interface gibi şeylerden mi erişmek zorundayız?
 
"Loose coupling" yaklaşım için abstraction yapılmalıdır. SOLID prensiplerinden de anladığın üzere bir nesneye ya da modüle direkt bağımlılık yerine mesela interface üzerinden erişirsen bu sağlanır, sen interface in sana sunduğu bilgi kadar nesneye bağlı kalır ve bilirsin, implemente eden sınıflarda ise istediğin eklemeyi vb. yapabilirsin, bu üst modülleri etkilememelidir.
 
"Loose coupling" yaklaşım için abstraction yapılmalıdır. SOLID prensiplerinden de anladığın üzere bir nesneye ya da modüle direkt bağımlılık yerine mesela interface üzerinden erişirsen bu sağlanır, sen interface in sana sunduğu bilgi kadar nesneye bağlı kalır ve bilirsin, implemente eden sınıflarda ise istediğin eklemeyi vb. yapabilirsin, bu üst modülleri etkilememelidir.
Peki teşekkürler hocam.
 

Technopat Haberler

Geri
Yukarı