Kompozisyonun genelleme yerine daima doğru seçim olduğunu nasıl biliyoruz?


9

Bir nesne fiziksel olarak mevcut olsun ya da olmasın, onu farklı şekillerde modellemeyi seçebiliriz. Birçok durumda keyfi veya genelleme kullanabiliriz. Bununla birlikte, GoF "genelleme üzerine iyilik kompozisyonu [sic]" ilkesi bizi kompozisyon kullanmamıza yönlendirir. Yani, örneğin bir çizgiyi modellediğimizde, Point (generalization) yerine Point (kompozisyon) türünde iki üye PointA ve PointB içeren bir sınıf oluştururuz. Bu, nesnelerin genellikle çok daha karmaşık olmasına rağmen, model veya kompozisyonu kalıtım yoluyla nasıl seçebileceğimizin basitleştirilmiş bir örneğidir.

Bunun doğru seçim olduğunu nasıl bilebiliriz? En azından önemli, çünkü eğer yanlışsa yapılacak bir ton yeniden düzenleme olabilir mi?


9
Örneğiniz gerçekten işe yaramıyor çünkü bir çizginin bir nokta olduğunu söyleyemiyorsunuz ve bu nedenle Liskov İkame Prensibi'ni geçemiyor ve kalıtım uygun değil.
Dean Harding

@Dean: Muhtemelen bildiğiniz gibi, örnek noktaya gelmez. Kayıt için, bir çizgi iki noktadan tanımlanan bir denklem olarak temsil edilebilir.
CarneyCode


1
@Songo: Anlaşılan noktayı tamamen kaçırmışsın.
CarneyCode

Genelleme yerine uzmanlığı genişletmiyor musunuz?
Tulains Córdova

Yanıtlar:


17

Her zaman doğru seçim değildir. Öyle elverişli çoğu durumda bir. Kompozit bir model değişiklik veya uzatma gerektirdiğinde, buna çok daha dirençlidir, çünkü diğer sınıfları yanlışlıkla etkilemekten korkmadan kompozisyonu değiştirebilirsiniz.

Bunu nasıl biliyoruz? Deneyimden ve başkalarının deneyimlerinden.

Büyük bir sınıf hiyerarşisinin basit bir kavram olarak başlayan şeyden büyüdüğü birçok durum gördüm ve burası büyük yeniden düzenlemenizin gerekli hale geldiği yer. Bu arada hiç bir kompozisyon yapısının miras olarak yeniden düzenlenmesi gereken bir durum görmedim.

Ama benim fıkra delillerim yeterli olmamalı. Sadece internete bakın ve çok sayıda insan aynı deneyimleri yaşadı.


Beğendim; bir oylama yapmak.
CarneyCode

+1 "Hiç bir kompozisyon yapısının miras olarak yeniden düzenlenmesi gerektiği bir durum görmedim."
Kazark

7

"Kalıtım üzerinde kompozisyon tercih" ötesinde başparmak daha güçlü bir kural istiyorsanız o zaman böyle bir şey önerebilir:

Bir nesneyi uzmanlaştırmanın iki yolundan - Kalıtım ve Kompozisyon - kalıtım sadece nesnenizin uzmanlaştığınız temel sınıf için polimorfik (ikame edilebilir) olması gerektiğinde kullanılmalıdır.

Ancak, tüm kurallar gibi, kuralı anladıktan sonra - kuralı ihlal etmekte özgürsünüz :)


0

Kompozisyon ve genellemenin nasıl alternatif olduğunu ve alıntıyı bulamadığımı görmüyorum .
Kompozisyon ve kalıtım (uzmanlık elde etmek için) ve soyutlamanın ve genellemenin (modülerliğe ulaşmak için) olduğu iddia edilebilir.

İstediğiniz, tasarımınızın basit ve makul olması, doğası gereği kolayca ölçülebilen iki niteliktir.
Sizin durumunuzda, uzatmak yerine iki noktadan oluşan bir çizgi oluşturmak daha akla yatkın görünmektedir, çünkü bir çizgiyi doğal olarak bir nokta kavramını genişletmek yerine iki nokta ile tanımlarsınız.


Daha doğal mı? Bir çizgi, tek bir noktadan daha fazla iki nokta değil mi?
CarneyCode

2
Ben 2+ puan yapılmış gerçeği içermeyen bir çizgi tanımı görmedim. Alan adınızda yalnızca 1 x değeriniz varsa, bir çizginin denklemini kullanmak bile, o zaman bir çizgi değil, bir noktadır.
Rig

0

Her iki aday da uygun olduğunda iyilik olur. Soruda belirtilen sorun bu hesapta başarısız oluyor, çünkü sadece bir kompozisyon seçeneği var.

"Kompozisyon genellemeyi de kullanabilir". Bu ifade bizim için anlamlı mı? Değilse, henüz 'iyilik' kuralını kavramaya hazır değiliz.

Kompozisyonu neden tercih ediyoruz, Kompozisyonun genellemeden daha fazla uzama / esneklik olanakları sunmasıdır. Bu uzatma / esneklik, çoğunlukla çalışma zamanı / dinamik esneklik (arayüzler ve kompozisyon kombinasyonu ile elde edilir) anlamına gelir.

Fayda hemen görünmez. Avantajı görmek için bir sonraki beklenmedik değişiklik isteğini beklemeniz gerekir. Bu yüzden çoğu durumda genellemeye bağlı olanlar, kompozisyonu benimseyenlerle karşılaştırıldığında başarısız olurlar (daha sonra bahsedilen açık bir vaka hariç). Dolayısıyla kural. Bir öğrenme açısından bakıldığında, bir bağımlılık enjeksiyonunu başarılı bir şekilde uygulayabiliyorsanız, hangisinin hangisini tercih edeceğini bilmelisiniz. Kural, hangisini seçeceğinizden emin olmadığınızda karar vermenize yardımcı olur. Yine her iki seçeneği de görebilmek için ilk etapta görebilmeniz gerekir.

Özet: Kompozisyon: Bağlama sadece daha büyük bir şeye taktığınız bazı küçük şeylere sahip olarak azaltılır ve büyük nesne daha küçük nesneyi geri çağırır. Genelleştirme: Bir yöntemin geçersiz kılınabileceğini tanımlayan bir üçüncü taraf API bakış açısından, bir yöntemin çağrılabileceğini tanımlamaktan daha güçlü bir taahhüttür (Genelleştirme için kesin kazanç). Kompozisyon ile de genellemeyi büyük bir sınıf yerine bir arayüzden kullandığınızı asla unutmayın. Ancak tüm kredi maalesef kompozisyona gidiyor.


-4

Bugün yaklaşık 300 LoC yazdım. Ve ihlal edebileceğim ve ihlal edemediğim herhangi bir prensibi hatırlayamıyorum. Yeniden düzenleme ruhumu kurtaracak, umarım.

Soyutlama, 3d parti api tarafından belirlenirse - genellikle miras kullanmak doğrudur. Yerli tasarımda varlık ya soyut ya da mühürlü olmalıdır. Soyut varlığın potansiyel olarak yaklaşık 3 mirasçısı olmalıdır. Tek sanal yöntem uzantı noktalarını sevmiyorum. Her şey benim zevkimle ilgili. Tamamen farklı bir hikaye olan arayüz soyutlamasından bahsetmiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.