Berapa banyak baris per kelas yang terlalu banyak di Jawa? [Tutup]

74

Dalam pengalaman Anda, apa aturan praktis yang berguna untuk berapa banyak baris kode yang terlalu banyak untuk satu kelas di Jawa?

Untuk menjadi jelas, saya tahu bahwa jumlah baris bahkan tidak dekat dengan standar nyata untuk digunakan untuk apa yang seharusnya ada di kelas tertentu dan apa yang tidak boleh. Kelas harus dirancang sesuai dengan filosofi OOP yang tepat (enkapsulasi, dll.) Dalam pikiran. Yang mengatakan, aturan praktis dapat memberikan titik awal yang berguna untuk pertimbangan refactoring (yaitu "Hmmm, kelas ini memiliki> n baris kode; mungkin tidak dapat dibaca dan melakukan pekerjaan enkapsulasi yang buruk, jadi saya mungkin ingin melihat apakah harus refactored di beberapa titik ").

Di sisi lain, mungkin Anda pernah menemukan contoh kelas yang sangat besar yang masih mematuhi desain OOP dengan baik dan dapat dibaca dan dirawat meskipun panjangnya?

Inilah pertanyaan terkait, non-duplikat tentang baris per fungsi .

Michael McGowan
sumber
4
Saya telah melihat kelas dengan lebih dari seribu baris, saya tidak berpikir ada yang namanya "terlalu banyak".
Mahmoud Hossam
5
Terlalu banyak jika tidak dapat dikompilasi lagi. Serius, ini terlalu banyak ketika kelas melakukan terlalu banyak hal yang berbeda.
Berin Loritsch
20
Aturan praktis berubah menjadi maksimum yang berubah menjadi kebijakan yang berubah menjadi perselisihan. Hindari berhitung. Menghitung dan mengukur bukanlah cara yang ideal untuk menetapkan apakah tanggung jawab dialokasikan dengan benar.
S.Lott
7
Hampir sama dengan jumlah inci yang benar untuk seutas tali.
Matt
6
Sebuah pertanyaan dengan 30 suara, dilihat ~ 24rb kali, 10 jawaban dengan (secara kolektif) ~ 75 suara. "ditutup sebagai terutama berbasis opini" Selamat datang di stack exchange :) Sesuatu perlu diubah dalam budaya SE ...
jb.

Jawaban:

79

Beberapa metrik yang menarik:

            junit fitnesse testNG dan jdepend semut kucing jantan
            ----- -------- ------ --- ------- --- ------
maks 500 498 1450 355 668 2168 5457
berarti 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
file 90 632 1152 69 55 954 1468
total baris 5756 49063 72273 6575 7085 206001 384026

Saya menggunakan FitNesse sebagai patokan karena saya punya banyak hubungannya dengan menulisnya. Di FitNesse kelas rata-rata adalah 77 baris. Tidak ada yang lebih panjang dari 498 baris. Dan standar deviasi adalah 76 baris. Itu berarti bahwa sebagian besar kelas kurang dari 150 baris. Bahkan Tomcat, yang memiliki satu kelas lebih dari 5000 baris, memiliki sebagian besar kelas kurang dari 500 baris.

Mengingat ini, kita mungkin dapat menggunakan 200 baris sebagai pedoman yang baik untuk tetap di bawah.

Paman Bob.
sumber
9
Jika kelas hanya memiliki satu tanggung jawab, peluangnya untuk berada di atas 200-500 garis cukup tipis. Yang biasanya memiliki "kelas dalam" untuk menangani tanggung jawab terkait lainnya . Misalnya, kelas garis Tomcat 5000+ mungkin benar-benar 1 kelas utama dengan selusin kelas batin. Itu tidak biasa di Jawa di mana Anda memiliki penangan permintaan dan semacamnya.
Berin Loritsch
4
bagaimana cara mendapatkan metrik ini? just want to know
Sнаđошƒаӽ
1
Saya biasanya lebih condong ke jawaban ini pada pertanyaan terkait dengan fungsi: programmers.stackexchange.com/a/9452/100669 LOC agak tidak relevan, kecuali mungkin aturan praktis yang sangat umum untuk mulai bertanya-tanya apakah Anda mungkin dapat memecah hal-hal lebih lanjut. Dan saya setuju tentang hal kelas bersarang. Meskipun demikian, 500 mungkin lebih dekat dengan tanda peringatan umum.
Panzercrisis
@ Sнаđошƒаӽ github.com/AlDanial/cloc
firephil
32

Bagi saya, baris kode tidak relevan dalam konteks ini. Ini semua tentang sejumlah alasan berbeda saya akan datang ke kelas ini untuk mengubahnya.

Jika saya datang ke kelas ini ketika saya ingin mengubah aturan untuk memvalidasi Seseorang, saya tidak ingin datang ke kelas yang sama untuk mengubah aturan untuk memvalidasi suatu Pesanan, saya juga tidak ingin datang ke sini untuk mengubah tempat saya bertahanlah Seseorang.

Yang mengatakan, jika Anda bertujuan untuk itu maka Anda akan jarang menemukan kelas lebih dari 200 baris. Mereka akan terjadi, untuk alasan yang sah, tetapi mereka akan jarang. Jadi jika Anda mencari metrik bendera merah maka itu bukan tempat yang buruk untuk memulai; tapi jadikan itu pedoman, bukan aturan.

pdr
sumber
200 terasa benar sebagai tebakan yang sangat kasar. Seperti yang Anda katakan, bukan hal yang Anda khawatirkan dulu.
Steve
Hal terbaik tentang Jawa adalah, ketika menghitung LOC saya akan mengabaikan getter / setter.
MrFox
1
@ MrFox: Saya tidak setuju. Jika kelas Anda memiliki cukup getter dan setter untuk membelokkan data LOC, yang diperhitungkan dalam "apakah kelas ini melakukan terlalu banyak?" pertanyaan. Namun, sebagai kompromi saya akan bersedia NetBean pengambil / setter di kurang dari 1 baris / garis karena rasa hormat terhadap boiler-piring berlebihan metode seperti yang dimiliki.
Brian
23

Saya minta maaf tetapi saya sangat terkejut bahwa banyak jawaban menyatakan bahwa "tidak terlalu penting". Sangat penting, berapa banyak garis yang ada di kelas. Mengapa? Pertimbangkan prinsip-prinsip ini dalam menulis kode Java yang baik ...

  • Testabilitas
  • Kohesi
  • Kopel
  • Dapat dimengerti

Kelas dengan banyak garis di dalamnya kemungkinan besar akan melanggar semua prinsip-prinsip itu.

Bagi mereka yang telah menyatakannya "tidak terlalu penting" ... betapa menyenangkannya bagi Anda untuk mencoba dan memahami kelas yang memiliki lebih dari 5000 baris di dalamnya? Atau, untuk memodifikasinya? Jika Anda mengatakan itu menyenangkan, Anda memiliki afinitas aneh terhadap rasa sakit ...

Saya akan mengatakan setiap kelas yang memiliki lebih dari 1000 baris di dalamnya setidaknya harus dipertanyakan bagaimana mereka mungkin melanggar prinsip-prinsip di atas dan mungkin diurai menjadi beberapa kelas "off-shoot".

Komentar saya didasarkan pada membaca dan mempelajari penulis seperti Martin Fowler, Joshua Bloch dan Misko Hevery. Mereka adalah sumber yang bagus untuk berkonsultasi untuk menulis kode Java yang baik.

Apakah orang berikutnya (yang mungkin Anda dalam beberapa tahun) mendukung dan berusaha untuk menulis kelas yang memiliki lebih sedikit daripada lebih banyak baris di dalamnya.

Zack Macomber
sumber
Saya pikir semua orang setuju bahwa 5000+ pada umumnya bukan pertanda baik (tidak termasuk kelas bertingkat), tetapi mereka merasa itu lebih merupakan efek samping atau sesuatu daripada masalah yang sebenarnya. Tentu saja, beberapa orang terlalu bertele-tele dan menggunakan jumlah baris yang berlebihan hanya untuk mendeklarasikan dan menginisialisasi variabel dan semacamnya - dan mereka harus menghentikannya. Itu tidak membuatnya lebih mudah dibaca. Tetapi jika itu berkaitan dengan struktur kelas, masalahnya bukan pada LOC itu sendiri; itu adalah fakta bahwa seseorang tidak memecahkan masalah dengan baik sejak awal, dan LOC adalah efek samping dari itu.
Panzercrisis
2
Intinya adalah bahwa kelas harus memiliki kohesi yang tinggi dan tanggung jawab yang jelas, yang berarti kelas biasanya tidak tumbuh begitu besar. Tetapi JIKA sebuah kelas dirancang dengan baik tetapi masih memiliki lebih dari 5000 baris kode, itu tidak membantu siapa pun untuk membaginya menjadi beberapa kelas yang lebih kecil.
JacquesB
12

Itu tergantung pada kompleksitas, bukan jumlah garis. Saya telah menulis rutinitas bisu besar yang mudah dimengerti dan yang melakukan satu hal dengan tepat dan melakukannya dengan baik, tetapi berlanjut hingga ratusan baris. Saya telah menulis fungsi yang cukup singkat yang sulit dimengerti (dan debug).

Hal lain yang bisa Anda lihat adalah jumlah fungsi publik di kelas. Itu juga bisa menjadi tanda peringatan.

Saya tidak memiliki perhitungan yang baik, tetapi saya sarankan melihat beberapa kode yang layak yang melakukan hal-hal berguna di toko Anda, dan mendasarkannya pada hal itu. Tentu saja Anda harus melihat kelas terpanjang dan API terbesar.

David Thornley
sumber
7
+1: Jangan mengukur hal-hal bodoh seperti garis. Kompleksitas Siklus dan Hitungan Fitur (jumlah metode) membuat garis lebih masuk akal.
S.Lott
2
iya dan tidak. Jumlah garis yang berlebihan seringkali merupakan gejala dari desain yang buruk, dan dengan demikian merupakan bendera merah yang mungkin perlu dilakukan kelas ulang.
jwenting
1
@jwenting Ya, itulah yang saya maksudkan. Saya tahu banyak baris! = Perlu di refactored, tetapi hampir semua kelas yang saya kerjakan benar-benar perlu di refactored karena desain yang buruk memiliki banyak baris.
Michael McGowan
5

Ada terlalu banyak baris kode jika kelas melakukan terlalu banyak hal berbeda. Pada dasarnya, jika Anda mengikuti prinsip Tanggung Jawab Tunggal untuk kelas, ada batas seberapa besar kelas akan tumbuh.

Mengenai batasan fisik yang dapat Anda miliki (sumber: Format file kelas Java5 ):

  • 65.536 konstanta, antarmuka yang diterapkan, bidang, metode, dan atribut - masing-masing. CATATAN: Anda akan kehabisan ruang konstan sebelum Anda kehabisan setiap item lainnya. CATATAN 2: atribut adalah konstruk file kelas - jangan disamakan dengan marker '@Attribute' (mis. Info debug dan kode byte disimpan sebagai atribut terpisah untuk suatu metode).
  • Setiap metode dapat 4GB (32 bit) dari kode byte yang dihasilkan. CATATAN: Versi Java sebelum 1.5 hanya dapat memiliki 64KB (16 bit) kode byte yang dihasilkan untuk setiap metode.

Singkatnya, file kelas bisa jauh lebih besar daripada yang dianggap berguna oleh siapa pun . Jika Anda tetap berpegang pada prinsip tanggung jawab tunggal, file kelas Anda akan berukuran tepat.

Berin Loritsch
sumber
1
+1 untuk satu tanggung jawab :) @Berin apakah Anda menerapkan ini secara ketat pada perangkat lunak Anda?
Aditya P
Iya. Caranya adalah dengan membagi tanggung jawab dengan cara yang masuk akal.
Berin Loritsch
ah, batas 64KB lama yang bagus. Tes lithmus yang bagus untuk melihat apakah JSP Anda terlalu kompleks, karena diterjemahkan ke dalam metode tunggal dengan banyak pernyataan println untuk semua html statis Anda :)
jwenting
Pada Java 5, mereka telah meningkatkannya menjadi 4GB. Jangan khawatir di sana sekarang.
Berin Loritsch
5

Jawaban yang benar adalah 42. Hanya bercanda.
Sebenarnya, garis maksimum yang disarankan per kelas adalah 2000 baris.

"Konvensi Kode Java" sejak 1999 telah menyatakannya seperti ini:
File yang lebih panjang dari 2000 baris rumit dan harus dihindari.

Setelah mengikuti konvensi Sun / Oracle Coding sejak Java ditemukan, saya telah menemukan aturan praktis pada baris per kelas menjadi masuk akal. 99% dari Kode Java Anda harus sesuai ... Dan jika lebih dari 2000, cukup masukkan TODO di bagian atas yang mengatakan bahwa kelas perlu dikerjakan.

Yang terburuk adalah kasus sebaliknya ketika programmer membuat terlalu banyak kelas kecil dengan hampir tidak ada fungsi nyata di setiap kelas. Mengabaikan saran untuk "Favor Composition", programmer membuat ratusan kelas turunan yang membuat model objek rumit yang jauh lebih buruk daripada masalah kelas besar (yang setidaknya biasanya menjaga fungsionalitas dengan nama kelas yang relevan).

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

pengguna1865223
sumber
Sebenarnya, kebanyakan dari mereka adalah komentar @LluisMartinez
Xtreme Biker
Saya sangat tidak setuju dengan 2000 . Kelas tidak boleh lebih dari 200 baris tidak termasuk komentar.
Nikolas
4

Kode Bersih:

Kelas Harus Kecil!

Aturan kelas yang pertama adalah bahwa mereka harus kecil. Aturan kelas yang kedua adalah bahwa mereka harus lebih kecil dari itu. Tidak, kami tidak akan mengulangi teks yang sama persis dari bab Fungsi. Tetapi seperti halnya fungsi, yang lebih kecil adalah aturan utama dalam mendesain kelas. Seperti halnya fungsi, pertanyaan langsung kami selalu "Seberapa kecil?"

** Dengan fungsi, kami mengukur ukuran dengan menghitung garis fisik. Dengan kelas kami menggunakan ukuran yang berbeda. Kami menghitung tanggung jawab. **

Nama kelas harus menggambarkan tanggung jawab apa yang dipenuhinya. Bahkan, penamaan mungkin merupakan cara pertama untuk membantu menentukan ukuran kelas. Jika kita tidak bisa mendapatkan nama ringkas untuk suatu kelas, maka kemungkinan besar itu terlalu besar. Semakin jelas nama kelas, semakin besar kemungkinan tanggung jawabnya terlalu banyak. Misalnya, nama kelas termasuk kata musang seperti Processor atau Manager atau Super sering mengisyaratkan agregasi tanggung jawab yang disayangkan.

Kemudian:

  • Pastikan metode Anda hanya melakukan satu hal.
  • Kemudian pastikan kelas tidak memiliki terlalu banyak tanggung jawab.

Anda akan berakhir dengan kelas dengan ukuran yang dapat dikelola.

Tulains Córdova
sumber
jika Clean Codedi atas jawaban Anda merujuk pada buku karya Robert C. Martin (yang memang benar!), maka saya harus mengatakan Anda dan saya memiliki kesamaan; buku itulah yang mendorong saya ke pertanyaan ini. Saya pikir jawaban ini mengatakan semuanya
Sнаđошƒаӽ
2

Jumlah garis adalah metrik yang cukup buruk untuk kualitas kelas. Bagi saya, saya suka melihat (seperti yang orang lain sebutkan) pada metode publik, serta properti terbuka untuk umum (saya kira getter / setter publik di Jawa). Jika saya harus menarik nomor keluar dari udara ketika mungkin menarik perhatian saya, saya akan mengatakan ketika ada lebih dari 10 masing-masing. Sungguh, jika lebih dari sekitar 5 properti atau metode, saya akan melihat dan sering menemukan cara untuk refactor, tetapi apa pun di atas 10 biasanya merupakan tanda peringatan bahwa ada sesuatu yang kemungkinan besar terpapar dengan buruk.

Ini percakapan lain sepenuhnya, tetapi metode pribadi dan bidang kurang dari bau untuk saya, jadi jika mereka berkontribusi banyak pada jumlah baris, maka saya mungkin tidak khawatir. Paling tidak, itu menunjukkan bahwa mungkin tidak ada beberapa pengontrol Tuhan memanipulasi objek dari jauh, yang merupakan masalah desain masalah yang cukup.

Morgan Herlocker
sumber
2

Coba gunakan metrik yang lebih baik.

Salah satu contoh adalah Metrik ABC . Ini lebih merupakan ukuran seberapa banyak pekerjaan yang dilakukan oleh kode daripada berapa banyak kode yang ada.

sylvanaar
sumber
1

Setiap baris yang termasuk dalam domain masalah kelas Anda yang ditulis di luar kelas adalah satu baris terlalu sedikit dan satu terlalu banyak di kelas tempat kelas itu tinggal. Pikirkan kelas sebagai topik. Anda harus menutupinya. Sesingkat mungkin ideal tetapi jika dibutuhkan 500 garis, dibutuhkan 500 garis. Jika 100 dari baris tersebut membahas topik lain, mereka termasuk di tempat lain. Membagi subdomain yang lebih kecil di dalam kelas sebagai kelas interior masuk akal tetapi saya hanya akan mendefinisikan mereka di luar kelas jika mereka menggunakan di tempat lain.

Erik Reppen
sumber