Statik yöntemlerle statik sınıflar SOLID olarak kabul edilir mi?


27

SOLID , “bir programdaki nesnelerin, bu programın doğruluğunu değiştirmeden alt tiplerinin örnekleriyle değiştirilmesi gerektiği” fikrini taşıyan Liskov ikame ilkesini içerir .

Statik yöntemlerle statik sınıflar ( Mathsınıf gibi bir bit ) hiç bir örneğe sahip olmadığından, statik yöntemlerle statik sınıflarım varsa, sistemim SOLID olarak kabul edilir mi?


Bence bu soru harika. Topluluğun neler sunabileceğini görelim.
Saeed Neamati,

1
Bir Matematik sınıfı devlet içermez. Demek bu tip nesnelerden asla gerçekten geçmiyorsunuz. Bu yüzden bunun ne kadar alakalı olduğundan emin değilim.
Martin York

Statik sınıfların gerçekten saf SOLID olarak söylenebileceğini sanmıyorum (daha önce de belirtildiği gibi bazı nedenlerden ötürü) ancak bunların DRY ilkesi için harika bir savunucu ve araç olduğunu düşünürdüm.
dreza

2
Nasıl yani? Deneyimlerime göre, statik sınıfların aşırı kullanımı çoğunlukla, insanların tek bir küresel statik tanrı nesnesini kalıcı olarak manipüle eden kodun yarısı ile sürekli kendilerini tekrar etmelerine yol açmaktadır.
back2dos

1
Sanırım ortak kod sağlamak için yardımcı kurslar hakkında daha fazla düşünüyorum. Kolayca ve sıkça yanlış kullanıldıklarını, ancak devletin sorun olmadığı ortak kodları bir arada gruplamak için yararlı araçlar sağlayabileceğini düşünüyorum
dreza

Yanıtlar:


27

LSP, bir sınıfın örneğini bir yönteme geçirmek, yöntemin bu örnekle bazı şeyler yapmak ve genellikle bir tür sonuç üretmek için geçerlidir. Bu statik sınıflar için önemli değildir, çünkü C # 'da statik sınıfın bir örneğini oluşturamazsınız.

Daha da önemlisi, statik sınıflar mühürlenir ve bu nedenle miras alınamaz. Bu, sorunuzun C # kadar ileri gitmesini sağlar.

Statik sınıfların her zaman LSP uyumlu olduğunu söyleyebilirsiniz, çünkü bu prensibi ihlal edecek bir alt sınıf üretemezsiniz. Statik sınıfların aynı sebepten dolayı LSP uyumlu olmadığını da söyleyebilirsiniz.


Java'da statik sınıflar biraz farklıdır. Üst düzey bir sınıfı "statik" olarak işaretleyemezsiniz, bu nedenle C # 'nın statik sınıflarına benzer bir yardımcı sınıf oluşturmak istiyorsanız, onu açıklamak finalve yapıcısını gizlemek zorundasınız . Bunu yaptıktan sonra, C # 'a benzer şekilde davranırlar - onları başlatamaz veya sınıflandıramazsınız. Bir iç sınıfı olarak ilan edebilirsiniz static, ancak bu, C # ile aynı anlama gelmediği anlamına gelmez: yalnızca iç içe bir üst düzey sınıfı belirtir .

VB.NET bu durumda tam olarak C # ile aynı şekilde davranıyor.


Diğer prensiplerle ilgilenip ilgilenmediğinizden bahsetmediniz, ama ben yine de tamlık için onları dahil edeceğim.

S ingle sorumluluk ilkesi : statik sınıf kolayca bu ilkeyi izleyin.
O kalem / kapalı prensibi : Statik sınıflar mühürlü olduğundan, onlar hiç bu ilkeyi takip edemez.
L iskov ikame prensibi : yukarıdaki gibi.
Ben nterface ayrımı ilkesi : Bu ilkeye uyarak yolunda atılmış bir adım olabilir tek bir sınıf için geçerli, ama daha küçük, daha uzmanlaşmış olanlar bölmeyi büyük bir statik sınıf etmez.
D ependency inversiyon prensibi : bunu kullanarak herhangi bir sınıf daima sırasında geçerli olan neyse uygulama bağlıdır, böylece statik sınıflar, arayüzler uygulayamaz. Statik sınıflar bu nedenle bu prensibi ihlal eder.

Statik sınıflar 5 kriterin tümünü karşılamadığından, SOLID değildir.


Çünkü, SOLID olmak, 5 kriteri de yerine getirmemiz gerektiği anlamına geliyor, bu onların SOLID olmadığı anlamına gelmiyor mu?
Pacerier

1
@Pacerier Evet, ancak gerekmediği takdirde her zaman bir sınıfı SOLID'a atmaya çalışmamalısınız; sınıfın içeriğine bağlıdır. Bu bir yardımcı sınıf veya başka bir şeyse, IMO "SOLID" olmamalıdır, ancak belirli etki alanı kullanımına sahip gerçek bir etki alanı sınıfıysa ...
Wayne Molina

4

Böyle bir sınıfı nesne yönelimli olarak sınıflandırmazdım ve bu yüzden nesne yönelimli tasarımın ilkelerini karşılayamayacağını (ve denememesi gerektiğini) söylerdim.

Bu sınıflar, yalnızca Java ve C # gibi dillerde bir sınıf dışında kod sağlanamaması için geçici bir çözümdür. Olabilirlerse, nesne yönelmesinden herhangi bir fayda elde edemediklerinden bağımsız işlevler olarak tanımlanmaları gerekir.


Sınıfın dışında tek başına işlevler koymakla aynı fikirde olmazdım. İlgili işlevleri (statik ya da değil) ortak bir ad altında gruplama becerisi, okunabilirlik için kullanışlıdır. Matematiksel fonksiyonlar tasarıya mükemmel şekilde uyar.
jojo

2
@jojo Anladım. Sınıf dışında tanımlanan fonksiyonları destekleyen diller ayrıca bu fonksiyonların mantıksal gruplandırılmasını da destekler, örneğin C ++ 'daki ad alanları.
Gyan aka Gary Buyn,

2

Hiçbir dil belirtilen beri C ++ bunu, bahsetmemiz var olabilir yalnızca statik üyeleri ve erişime şablon aracılığıyla bu üyeler var etrafında sınıfları geçmek ve nedenle yalnızca statik üyeleri ile bir sınıf yerine mümkündür, ve belki, yöntemler form olarak adlandırılan "arayüz".


vb.net / c # / java
Pacerier
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.