Có bao nhiêu dòng trên mỗi lớp là quá nhiều trong Java? [đóng cửa]


74

Theo kinh nghiệm của bạn, quy tắc hữu ích nào cho bao nhiêu dòng mã là quá nhiều cho một lớp trong Java?

Để rõ ràng, tôi biết rằng số lượng dòng thậm chí không gần với tiêu chuẩn thực sự để sử dụng cho những gì nên có trong một lớp cụ thể và những gì không nên. Các lớp học nên được thiết kế theo các triết lý OOP thích hợp (đóng gói, v.v.) trong tâm trí. Điều đó nói rằng, một quy tắc ngón tay cái có thể cung cấp một điểm khởi đầu hữu ích cho việc tái cấu trúc các cân nhắc (ví dụ: "Hmmm, lớp này có> n dòng mã; có lẽ không thể đọc được và thực hiện một công việc đóng gói tệ hại, vì vậy tôi có thể muốn xem liệu nó có nên không được tái cấu trúc tại một số điểm ").

Mặt khác, có lẽ bạn đã gặp các ví dụ về các lớp rất lớn vẫn tuân thủ tốt thiết kế OOP và có thể đọc và duy trì được mặc dù chiều dài của chúng?

Đây là một câu hỏi không trùng lặp về các dòng trên mỗi hàm .


4
Tôi đã thấy các lớp học với hơn một nghìn dòng, tôi không nghĩ có những thứ như "quá nhiều".
Mahmoud Hossam

5
Đó là quá nhiều khi nó sẽ không biên dịch nữa. Nghiêm túc mà nói, nó chỉ quá nhiều khi lớp học làm quá nhiều thứ khác nhau.
Berin Loritsch

20
Một quy tắc ngón tay cái biến thành tối đa biến thành chính sách biến thành bất đồng. Tránh số lượng. Đếm và đo lường không phải là cách lý tưởng để thiết lập nếu trách nhiệm được phân bổ hợp lý.
S.Lott

7
Về giống như số inch chính xác cho một đoạn dây.
Matt

6
Một câu hỏi với 30 phiếu, được xem ~ 24 nghìn lần, 10 câu trả lời với (gọi chung) ~ 75 phiếu. "Đóng như chủ yếu dựa trên quan điểm" Chào mừng bạn đến với trao đổi ngăn xếp :) Một cái gì đó cần thay đổi trong văn hóa SE ...
jb.

Câu trả lời:


79

Một số số liệu thú vị:

            Junit fitnesse testNG tam jdepend ant tomcat
            ----- -------- ------ --- ------- --- ------
tối đa 500 498 1450 355 668 2168 5457
trung bình 64,0 77,6 62,7 95,3 128,8 215,9 261,6
tối thiểu 4 6 4 10 20 3 12
sigma 75 76 110 78 129 261 369
tệp 90 632 1152 69 55 954 1468
tổng số dòng 5756 49063 72273 6575 7085 206001 384026

Tôi sử dụng FitNesse làm điểm chuẩn vì tôi có nhiều việc phải làm khi viết nó. Trong FitNesse, lớp trung bình dài 77 dòng. Không có dòng nào dài hơn 498 dòng. Và độ lệch chuẩn là 76 dòng. Điều đó có nghĩa là phần lớn các lớp dưới 150 dòng. Ngay cả Tomcat, có một lớp vượt quá 5000 dòng, có hầu hết các lớp dưới 500 dòng.

Vì điều này có lẽ chúng ta có thể sử dụng 200 dòng như một hướng dẫn tốt để ở bên dưới.


9
Nếu lớp chỉ có một trách nhiệm, cơ hội của nó vượt quá 200-500 dòng là khá mong manh. Những người thường có "lớp bên trong" để xử lý các trách nhiệm liên quan khác . Ví dụ, lớp dòng Tomcat 5000+ có thể thực sự là 1 lớp chính với hàng tá lớp bên trong. Điều đó không có gì lạ ở Java khi bạn có các trình xử lý yêu cầu và như vậy.
Berin Loritsch

4
Làm thế nào là những số liệu thu được, thực sự? chỉ muốn biết
Sнаđошƒаӽ

1
Tôi thường muốn nạc hơn đối với câu trả lời này về vấn đề liên quan đến chức năng: programmers.stackexchange.com/a/9452/100669 LỘC là loại không liên quan, trừ trường hợp có thể là một cực kỳ quy luật chung của ngón tay cái để chỉ bắt đầu tự hỏi nếu bạn có thể có thể phá vỡ mọi thứ hơn nữa. Và tôi đồng ý về điều lớp học lồng nhau. Tuy nhiên, 500 có lẽ gần với một dấu hiệu cảnh báo chung.
Panzercrisis

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

32

Đối với tôi, các dòng mã là không liên quan trong bối cảnh này. Đó là tất cả về số lượng lý do khác nhau mà tôi sẽ đến lớp này để thay đổi nó.

Nếu tôi đến lớp này khi tôi muốn thay đổi quy tắc xác thực một Người, tôi không muốn đến cùng một lớp để thay đổi quy tắc xác thực Đơn hàng, tôi cũng không muốn đến đây để thay đổi nơi tôi kiên trì một người.

Điều đó nói rằng, nếu bạn nhắm đến điều đó thì bạn sẽ hiếm khi tìm thấy các lớp hơn 200 dòng. Chúng sẽ xảy ra, vì những lý do hợp lệ, nhưng chúng sẽ rất hiếm. Vì vậy, nếu bạn đang tìm kiếm một số liệu cờ đỏ thì đó không phải là một nơi tồi tệ để bắt đầu; nhưng làm cho nó một hướng dẫn, không phải là một quy tắc.


200 cảm thấy đúng như một phỏng đoán rất thô. Giống như bạn nói, không phải là điều bạn lo lắng đầu tiên mặc dù.
Steve

Điều thú vị về Java là, khi đếm LỘC, tôi sẽ bỏ qua các getters / setters.
MrFox

1
@MrFox: Tôi không đồng ý. Nếu lớp của bạn có đủ getters và setters để làm lệch dữ liệu LỘC, thì điều đó sẽ được tính vào "lớp này có làm quá nhiều không?" câu hỏi Tuy nhiên, như một sự thỏa hiệp, tôi sẵn sàng nhận / bộ thu NetBean ở mức dưới 1 dòng / dòng so với các nồi hơi quá mức mà các phương thức như vậy có.
Brian

23

Tôi xin lỗi nhưng tôi rất ngạc nhiên khi nhiều câu trả lời nói rằng nó "không thực sự quan trọng". Nó rất RẤT NHIỀU vấn đề có bao nhiêu dòng trong một lớp. Tại sao? Hãy xem xét các nguyên tắc này khi viết mã Java tốt ...

  • Khả năng kiểm tra
  • Sự gắn kết
  • Khớp nối
  • Hiểu được

Các lớp học có rất nhiều dòng trong đó rất có thể sẽ vi phạm tất cả các nguyên tắc đó.

Đối với những người đã tuyên bố rằng "không thực sự quan trọng" ... bạn đã có bao nhiêu niềm vui để thử và hiểu một lớp có hơn 5000 dòng trong đó? Hoặc, để sửa đổi nó? Nếu bạn nói đó là niềm vui, bạn đã có một mối quan hệ kỳ lạ đối với nỗi đau ...

Tôi muốn nói rằng bất kỳ lớp nào có nhiều hơn 1000 dòng trong đó ít nhất nên được đặt câu hỏi về cách chúng có thể vi phạm các nguyên tắc trên và có thể được phân tách thành một số lớp "off-shot".

Nhận xét của tôi dựa trên việc đọc và nghiên cứu các tác giả như Martin Fowler, Joshua Bloch và Misko Hevery. Chúng là những tài nguyên tuyệt vời để tư vấn cho việc viết mã Java tốt.

Làm anh chàng tiếp theo (có thể là bạn trong một vài năm) một ân huệ và cố gắng viết các lớp có ít hơn thay vì nhiều dòng trong đó.


Tôi nghĩ rằng mọi người đều đồng ý rằng 5000+ nói chung không phải là một dấu hiệu tốt (không tính các lớp lồng nhau), nhưng họ cảm thấy như đó là một tác dụng phụ hoặc một cái gì đó hơn là vấn đề thực tế. Tất nhiên, một số người quá dài dòng và sử dụng quá nhiều dòng chỉ để khai báo và khởi tạo các biến và như vậy - và họ cần phải ngăn chặn điều đó. Đó không làm cho nó ít có thể đọc được. Nhưng nếu nó liên quan đến cấu trúc lớp, thì vấn đề không phải là chính LỘC; đó là thực tế rằng ai đó sẽ không phá vỡ mọi thứ rất tốt để bắt đầu, và LỘC là một tác dụng phụ của điều đó.
Panzercrisis

2
Vấn đề là một lớp nên có sự gắn kết cao và trách nhiệm rõ ràng, điều đó có nghĩa là các lớp thường không phát triển quá lớn. Nhưng NẾU một lớp được thiết kế tốt nhưng vẫn có hơn 5000 dòng mã, nó không giúp bất kỳ ai chia nó thành nhiều lớp được liên kết chặt chẽ nhỏ hơn.
JacquesB

12

Nó phụ thuộc vào độ phức tạp, không phải số lượng dòng. Tôi đã viết những thói quen ngớ ngẩn rất dễ hiểu và chính xác là đã làm một việc và làm tốt, nhưng đã tiếp tục hàng trăm dòng. Tôi đã viết các hàm khá ngắn khó hiểu (và gỡ lỗi).

Một điều khác bạn có thể nhìn vào là số lượng các chức năng công cộng trong một lớp. Đó cũng có thể là một dấu hiệu cảnh báo.

Tôi không có sẵn số lượng tốt, nhưng tôi khuyên bạn nên xem xét một số mã tốt có thể làm những điều hữu ích tại cửa hàng của bạn và dựa trên cơ sở đó. Chắc chắn bạn nên xem các lớp dài nhất và các API lớn nhất.


7
+1: Đừng đo những thứ ngớ ngẩn như đường kẻ. Độ phức tạp theo chu kỳ và số lượng tính năng (số phương thức) có ý nghĩa hơn đối với các dòng.
S.Lott

2
có và không. Số lượng dòng quá nhiều thường là một triệu chứng của thiết kế xấu, và do đó, một lá cờ đỏ mà lớp có thể cần tái cấu trúc.
jwenting

1
@jwenting Vâng, đó là những gì tôi đã nhận được. Tôi biết rất nhiều dòng! = Cần phải được cấu trúc lại, nhưng hầu như tất cả các lớp tôi đang làm việc với nó thực sự cần phải được cấu trúc lại do thiết kế kém có rất nhiều dòng.
Michael McGowan

5

Có quá nhiều dòng mã nếu lớp đang làm quá nhiều thứ khác nhau. Về cơ bản, nếu bạn tuân theo nguyên tắc Trách nhiệm duy nhất cho các lớp, sẽ có giới hạn về mức độ lớn của lớp.

Về các giới hạn vật lý, bạn có thể có (nguồn: Định dạng tệp lớp Java5 ):

  • 65.536 hằng số, giao diện được áp dụng, các trường, phương thức và thuộc tính - mỗi thuộc tính. LƯU Ý: bạn sẽ hết không gian liên tục trước khi hết bất kỳ mục nào khác. CHÚ THÍCH 2: các thuộc tính là các cấu trúc tệp lớp - không bị nhầm lẫn với các dấu '@Attribution' (nghĩa là thông tin gỡ lỗi và mã byte được lưu trữ dưới dạng các thuộc tính riêng biệt cho một phương thức).
  • Mỗi phương thức có thể là 4GB (32 bit) mã byte được tạo. LƯU Ý: Các phiên bản Java trước 1.5 chỉ có thể có mã byte được tạo 64KB (16 bit) cho mỗi phương thức.

Nói tóm lại, tệp lớp có thể lớn hơn nhiều so với bất kỳ ai cho là hữu ích. Nếu bạn tuân thủ nguyên tắc trách nhiệm duy nhất, các tệp lớp của bạn sẽ có kích thước phù hợp.


1
+1 cho trách nhiệm duy nhất :) @Berin bạn có thực hiện điều này một cách nghiêm ngặt trong phần mềm của mình không?
Aditya P

Đúng. Bí quyết là phân chia trách nhiệm theo cách có ý nghĩa.
Berin Loritsch

ah, ranh giới 64KB cũ tốt. Kiểm tra lithmus tuyệt vời để xem liệu các tệp JSP của bạn có quá phức tạp hay không, vì chúng được dịch sang một phương thức duy nhất với rất nhiều câu lệnh println cho tất cả html tĩnh của bạn :)
jwenting

Kể từ Java 5, họ đã tăng nó lên 4GB. Không phải lo lắng bây giờ.
Berin Loritsch

5

Câu trả lời đúng là 42. Đùa thôi.
Trên thực tế, các dòng khuyến nghị tối đa cho mỗi lớp là 2000 dòng.

"Các quy ước về mã Java" từ năm 1999 đã tuyên bố theo cách này: Các
tệp dài hơn 2000 dòng rất cồng kềnh và nên tránh.

Đã tuân theo các quy ước của Sun / Oracle Coding kể từ khi Java được phát minh, tôi thấy quy tắc này trên các dòng trên mỗi lớp là hợp lý. 99% Mã Java của bạn phải tuân thủ ... Và nếu nó vượt quá 2000, chỉ cần đặt TODO ở đầu nói rằng lớp cần hoạt động.

Điều tồi tệ nhất là trường hợp ngược lại khi các lập trình viên tạo ra quá nhiều lớp nhỏ bé gần như không có chức năng thực sự trong mỗi lớp. Bỏ qua lời khuyên cho "Thành phần ưu tiên", các lập trình viên tạo ra hàng trăm lớp kế thừa, tạo ra các mô hình đối tượng phức tạp, tệ hơn nhiều so với vấn đề của lớp lớn (ít nhất là thường giữ chức năng với tên lớp có liên quan).

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


Trên thực tế, hầu hết trong số họ là những bình luận @LluisMartinez
Xtreme Biker

Tôi hoàn toàn không đồng ý với năm 2000 . Một lớp sẽ không dài hơn 200 dòng không kể bình luận.
Nikolas

4

Mã sạch:

Các lớp học nên nhỏ!

Nguyên tắc đầu tiên của các lớp là chúng phải nhỏ. Quy tắc thứ hai của các lớp là chúng phải nhỏ hơn thế. Không, chúng tôi sẽ không lặp lại cùng một văn bản từ chương Chức năng. Nhưng cũng như các hàm, nhỏ hơn là quy tắc chính khi thiết kế các lớp. Cũng như các chức năng, câu hỏi ngay lập tức của chúng tôi luôn luôn là Làm thế nào nhỏ?

** Với các chức năng, chúng tôi đã đo kích thước bằng cách đếm các đường vật lý. Với các lớp chúng tôi sử dụng một biện pháp khác nhau. Chúng tôi tính trách nhiệm. **

Tên của một lớp nên mô tả những trách nhiệm mà nó hoàn thành. Trong thực tế, đặt tên có lẽ là cách đầu tiên giúp xác định quy mô lớp. Nếu chúng ta không thể lấy được một tên ngắn gọn cho một lớp, thì nó có thể quá lớn. Tên lớp càng mơ hồ, càng có nhiều khả năng nó có quá nhiều trách nhiệm. Ví dụ, tên lớp bao gồm các từ chồn như Bộ xử lý hoặc Trình quản lý hoặc Siêu thường gợi ý về sự tổng hợp đáng tiếc của các trách nhiệm.

Sau đó:

  • Chỉ cần chắc chắn rằng phương pháp của bạn chỉ làm một điều.
  • Sau đó, đảm bảo rằng lớp không có quá nhiều khả năng đáp ứng.

Bạn sẽ kết thúc với một lớp có kích thước có thể quản lý.


nếu Clean Codetrên đầu câu trả lời của bạn đề cập đến cuốn sách của Robert C. Martin (đúng như vậy!), thì tôi phải nói bạn và tôi có điểm chung; cuốn sách đó là những gì dẫn tôi đến câu hỏi này. Tôi nghĩ rằng câu trả lời này đã nói lên tất cả
Sнаđошƒаӽ

2

Số dòng là một số liệu khá kém về chất lượng lớp. Đối với tôi, tôi thích tìm kiếm (như những người khác đã đề cập) về các phương thức công khai, cũng như bất kỳ thuộc tính được phơi bày công khai nào (tôi đoán các getters / setters công khai trong Java). Nếu tôi phải kéo một số ra khỏi không khí khi nó có thể thu hút sự chú ý của tôi, tôi sẽ nói khi có hơn 10 số. Thực sự, nếu có hơn 5 thuộc tính hoặc phương pháp, tôi sẽ xem xét và thường tìm cách tái cấu trúc, nhưng bất cứ điều gì trên 10 thường là một dấu hiệu cảnh báo rằng một cái gì đó có khả năng bị phơi bày kém.

Đó là một cuộc trò chuyện hoàn toàn khác, nhưng các phương thức và lĩnh vực riêng tư ít có mùi đối với tôi, vì vậy nếu chúng đóng góp rất nhiều vào số lượng dòng, thì tôi có thể không lo lắng như vậy. Ít nhất, nó cho thấy rằng có lẽ không có bộ điều khiển nào của Chúa điều khiển vật thể từ xa, đây là một vấn đề khá khó khăn trong thiết kế.


2

Hãy thử sử dụng một số liệu tốt hơn.

Một ví dụ là số liệu ABC . Nó là một thước đo về số lượng công việc đang được thực hiện bởi mã hơn là có bao nhiêu mã.


1

Bất kỳ dòng nào nằm trong miền vấn đề của lớp bạn được viết bên ngoài lớp là một dòng quá ít và một dòng quá nhiều trong lớp nơi nó sống. Hãy nghĩ về một lớp học như một chủ đề. Bạn phải che nó lại. Chính xác nhất có thể là lý tưởng nhưng nếu mất 500 dòng thì mất 500 dòng. Nếu 100 trong số những dòng đó bao gồm một chủ đề khác, chúng thuộc về một nơi khác. Việc chia thành các tên miền phụ nhỏ hơn trong lớp vì các lớp bên trong có ý nghĩa nhưng tôi sẽ chỉ định nghĩa những tên miền bên ngoài lớp nếu chúng được sử dụng ở nơi khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.