Java'da sınıf başına kaç satır çok fazla? [kapalı]


74

Tecrübelerinize göre, Java'daki bir sınıf için kaç satır kodun fazla olması için kullanışlı bir kural nedir?

Açıkçası, belirli bir sınıfta nelerin olması ve neyin olmaması gerektiğine ilişkin olarak kullanılacak satır sayısının gerçek standarda bile yakın olmadığını biliyorum. Sınıflar akılda uygun OOP felsefelerine (kapsülleme vb.) Göre tasarlanmalıdır. Bu, bir kuralın tekrar gözden geçirme ile ilgili düşünceler için yararlı bir başlangıç ​​noktası sağlayabildiğini söyledi (örneğin, "Hmmm, bu sınıf> n kod satırına sahiptir; muhtemelen okunaksızdır ve kötü bir kapsülleme işi yapıyordur; bir noktada refaktör olmak ").

Kapak tarafında, belki de OOP tasarımına hala iyi uyan ve uzunluklarına rağmen okunabilir ve bakımları yapılabilecek çok büyük sınıfların örnekleri ile karşılaştınız mı?

İşte fonksiyon başına satırlar hakkında ilgili, yinelenmeyen bir soru .


4
Bin çizgiden fazla sınıfları gördüm, "çok fazla" diye bir şey olduğunu sanmıyorum.
Mahmoud Hossam

5
Artık derlemediği zaman çok fazla. Cidden, sadece sınıf çok fazla şey yaptığında çok fazla olur.
Berin Loritsch

20
Bir başparmak kuralı, bir anlaşmazlığa dönüşen bir politikaya dönüşen bir maksimuma dönüşür. Uyuşmazlıktan kaçının. Sayma ve ölçme, sorumlulukların doğru bir şekilde tahsis edilip edilmediğini belirlemenin ideal yolu değildir.
S.Lott

7
Bir ip için doğru inç sayısıyla aynıdır.
Matt

6
30 oy, bir soru ~ 24 bin kez, 10 cevap (topluca) ~ 75 oy ile görüntülendi. "öncelikle görüşe dayalı olarak kapandı" Yığın değişimine hoş geldiniz :) SE kültüründe bir
şeylerin

Yanıtlar:


79

Bazı ilginç metrikler:

            Junit fitnesse testiNG tam jdepend karınca tomcat
            ----- -------- ------ --- ------- --- ------
en fazla 500 498 1450 355 668 2168 5457
ortalama 64.0 77.6 62.7 95.3 128.8 215.9 261.6
min 4 6 4 10 20 3 12
sigma 75 76 110 78 129 261 369
90 90 3232 1152 69 55 954 1468
toplam satırlar 5756 49063 72273 6575 7085 206001 384026

FitNesse'yi bir ölçüt olarak kullanıyorum çünkü yazmamla çok ilgim vardı. FitNesse'de ortalama sınıf 77 satır uzunluğundadır. Hiçbiri 498 çizgiden uzun değil. Ve standart sapma 76 satırdır. Bu, sınıfların büyük çoğunluğunun 150 çizgiden az olduğu anlamına gelir. Bir sınıfı 5000'den fazla çizgisi olan Tomcat bile, çoğu 500 çizgiden daha az sınıfa sahiptir.

Bu göz önüne alındığında, 200 satırı, aşağıda kalmak için iyi bir rehber olarak kullanabiliriz.


9
Sınıfın tek bir sorumluluğu varsa, 200-500 çizginin üzerine çıkma ihtimali oldukça zayıf. Diğer ilgili sorumlulukları yerine getirmek için genellikle "iç sınıflara" sahip olanlar . Örneğin, Tomcat 5000+ çizgi sınıfı, bir düzine iç sınıfa sahip gerçekten 1 ana sınıf olabilir. Java'da istek işleyicilerinizin olduğu sıra dışı bir durum değil.
Berin Loritsch

4
bu metrikler nasıl elde edilir? sadece bilmek istiyorum
Sнаđошƒаӽ

1
Genellikle işlevlerine ilişkin bağlantılı soru üzerine bu cevabı doğru daha yalın ediyorum: programmers.stackexchange.com/a/9452/100669 LOC bir şekilde belki haricinde tür alakasız son derece basit öldürürsün merak başlatmak için genel kuralıdır işleri daha da parçalara ayırabilir. Ve iç içe sınıflar konusunda da hemfikirim. Bununla birlikte, 500 muhtemelen genel bir uyarı işaretine daha yakındır.
Panzercrisis,

@ Sнаđошƒаӽ github.com/AlDanial/cloc
firephil

32

Benim için kod satırları bu bağlamda önemli değil. Her şey değişmek için bu sınıfa gelmemdeki farklı sebeplerin sayısıyla ilgili.

Bir Kişiyi doğrulama kurallarını değiştirmek istediğimde bu sınıfa gelirsem, bir Emri doğrulama kurallarını değiştirmek için aynı sınıfa gelmek istemiyorum, ayrıca siparişimi doğrulama kurallarını da değiştirmek istemiyorum. bir insanı ısrar eder.

Bu, eğer bunu hedefliyorsanız, o zaman nadiren 200'den fazla çizgiyi bulacaksınız. Geçerli nedenlerle olacaklar, ancak nadir olacaklar. Eğer bir kırmızı bayraklı metrik arıyorsanız, o zaman başlamak için kötü bir yer değil; ama onu bir kural haline getirin, bir kural değil.


200, çok kaba bir tahmin olarak haklı hissediyor. Söylediğin gibi, ilk önce endişelendiğin şeyi değil.
Steve

Java ile ilgili en önemli şey, LOC'leri sayırken alıcıları / ayarlayıcıları görmezden gelmemdir.
MrFox

1
@ MrFox: Katılıyorum. Sınıfınızda LOC verilerini çarpıtmak için yeterli alıcı ve ayarlayıcı varsa, "bu sınıf çok mu fazla?" soru. Bununla birlikte, bir uzlaşma olarak, NetBean alıcı / ayarlayıcılarına bu tür yöntemlerin sahip olduğu aşırı kazan plakası için 1 çizgiden / çizgiden daha az bir sürede istekli olacağım.
Brian

23

Üzgünüm ama birçok cevabın "gerçekten önemli olmadığını" ifade etmesine çok şaşırdım. Sınıfta kaç tane satır olduğu önemli. Neden? İyi Java kodu yazarken bu ilkeleri göz önünde bulundurun ...

  • Testedilebilirlik
  • birleşme
  • bağlantı
  • anlaşılabilirlik

İçlerinde çok sayıda çizgi bulunan sınıflar büyük olasılıkla tüm bu ilkeleri ihlal edecektir.

“Gerçekten önemli değil” olduğunu söyleyenler için ... içinde 5000'den fazla çizgi bulunan bir sınıfı denemek ve anlamak senin için ne kadar eğlenceli oldu? Veya değiştirmek için? Bunun eğlenceli olduğunu söylersen, acıya karşı garip bir yakınlığın var ...

İçinde 1000'den fazla çizgisi olan herhangi bir sınıfın, en azından yukarıdaki ilkeleri nasıl ihlal ettiği ve muhtemelen birkaç "vurulmayan" sınıfa ayrıştırılabileceği konusunda sorgulanması gerektiğini söyleyebilirim .

Yorumlarım Martin Martin, Joshua Bloch ve Misko Hevery gibi yazarları okumak ve okumaktan kaynaklanıyor. İyi Java kodu yazmak için danışmak için mükemmel kaynaklar.

Bir sonraki adamı (birkaç yıl içinde olabilirsiniz) bir iyilik yapın ve daha fazla satırdan ziyade daha az olan sınıflar yazmaya çalışın.


Herkesin 5000+ olduğunu kabul eder düşünüyorum değil , genel olarak (iç içe sınıflar hariç) iyi bir işaret, ancak asıl sorun daha bir yan etki ya da bir şey daha var gibi onlar hissediyorum. Elbette, bazı insanlar aşırı derecede ayrıntılıdır ve sadece değişkenleri bildirmek ve başlatmak için aşırı sayıda satır kullanırlar - ve bunu durdurmaları gerekir. Yani gelmez daha az okunabilir hale. Fakat eğer sınıf yapısıyla ilgiliyse, sorun LOC'nin kendisi değildir; Birinin sadece işleri başlatmak için çok iyi ayrılmadığı ve LOC da bunun bir yan etkisi olduğu gerçeğidir.
Panzercrisis

2
Mesele şu ki, bir sınıfın yüksek uyumu ve açık bir sorumluluğu olması gerektiği, yani sınıfların genellikle bu kadar büyük olmadığı anlamına gelir. Fakat eğer bir sınıf iyi tasarlanmışsa, ancak 5000'den fazla kod satırı varsa, hiç kimsenin onu daha küçük, sıkı bağlanmış sınıflara bölmesine yardımcı olmaz.
JacquesB

12

Karmaşıklığa bağlıdır, satır sayısına değil. Anlaşılması kolay ve kesin olarak bir şeyi yapan ve iyi yapan büyük aptal rutinler yazdım, ancak yüzlerce satır devam etti. Anlaşılması zor olan (ve hata ayıklama) oldukça kısa fonksiyonlar yazdım.

Bakabileceğiniz başka bir şey, bir sınıftaki genel fonksiyonların sayısıdır. Bu da bir uyarı işareti olabilir.

Elimde iyi sayımlar yok, ancak dükkanınızda yararlı şeyler yapan makul bir koda bakmanızı ve bundan yararlanmanızı öneririm. Kesinlikle en uzun sınıflara ve en büyük API'lara bakmalısınız.


7
+1: Çizgiler gibi aptal şeyleri ölçmeyin. Siklomatik Karmaşıklık ve Özellik Sayısı (yöntem sayısı) çizgileri daha iyi ifade eder.
S.Lott

2
Evet ve hayır. Aşırı sayıda çizgi, genellikle kötü tasarımın bir belirtisidir ve bu nedenle sınıfın yeniden yapılandırılması gereken bir kırmızı bayraktır.
10'da

1
@jwenting Evet, ben de öyle oluyordum. Çok fazla satır biliyorum!
Michael McGowan

5

Sınıf çok farklı şeyler yapıyorsa çok fazla kod satırı vardır. Temel olarak, sınıflar için Tek Sorumluluk ilkesini izlerseniz, sınıfın ne kadar büyüyeceği konusunda bir sınır vardır.

Fiziksel sınırlamalara gelince (kaynak: Java5 sınıfı dosya formatı ):

  • 65,536 sabit, uygulanan arabirimler, alanlar, yöntemler ve özellikler. NOT: diğer öğelerden herhangi biri bitmeden önce sabit alanınız tükenir. NOT 2: nitelikler sınıf dosya yapılarıdır - '@ Öznitelik' işaretleri ile karıştırılmamalıdır (örn. Hata ayıklama bilgisi ve bayt kodu, bir yöntem için ayrı özellikler olarak saklanır).
  • Her yöntem 4 GB (32 bit) oluşturulan bayt kodu olabilir. NOT: 1.5'ten önceki Java sürümlerinde her yöntem için yalnızca 64 KB (16 bit) oluşturulan bayt kodu bulunabilir.

Kısacası, sınıf dosyası, herkesin yararlı olabileceğinden çok daha büyük olabilir . Tek sorumluluk ilkesine sadık kalırsanız, sınıf dosyalarınız doğru boyutta olacaktır.


1
Tekil sorumluluk için +1 :) @Berin bunu kesinlikle yazılımınıza uyguluyor musunuz?
Aditya P,

Evet. İşin püf noktası sorumlulukları mantıklı bir şekilde bölmektir.
Berin Loritsch

ah, eski 64KB sınırı. JSP'lerin çok karmaşık olup olmadığını görmek için güzel bir lithmus testi, tüm statik
html'leriniz

Java 5'ten itibaren 4GB'a çıkardılar. Orada şimdi endişelenme.
Berin Loritsch

5

Doğru cevap 42'dir. Sadece şaka.
Aslında, sınıf başına önerilen maksimum satır 2000 satırdır.

1999'dan beri "Java Code Conventions" bu şekilde belirtti:
2000 satırdan daha uzun dosyalar kullanışsız ve bundan kaçınılmalıdır.

Java'nın icat edilmesinden bu yana Sun / Oracle Kodlama kurallarına uyduktan sonra, bu kural kuralını sınıf başına satır başına makul buldum. Java Kodunuzun% 99'una uymalıdır ... Ve 2000'den fazla olursa, sadece sınıfın çalışması gerektiğini söyleyen TODO'yu koyun.

En kötüsü, programcıların her sınıfta neredeyse hiç işlevselliği olmayan çok küçük küçük sınıflar oluşturması durumunun tam tersidir. "Favoriye Kompozisyon" un önerisini görmezden gelen programcılar, büyük sınıf probleminden (en azından genellikle ilgili sınıf adıyla işlevselliği koruyan) karmaşık nesneler modelleri oluşturan yüzlerce kalıtım dersi yaratırlar.

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#3043


Aslında çoğu yorum yapıldı @LluisMartinez
Xtreme Biker

Ben 2000 ile kesinlikle katılmıyorum . Bir sınıf, yorumlar hariç 200 satırdan daha uzun olamaz .
Nikolas

4

Temiz Kod:

Sınıflar Küçük Olmalı!

Sınıfların ilk kuralı, küçük olmaları gerektiğidir. İkinci sınıf kuralı, bundan daha küçük olmalarıdır. Hayır, aynı metni İşlevler bölümünden tekrarlamayacağız. Fakat fonksiyonlarda olduğu gibi, sınıf tasarlama söz konusu olduğunda birincil kural daha küçüktür. Fonksiyonlarda olduğu gibi, acil sorumuz her zaman “Ne kadar küçük?”

** Fonksiyonlarla fiziksel çizgileri sayarak boyut ölçtük. Sınıflarda farklı bir ölçü kullanıyoruz. Sorumlulukları sayarız. **

Bir sınıfın adı, hangi sorumlulukları yerine getirdiğini tanımlamalıdır. Aslında, adlandırma muhtemelen sınıf boyutunu belirlemeye yardımcı olmanın ilk yoludur. Bir sınıf için özlü bir ad elde edemezsek, o zaman muhtemelen çok büyüktür. Sınıf ismi ne kadar belirsiz olursa, o kadar fazla sorumluluğu vardır. Örneğin, İşlemci veya Yönetici veya Süper gibi gelincik kelimeleri içeren sınıf isimleri, sorumlulukların talihsiz şekilde toplanmasına sık sık işaret eder.

Sonra:

  • Sadece yöntemlerinin tek bir şey yaptığından emin ol.
  • O zaman sınıfın çok fazla sorumluluğu bulunmadığından emin olun.

Yönetilebilir boyutta bir sınıfla biteceksiniz.


eğer Clean CodeCevabınız üstünde (! öyle), Robert C. Martin kitaba atıfta o zaman seni söylemek zorunda ve ben ortak içinde var; Bu kitap beni bu soruya yönlendirdi. Bence bu cevap her
şeyi

2

Satır sayısı, sınıf kalitesi için oldukça zayıf bir ölçümdür. Benim için, halka açık yöntemlere ve diğer kamuya açık mülklere (sanırım Java’daki alıcılar / alıcılar) düşünüyorum. Dikkatimi çekebileceği bir zaman için havadan bir numara çekmem gerekirse, her biri 10'dan fazla olduğunda diyebilirim. Gerçekten, özelliklerinden veya yöntemlerinden 5'inden fazlası varsa, bir göz atacağım ve sık sık yeniden ateşlemenin yollarını bulacağım, ancak 10'un üzerindeki herhangi bir şey genellikle bir şeyin kötü bir şekilde ortaya çıkmasının oldukça muhtemel olduğuna dair bir uyarı işaretidir.

Tamamen başka bir sohbeti, ancak özel yöntemler ve alanlar benim için daha az kokuyor, bu yüzden satır sayısına çok fazla katkıda bulunuyorlarsa, o zaman endişeli olmayabilirim. En azından, muhtemelen nesneyi uzaktan idare eden bazı Tanrı denetleyicilerinin olmadığını, ki bunun oldukça problemli bir tasarım problemi olduğunu gösteriyor.


2

Daha iyi bir ölçüm kullanmayı deneyin.

Bir örnek ABC Metriktir . Kod tarafından ne kadar iş yapıldığının bir ölçüsü, kodun ne kadar olduğundan daha fazla.


1

Sınıfınızın problem alanı içinde sınıf dışında yazılı olan herhangi bir satır, bir satır çok az ve bir sınıfın yaşadığı sınıfta çok fazladır. Bir sınıfı bir konu olarak düşünün. Onu örtmek zorundasın. Mümkün olduğunca net bir şekilde idealdir, ancak 500 satır alırsa, 500 satır alır. Bu satırlardan 100 tanesi başka bir konuyu kapsıyorsa, başka bir yere aittir. İç sınıf olarak sınıf içinde daha küçük alt alanlara ayrılmak mantıklı ama ben başka yerlerde kullanırlarsa sınıfın dışındakileri tanımlarım.

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.