it-swarm.asia

Bir sınıfta 'final' kullanmak neden bu kadar kötü?

Ben bir PHP OOP eski bir web sitesi yeniden düzenleme).

Ben "make it explicit that the class is currently not extended by anything" Sınıfları üzerinde 'final' kullanmaya başlamak için cazip. Bir sınıfa gelir ve bir protected özelliği veya yöntemi yeniden adlandırabilir/silebilir/değiştirebilir miyim merak ediyorum bu çok zaman kazandırabilir. Eğer ben gerçekten bir sınıfı genişletmek istiyorsam, son anahtar kelimeyi kaldırabilirim genişletmek için.

I.e Çocuk sınıfı olmayan bir sınıfa gelirsem, bu bilgiyi sınıfa bir final olarak işaretleyerek kaydedebilirim. Bir dahaki sefere geldiğimde, çocuk olup olmadığını görmek için kod tabanını yeniden aramak zorunda kalmazdım. Böylece yeniden düzenleme sırasında zamandan tasarruf sağlar.

Her şey mantıklı bir zaman tasarrufu fikri gibi görünüyor .... ama sık sık sınıfların sadece nadir/özel durumlarda 'final' yapılması gerektiğini okudum.

Belki de Mock nesnesi oluşturmayı berbat eder veya düşünmediğim diğer yan etkileri vardır.

Neyi kaçırıyorum?

34
JW01

Sık sık derslerin sadece nadir/özel durumlarda 'final' yapılması gerektiğini okudum.

Kim yazdıysa bu yanlış. final değerini bolca kullanın, bunda yanlış bir şey yok. Bir sınıfın kalıtım göz önünde bulundurularak tasarlanmadığını belgelemektedir ve bu genellikle varsayılan olarak tüm sınıflar için geçerlidir: anlamlı bir şekilde miras alınabilecek bir sınıf tasarlamak yalnızca final belirtecini kaldırmaktan daha fazlasını gerektirir; çok dikkat gerektirir.

Dolayısıyla, varsayılan olarak final kullanmak kötü değildir. Aslında, birçok insan bunun varsayılan olması gerektiğini öneriyor, ör. Jon Skeet .

Belki Mock nesnesi yaratmayı berbat eder ...

Bu gerçekten bir uyarıdır, ancak sınıflarınızı taklit etmeniz gerekiyorsa her zaman arabirimlere başvurabilirsiniz. Bu, tüm sınıfları sadece alay etmek amacıyla mirasa açık hale getirmekten kesinlikle üstündür.

54
Konrad Rudolph

Bir sınıfın alt sınıfları olmadığını kendinize not etmek istiyorsanız, elbette bunu yapın ve bir yorum kullanın, bunun için ne olduğunu. "Nihai" anahtar kelime bir yorum değildir ve yalnızca size bir şey bildirmek için dil anahtar kelimeleri kullanmak (ve bunun ne anlama geldiğini yalnızca siz bilirsiniz) kötü bir fikirdir.

8
Jeremy

"Derslerin finali ne zaman ilan edilir" hakkında güzel bir makale vardır. Ondan birkaç alıntı:

TL; DR: Bir arabirim uygularlarsa ve başka genel yöntem tanımlanmamışsa sınıflarınızı her zaman final yapın

Neden final kullanmam gerekiyor?

  1. Doom'un devasa miras zincirinin önlenmesi
  2. Kompozisyonu teşvik etme
  3. Geliştiriciyi, herkese açık API'yı düşünmeye zorlayın
  4. Geliştiriciyi bir nesnenin genel API'sını daraltmaya zorlama
  5. Bir final sınıfı her zaman genişletilebilir hale getirilebilir
  6. extends kapsüllemeyi kesiyor
  7. Bu esnekliğe ihtiyacınız yok
  8. Kodu değiştirmekte özgürsünüz

final ne zaman engellenir:

Final sınıfları sadece aşağıdaki varsayımlar altında etkin bir şekilde çalışır:

  1. Son sınıfın uyguladığı bir soyutlama (arayüz) vardır
  2. Son sınıfın herkese açık API'sı bu arayüzün bir parçasıdır

Bu iki ön koşuldan biri eksikse, kodunuz soyutlamalara gerçekten bağlı olmadığından, muhtemelen sınıfı genişletebileceğiniz bir noktaya ulaşacaksınız.

Not; Harika okuma için @ocramius'a teşekkürler!

5
Nikita U.

Bir sınıf için "final" şu anlama gelir: Bir alt sınıf mı istiyorsunuz? Devam edin, "final" alt sınıfını istediğiniz kadar silin, ancak işe yaramazsa bana şikayet etmeyin. Kendi başınasın.

Bir sınıf alt sınıfa tabi tutulabildiğinde, diğerlerinin güvendiği davranış, alt sınıfların uyduğu soyut terimlerle açıklanmalıdır. Arayanlar biraz değişkenlik beklemek için yazılmalıdır. Belgeler dikkatlice yazılmalıdır; kaynak kod henüz orada olmadığından insanlara "kaynak koduna bak" diyemezsiniz. Tüm bunlar çaba. Bir sınıfın alt sınıfa girmesini beklemiyorsam, bu gereksiz bir çaba. "nihai" açıkça bu çabanın yapılmadığını söylüyor ve adil uyarı veriyor.

5
gnasher729