Varsayılan erişim özel erişim değiştiricisini gereksiz kılmaz.
Bunun üzerine dil tasarımcıları resmi öğreticiye yansıtılır - Bir Sınıfın Üyelerine Erişimi Kontrol Etme ve oldukça açıktır (kolaylık sağlamak için, kalın alıntıdan ilgili ifade ):
Erişim Seviyesi Seçmekle İlgili İpuçları:
Diğer programcılar sınıfınızı kullanıyorsa, yanlış kullanımdan kaynaklanan hataların oluşmamasını sağlamak istersiniz. Erişim seviyeleri bunu yapmanıza yardımcı olabilir.
- Belirli bir üye için anlamlı olan en kısıtlayıcı erişim seviyesini kullanın. Olmaması için iyi bir nedeniniz yoksa, özel kullanın.
- Sabitler dışındaki ortak alanlardan kaçının. (Eğitimdeki örneklerin çoğu ortak alanları kullanır. Bu, bazı noktaları tam olarak göstermeye yardımcı olabilir, ancak üretim kodu için önerilmez.) Genel alanlar, sizi belirli bir uygulamaya bağlama ve kodunuzu değiştirme esnekliğinizi sınırlama eğilimindedir.
Tamamen özel bırakma özelliğinin düşürülmesinin gerekçesi olarak test edilebilirliğe başvurmanız , örneğin TDD’deki Yeni’deki cevaplarda da belirtildiği gibi yanlıştır . Şimdi özel yöntemlerden kaçınmalı mıyım?
Elbette özel yöntemlere sahip olabilirsiniz ve elbette bunları test edebilirsiniz.
Ya orada bazı bu şekilde test edebilirsiniz ya yoktur ki bu durumda vadede özel yöntem almanın yolu, hiçbir çalıştırmak için özel almanın yolu, bu durumda: neden halt sadece, bunu test etmek çalışıyoruz lanet şeyi sil ...
Dil tasarımcılarının paket düzeyinde erişimin amacı ve kullanımı konusundaki konumu, başka bir resmi derste, Paketlerin Oluşturulması ve Kullanılması bölümünde açıklanmıştır ve özel değiştiricileri bırakma fikri ile ortak bir ilgisi yoktur (rahatınız için, teklifinize koyulan ifade ) :
Bu sınıfları ve arayüzü, aşağıdakiler de dahil olmak üzere çeşitli nedenlerle bir pakette paketlemelisiniz:
- Siz ve diğer programcılar bu türlerin birbiriyle ilişkili olduğunu kolayca belirleyebilirsiniz ...
- Paket içindeki türlerin birbirine sınırsız erişime sahip olmasına izin verebilirsiniz ancak paket dışındaki türlerin erişimini kısıtlayabilirsiniz ...
rant "Sanırım yeterince sızlanan duydum. Yüksek sesle ve net söylemenin zamanı geldiğini tahmin ediyorum ...">
Özel yöntemler, birim testlerinde faydalıdır.
Aşağıdaki not, kod kapsamı hakkında bilgi sahibi olduğunuzu varsaymaktadır . Olmazsa, öğrenmek için zaman ayırın, ünite testi ve hiç test yapmak isteyenler için oldukça kullanışlıdır.
Tamam, bu yüzden özel yöntem ve ünite testlerini aldım ve bir boşluk olduğunu söyleyen kapsama analizi, özel yöntemim testlerin kapsamına girmedi. Şimdi ...
Özel tutmaktan ne kazanırım?
Yöntem özel olduğundan, ilerlemenin tek yolu, özel olmayan API üzerinden nasıl kullanıldığını öğrenmek için kodu incelemektir. Tipik olarak, böyle bir çalışma, boşluğun nedeninin testlerde belirli kullanım senaryosunun eksik olduğunu ortaya koymaktadır.
void nonPrivateMethod(boolean condition) {
if (condition) {
privateMethod();
}
// other code...
}
// unit tests don't invoke nonPrivateMethod(true)
// => privateMethod isn't covered.
Tamamlanma açısından, bu kapsama boşluklarının diğer (daha az sıklık) nedenleri, spesifikasyon / tasarımdaki hatalar olabilir. Her şeyi basit tutmak için burada derinlere dalmayacağım; Erişim sınırlamasını "sadece metodu test edilebilir hale getirmek için" zayıflatırsanız, bu hataların var olduğunu öğrenme şansını kaçırırsınız.
Tamam, açığı düzeltmek için eksik senaryo için bir birim testi ekliyorum, kapsam analizini tekrarlıyorum ve aralığın gittiğini doğruladım. Şimdi neyim var? Özel olmayan API'nin özel kullanımı için yeni bir test olarak aldım.
Yeni test, bu kullanım için beklenen davranışın önceden haber verilmeksizin değişmemesini sağlar, çünkü değişirse test başarısız olur.
Bir dış okuyucu bu teste bakabilir ve nasıl kullanması ve davranması gerektiğini öğrenebilir (burada, dış okuyucu, kendimden sonraki bir veya iki ay sonra kodu unutmaya meyilli olduğum için gelecekteki benliğimi içerir).
Yeni test yeniden yapılanmaya toleranslıdır (özel yöntemleri yeniden değerlendirebilir miyim? Bahse girerim!) Ne yaparsam yapayım privateMethod
, her zaman test etmek isteyeceğim nonPrivateMethod(true)
. Ne yaparsam yapayım privateMethod
, testi direkt olarak başlatılmadığı için testi değiştirmeye gerek kalmayacak.
Fena değil? Emin ol.
Zayıflama erişim sınırlandırmasından ne kaybederim?
Şimdi, yukarıdakilerin yerine erişim sınırlandırmasını zayıflattığımı hayal edin. Yöntemi kullanan kodun çalışmasını atladım ve doğrudan benim başlatan teste devam ettim exPrivateMethod
. Harika? Değil!
Yukarıda belirtilen özel olmayan API’nin özel kullanımı için bir test mi kazanıyorum? Hayır: Daha nonPrivateMethod(true)
önce hiçbir test yapılmamıştı ve şimdi böyle bir test yok.
Dışarıdaki okuyucular, sınıfın kullanımını daha iyi anlama şansı elde ediyor mu? Hayır. "- Hey, burada test edilen yöntemin amacı nedir? - Unut gitsin, kesinlikle iç kullanım içindir. - Hata!"
Yeniden düzenlemeye toleranslı mı? Hiçbir şekilde: neyi değiştirirsem değiştireyim exPrivateMethod
, muhtemelen testi kıracak. Yeniden adlandırın, başka bir yönteme birleştirin, argümanları değiştirin ve test derlemeyi bırakacaktır. Baş ağrısı? Emin ol!
Özetle , özel yöntemlere bağlı kalmak bana ünite testlerinde faydalı, güvenilir bir geliştirme getiriyor. Buna karşılık, "test edilebilirlik için" erişim kısıtlamalarının zayıflatılması, bana yalnızca, küçük bir yeniden düzenleme işleminden dolayı kalıcı olarak kırılma riski altında olan, anlaşılması zor bir test kodu parçası; Açıkçası ne alırım şüpheli teknik borç gibi görünüyor .
</ Rant>