Yuvalanmış sınıfların değeri düşük mü?


9

Herkesin bilmediği bir şey bildiğimi söylemeye çalışmıyorum ama iç içe derslerin kullanımıyla gittikçe daha fazla tasarım çözüyorum, bu yüzden bu nadiren kullanılanın kabul edilebilirliğine dair bir his almak merak ediyorum tasarım mekanizması.

Bu beni şu soruya yönlendiriyor: Beni ısırmaya geri döndüklerinde keşfedeceğim nedenlerden dolayı miras olarak kötü bir yola mı gidiyorum, yoksa iç içe dersler belki de hafife alınan bir şey mi?

İşte onları için kullandığım iki örnek: https://gist.github.com/3975581 - birincisi sıkıca ilişkili heirarchical şeyleri bir arada tutmama yardımcı oldu, ikincisi korunan üyelere işçilere erişim izni vereyim ...


Sadece cevaplar / anlayışlar için teşekkür etmek istiyorum - Bir cevabı nasıl alacağımdan emin değilim, bu yüzden aldığım tavsiyeyi kabul edip tekrar ziyaret ederken bırakacağım ...
Aaron Anodide

Yanıtlar:


6

Bunu "nadiren kullanılan bir tasarım mekanizması" olarak adlandırmam - en azından evrensel olarak değil: bazı katkıda bulunanların iç içe geçmiş dersleri kullanarak kaşlarını çatabileceği dükkanlar olmasına rağmen, bu hiç de belirsiz bir özellik değil.

Montaj görünürlüğü olan sınıfların varlığı ve lambdaların tanıtımı, iç içe sınıflara * olan ihtiyacı önemli ölçüde azaltmış olsa da , geçerli bir tasarım seçeneği olmaya devam etmektedir. Bir ad alanının içindeki iç sınıflarla bazı çakışmalar olsa da, iç içe sınıflar özelliği, bir sınıfı tamamen başka bir sınıfın içine gizlemenize olanak tanıyan benzersizdir.


* Java'da benzer bir özelliğin kullanımı çok daha yüksektir, çünkü C # 'da bulunan diğer alternatifler Java'da yoktur.


OOP tasarımının özüne göre bir sınıfı tamamen başka bir sınıfta gizlemek iyi mi?
Maxood

1
@Maxood Bir sınıfı gizleyebiliyorsanız gizlemek iyidir. API'nızın kullanıcısı, API'nızın uygulanma şekli hakkında mümkün olduğunca az bilgi sahibi olmalıdır.
dasblinkenlight

3

Bir an için başka bir sınıfın içine bir sınıf yazdığınızı düşünün, bu asla programınızın başka hiçbir yerinde kullanılmayacaktır. Çünkü başka bir yerde kullanıyor olsaydınız, tıpkı diğerleri gibi sıradan bir kamu sınıfı olurdu.

Yani OOP'u harika yapması gereken (yeniden kullanılabilirlik) burada yoktur. Ayrıca, ana sınıf içindeki sıradan yöntemlerle ve özel üyelerle elde edemediğiniz iç içe bir sınıfla neler başardınız?

Yuvalanmış sınıfları kullanan kullanışlı bir yazılım deseni için buraya bakın .


10
Yeniden kullanılabilirlik özelliğini hiç satın almadım, en azından normalde olduğu gibi değil. (1) Varolan kod / sınıfları çağırmanın (hakkında konuştuğunuz ve genellikle yeniden kullanımın tanımı olarak gördüğüm) OOP ile hiçbir ilgisi yoktur, sadece temel modülerliktir. (2) OOP'nin bir tanımlayıcı özelliği olan alt tip polimorfizmi, spesifik uygulamayı ilgisiz hale getirerek müşteri kodunun yeniden kullanılmasına izin verir , yani beton sınıfının erişilebilir olup olmadığı tam olarak aynı şekilde çalışır. IOW bu yeniden satın alıyorum, ama aynı zamanda iç içe sınıflarla da çalışır.

1
Üst sınıf tarafından verilen ad alanı yalıtımı da olduğunu söyleyebilirim - eğer isterseniz, A ve B sınıflarının her ikisi de "Params" sınıfını ve içerdiği sınıfın halka açık olmayan üyelerine erişimi içerebilir. Her ikisi de sınıf dışında kullanılan iç sınıflara sahip olmanın nedeni değil mi?
Aaron Anodide

@AaronAnodide Bu, iç içe sınıfları kullanmanın iyi bir yolu hakkında bir cevap olmalıdır. Tam olarak nasıl / neden kullanıyorum, kodu düzenlemeye yardımcı oluyor.
İzkata

2

am I going down an inherintly bad path

Sanırım ikinci örneğinizde (işçi alt sınıfları) kesinlikle öylesiniz. Her alt sınıfı süper sınıftaki belirli bir duruma eşlediniz. Şimdi, süper sınıfa her durum eklemek istediğinizde, üç konumda bir değişiklik yapmanız gerekecektir (süper sınıfa durum ekleyin, yeni bir alt sınıf ekleyin ve listeye alt sınıf eklemek için türetilmiş sınıfın yapıcısını değiştirin ).

Özel üyelere erişmek için iç içe sınıfların kullanımı geçerli bir kullanım gibi görünmektedir (hiç kişisel olarak yapmadım), ancak özel durumunuz burada çalışmaz.

Vücut parçası örneğine gelince. Yuvalanmış sınıfların tümü herkese açık olduğundan, ad alanı dışında pek bir şey yapmıyorsunuz. Bu sınıflar daha fazla işlevsellik eklemek için büyürse, iç içe sınıfların yalnızca arabirimleri karıştırdığını ve belirli bir şey bulmak için kod aracılığıyla elediğinizi görebilirsiniz. Ayrıca, iç içe dersleriniz olduğu için, adlandırma kurallarını kırmaya ve sınıflarınızı küçük harfle adlandırmaya zorlandığınızdan (belki de bu bir seçimdir) fark ettim. Fakat bu argümanlar aslında yanlış olan her şeyden daha yüzeyseldir.

Tabii ki, dağınık bir kol uygulamanız gerekmedikçe. Daha sonra aşağıdakileri yaparak bir kol oluşturmak kafa karıştırıcıdır çünkü vücut / gövde / yan yoktur. (Ayrıca kafa karıştırıcı kasa dikkat edin).

arm newArm = new Body.torso.side.arm("");

1

Yuvalanmış sınıfları düşünebileceğim tek avantaj, bunların özel (veya korumalı) yapılabilmesidir. Bu durumda , bir sınıf dış sınıf ve yalnızca o sınıf tarafından kullanılmak üzere tasarlanmışsa, iç içe sınıfların işlevselliği kapsamaya yardımcı olabileceğini söyleyebilirim .


1

Deneyimlerime göre, iç içe dersler

  • Bana musallat olmak için geri döndü
  • Köşeleri kesmek istediğimde kullanıldım
  • Bir kabus testi yaptı
  • Endişelerin ayrılması ve genel tasarım üzerinde olumsuz etkisi oldu

Sınıfınıza kısa bir bakış attı ve hemen şunu düşünüyorum:

  • Ona bakmak acı verici çünkü sınıf çok büyük
  • Hemen hemen tüm vücudu yaratmadan "parmakları" test edemiyorum
  • Birden fazla gövde uygulamam olamaz. Bir "insan vücudu" bağlamında o kadar açık görünmüyor, ama farklı bir senaryoda bu açık hale gelecektir.

Neden sınıfınızı birden fazla sınıfa ayırmıyorsunuz ve onlara ayrı ad alanları vermiyorsunuz. Örneğin

WindowsGame1.PhysicalModel.UpperBody
WindowsGame1.PhysicalModel.LowerBody
WindowsGame1.PhysicalModel.UpperBody.Arms
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.