2012-05-09 17 views
5

yöntemindeki son ifade olmalıdır, bazen birkaç PMD kuralının birbiriyle çakıştığını, dolayısıyla tüm PMD kurallarına uygun kod yazamayacağınızı buldum. . ÖrneğinPMD kuralları çakışması: Bir yöntemde yalnızca bir çıkış noktası olmalı ve bu yöntemde

, aşağıdaki iki kural birbirleriyle dışlamak görünüyor: "null bir nesne atama kod koku nedir üstlenmeden düşünün." ve "bir yöntem yalnızca bir çıkış noktasına sahip olmalı ve bu yöntemde son deyimi olmalıdır" Aşağıdaki

benim kod örneği:

enter image description here

Ben get1 kullanırsanız() , Eski kuralı ihlal edeceğim ve eğer get2() kullanırsam, o zaman ikinci kuralı ihlal edeceğim. Bir yöntemin yalnızca bir çıkış noktası olması gerektiğini tercih ediyorum, ancak PMD'nin "Bir Nesneyi null olarak atama neyin bir kod kokusu olduğunu" söylemesini istemiyorum, herhangi birinin iyi bir fikri var mı? gerçi bir çıkış noktasına sopa çalışmayın

return condition > 5 ? Integer.valueof(123) : null; 

Şahsen yapmak : Çok teşekkürler :) Bu vakaların ikisinde de

cevap

7

, ben koşullu operatörü kullanmayı tercih ediyorum. Bu kod daha az kodu okunabilir hale geldiğinde çok fazla zaman vardır - çoğu zaman yöntemin başlangıcında dönüş değerinin ne olması gerektiğini anlatabilirsiniz (örneğin temel bir durum olduğundan). o? Dogmatik bir şekilde "sadece bir çıkış noktası" na yapışan kod tipik olarak gereksiz yere iç içe geçmiş kodlarla sonuçlanır ve bu da daha sonra oradan geçilmesi daha zordur.

return (condition > 5) ? Integer.valueOf(123) : null; 

Ama bu da "kod koku" ise bilmiyorum Kullanımı

+0

Uzun bir süredir C kodu yazdığım için, bir fonksiyonun bir çıkış noktasına sahip olmasına izin verirdim.Şimdi Cevabınızdan kodu daha az okunabilir hale getireceğine katılıyorum. Kuralı devre dışı bırakmak için PMD'nin "OnlyOneReturn" seçeneğini kapatırım. – soulmachine

+1

@soulmachine: Çöp toplama ve istisnaların karışımı gerçekten de uygun olanı değiştiriyor :) –

+0

Çok teşekkürler: D – soulmachine

1

...

+0

PMD raporları "Nesnenin null olarak atanması null bir kod kokusu. Refactoring'i düşünün." – soulmachine

+0

Elbette :) ama burada bir "geri dönüş" ifadesi var, bir ödev değil;) Açıkçası, eğer 'Object obj = get2();' gibi bir şey yaparsanız, 'bu bir' kod kokusu 'olurdu ... ama bu değil sorunuzun konusu. Her durumda, Jon Skeet'in size verdiği cevap oldukça eksiksiz ve örnek tam olarak aynı. :) – javatutorial

+0

Çok teşekkürler: D – soulmachine

1

:) Sadece ilk yöntemi (get1) için başka kaldırın. Java nesnelerinde varsayılan olarak boş, bu atama (sonuç = null) gerekli değildir.

İlgili konular