Ben birçok kişi sınıfları olmalıdır hissediyorum gerçek nedeni inanıyoruz final
/ sealed
o en olmayan soyut uzatılabilir sınıflar vardır olduğunu değil düzgün belgelenmiş .
Ayrıntılı çalışmama izin verin. Uzaktan başlayarak, bazı programcılar arasında, OOP’daki bir araç olarak kalıtımın çok fazla kullanıldığı ve kötüye kullanıldığı görüşü var. Liskov ikame prensibini hepimiz okuduk, ancak bu bizi yüzlerce (belki de binlerce) kez ihlal etmemize engel değildi.
Mesele şu ki, programcılar kodu tekrar kullanmayı seviyor. Bu iyi bir fikir olmasa bile. Ve miras, kodun bu "yeniden düzenlenmesinde" önemli bir araçtır. Son / kapalı soruya dönüş.
Son / mühürlü bir sınıf için uygun belgeler göreceli olarak küçüktür: her yöntemin ne yaptığını, argümanların ne olduğunu, dönüş değerini vb. Açıklar. Tüm olağan şeyler.
Ancak, genişletilebilir bir sınıfı düzgün şekilde belgeliyorsanız , en azından aşağıdakileri içermelisiniz :
- Metotlar arasındaki bağımlılıklar (hangi metodu hangisi, vs. olarak adlandırır)
- Yerel değişkenlere bağımlılıklar
- Genişleyen sınıfın onurlandırması gereken iç sözleşmeler
- Her bir yöntem için kongre çağırın (ör. Geçersiz kıldığınızda,
super
uygulamayı mu çağırıyorsunuz? Yöntemin başlangıcında mı yoksa sonunda mı?
- ...
Bunlar sadece kafamın üstünde. Ve bunların her birinin neden önemli olduğunu ve onu atlamanın genişleyen bir sınıfı mahvedeceğini gösteren bir örnek verebilirim.
Şimdi, bunların her birini doğru bir şekilde belgelemek için ne kadar belgelendirme çalışmasının yapılması gerektiğini düşünün. 7-8 metotlı bir sınıfın (idealize edilmiş bir dünyada çok fazla olabilir, ancak gerçekte çok az) bir sınıfının sadece metinler içeren 5 sayfalık bir dokümantasyonunun olabileceğine inanıyorum. Bu yüzden, bunun yerine, yarıya doğru eğiliyoruz ve sınıfı mühürlemiyoruz, böylece diğer insanlar da kullanabilir, ancak çok fazla zaman alacağı için düzgün bir şekilde belgelendirmeyin. Zaten asla uzatılmadı, peki neden rahatsız ediyorsun?
Bir sınıf tasarlıyorsanız, insanların öngörmediğiniz (ve hazırlıklı oldukları) bir şekilde kullanamayacakları şekilde mühürlemenin cazibesini hissedebilirsiniz. Öte yandan, başka birinin kodunu kullanırken, bazen genel API’den, sınıfın kesin olması için gözle görülür bir neden yoktur ve “Kahretsin, bu sadece bir geçici çözüm arayışı için 30 dakikaya mal oldu” düşünebilirsiniz.
Bence çözümün bazı unsurları:
- Öncelikle , kodun müşterisiyseniz uzatmanın iyi bir fikir olması ve mirasa ilişkin kompozisyonun gerçekten tercih edilmesidir.
- İkinci olarak , belirtilen bir şeyi görmezden gelmediğinizden emin olmak için kılavuzu tamamen (yine bir müşteri olarak) okumak için .
- Üçüncüsü, müşterinin kullanacağı bir kod parçasını yazarken, kod için uygun belgeleri yazın (evet, uzun yol). Olumlu bir örnek olarak, Apple'ın iOS belgelerini verebilirim. Kullanıcının sınıflarını her zaman uygun bir şekilde genişletmesi için yeterli değillerdir, ancak en azından devralma hakkında bazı bilgiler içerirler . Çoğu API için söyleyebileceğimden daha fazlası.
- Dördüncüsü, aslında çalıştığından emin olmak için kendi sınıfını genişletmeye çalış. API'lere birçok örnek ve test dahil etmenin büyük bir destekçisiyim ve bir test yaparken miras zincirlerini de test edebilirsiniz: sonuçta sözleşmenizin bir parçası!
- Beşinci, şüphe duyduğunuz durumlarda, sınıfın uzatılmayacağını ve bunu yapmanın kötü bir fikir (tm) olduğunu belirtin. Bu tür istenmeyen kullanımlardan sorumlu tutulmamalısınız, ancak yine de sınıfı mühürlemeyin. Açıkçası, bu sınıfın% 100 mühürlü olması gereken durumları kapsamıyor.
- Son olarak, bir sınıfı mühürlerken, ara bir kanca olarak bir arabirim sağlayın, böylece müşteri sınıfın kendi değiştirilmiş halini "yeniden yazabilir" ve "mühürlü" sınıfınızın etrafında çalışabilir. Bu şekilde mühürlü sınıfı yerine uygulayabilir. Şimdi, bu açık olmalı, çünkü en basit şekliyle gevşek bağlantı oluşturuyor, ancak yine de söz edilmeye değer.
Aşağıdaki "felsefi" sorusunu bahsetmek fayda var: Bir sınıf olup olmadığını mı sealed
/ final
sınıf veya bir uygulama ayrıntı için sözleşmenin parçası? Şimdi oraya basmak istemiyorum, ancak bunun cevabı bir sınıfı mühürleyip mühürlememe konusundaki kararınızı da etkilemelidir.
Open/Closed principle
, değilClosed Principle.