İç İçe Sınıflar: Yararlı bir araç mı yoksa kapsülleme ihlali mi?


11

Bu yüzden hala bunları kullanıp kullanmamam konusunda kararsızım.

Kodlamanın aşırı bir ihlali olduğunu hissediyorum, ancak kodumda daha fazla esneklik kazanırken bir dereceye kadar kapsülleme elde edebildiğimi görüyorum.

Önceki Java / Swing projeleri Bir dereceye kadar iç içe sınıflar kullanmıştım, Ancak şimdi C # 'da diğer projelere geçtim ve bunların kullanımından kaçınıyorum.

Yuvalanmış sınıflar hakkında ne düşünüyorsunuz?


Yuvalanmış sınıflar tam olarak nasıl bir kapsülleme ihlalidir? Başka bir sınıfta 'kapsüllenmiş' olduklarından ve isteğe bağlı olarak özel hale getirilebildiğinden, herhangi bir şey daha kapsüllenir.
Steven Jeuris

Yanıtlar:


8

Basitçe söylemek gerekirse, iç içe dersler kapsüllemeyi ihlal etmez ve genel olarak dil özellikleri programlama ilkelerini ihlal etmez. Programcılar programlama ilkelerini ihlal eder.

Ne kadar tuhaf ki, iç içe geçmiş sınıfların kapsüllemeyi artırdığı iddia ediliyor :

Artan kapsülleme — B'nin A olarak özel olarak ilan edilecek A üyelerine erişmesi gereken iki üst düzey sınıf olan A ve B'yi düşünün. B sınıfını A sınıfı içinde saklayarak A'nın üyeleri özel olarak ilan edilebilir ve B onlara erişebilir. Ek olarak, B'nin kendisi dış dünyadan gizlenebilir.

Bunda bir gerçek var.

Genellikle B, SRP'yi A'ya uygulamanın bir sonucudur, ancak potansiyel olarak birçok ilkeyi ihlal eder, özellikle de tek yaptığı A'nın özel üyeleriyle uğraşırsa: D

Gizli sınıfların yararlı olabileceğini düşünüyorum. Ancak yanlış kullanım için çok fazla potansiyel var.


5

Yuvalanmış sınıfları her zaman kullanıyoruz. Birçok durumda, iş yazılımları / süreçleri iş nesnelerini iç içe geçirmiştir. Hepimiz iç içe OrderItems koleksiyonuna sahip bir Order nesnesi örneğini gördük.

Sonuç olarak, kodu okumayı / yazmayı kolaylaştırır ve nadiren Order sınıfınıza ihtiyaç duyacağınız ve OrderItems hakkında bilgi sahibi olmamanız gereken bir durum vardır.


1

Şahsen, tasarımınızı çeşitli (genellikle elverişsiz) yollarla birleştirdikleri için kaçınılması gerektiğini hissediyorum.

Ancak, projeniz belirli bir kapsam ve bir sınıf (bir düğüm sınıfı veya belirli bir sınıfın veri yapısını çaprazlamak için kullanılan bir tür nesne) kapsülleme varsa o zaman zarar görmüyorum.

Aslında, bazı proje türleri için kodun (ve muhakemenin) daha okunaklı / anlaşılması kolay olduğunu düşünüyorum. Bununla birlikte, genişletilebilirliği düşünen çoğu proje için kötü bir fikir olduğunu düşünüyorum, çünkü onları ayırmak nadiren sorunlara neden olur, ancak onları bir arada bırakmak sizi (onları boşa harcanan zaman) ayırmaya zorlayabilir.


0

(C #) Genellikle sınıftan tam olarak ne amaçla bağlı olsa da, ben onları önlemek.

Onları hiçbir zaman bir etki alanı modeli sınıfı için kullanmam, bu benim için hiçbir anlam ifade etmiyor.

Bunları dış sınıftaki özel verileri yapılandırmak için kullanıyordum, ancak bunların neredeyse her zaman projenin yaşam döngüsünde harici olarak ihtiyaç duyulduğunu buldum, bu yüzden genellikle bununla uğraşmıyorum.

Şimdi bunları kullandığım tek zaman, başka bir küçük sınıfın kullanılmasının belirli bir sınıfın uygulanmasını kolaylaştırdığı veya gerçekten sadece bir olay bildirim kalıbı olan bir arayüzün (iç sınıfın bir arayüz uygulayacağı ve geçtiği) garip küçük kodlama hilesi için dış sınıfı kontrol edin).

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.