Java에서 클래스 당 몇 줄이 너무 많은가? [닫은]


74

경험상 Java의 한 클래스에 너무 많은 코드 줄이 너무 많은 경우 유용한 규칙은 무엇입니까?

분명히, 나는 줄의 수가 특정 클래스에 있어야하는 것과 그렇지 않아야하는 것에 사용하기 위해 실제 표준에 가깝지 않다는 것을 알고 있습니다. 수업은 적절한 OOP 철학 (캡슐화 등)을 고려하여 설계해야합니다. 즉, 경험상 규칙은 리팩토링 고려 사항을위한 유용한 시작점을 제공 할 수 있습니다 (예 : "음,이 클래스는> n 행의 코드를 가지고있을 것입니다. 아마도 읽을 수없고 열성적인 캡슐화 작업을 수행하고 있기 때문에 이것이 필요한지 확인하고 싶을 것입니다. 어느 시점에서 리팩토링해야합니다 ").

반대로 OOP 디자인에 여전히 잘 준수하고 길이에도 불구하고 읽고 유지 관리 할 수있는 매우 큰 클래스의 예를 보았습니까?

다음 은 함수 당 줄에 대한 중복되지 않는 관련 질문 입니다.


4
나는 수천 줄 이상의 수업을 보았습니다. "너무 많은 것"과 같은 것이 없다고 생각합니다.
Mahmoud Hossam

5
더 이상 컴파일하지 않을 때 너무 많습니다. 진지하게, 수업이 너무 많은 다른 일을 할 때는 너무 많습니다.
Berin Loritsch

20
경험의 규칙은 최대 값으로 바뀌어 정책이 불일치로 바뀝니다. 무 수성을 피하십시오. 책임이 제대로 할당되었는지를 계산하는 이상적인 방법은 계산과 측정이 아닙니다.
S.Lott

7
문자열의 올바른 인치 수와 거의 같습니다.
Matt

6
30 표로 된 질문은 ~ 24k 회 조회, 10 개의 답변 (통칭) ~ 75 표로 표시되었습니다. "주요 의견 기반으로 닫힘"스택 교환에 오신 것을 환영합니다. :) SE 문화에서 뭔가 변화가 필요합니다 ...
jb.

답변:


79

몇 가지 흥미로운 지표 :

            junit fitnesse testNG 탐 jdepend 개미 바람둥이
            ----- -------- ------ --- ------- --- ------
최대 500 498 1450 355668 2168 5457
평균 64.0 77.6 62.7 95.3 128.8 215.9 261.6
최소 4 6 4 10 20 3 12
시그마 75 76110 7812926169
파일 90632 1152 69 55954 1468
총계 5756 49063 72273 6575 7085 206001 384026

나는 그것을 작성하는 것과 많은 관련이 있었기 때문에 FitNesse를 벤치 마크로 사용합니다. FitNesse에서 평균 클래스 길이는 77 줄입니다. 498 줄을 초과하지 않습니다. 그리고 표준 편차는 76 줄입니다. 그것은 대부분의 수업이 150 줄 미만이라는 것을 의미합니다. 클래스가 5000 줄을 초과하는 Tomcat조차도 대부분의 클래스가 500 줄 미만입니다.

이것을 감안할 때 우리는 200 줄을 좋은 지침으로 사용하여 아래에 머물 수 있습니다.


9
수업에 하나의 책임 만 있다면 200-500 라인을 넘을 가능성은 매우 적습니다. 일반적으로 다른 관련 책임 을 처리하기 위해 "내부 클래스"가 있는 사람들. 예를 들어 Tomcat 5000+ 라인 클래스는 실제로 12 개의 내부 클래스가있는 1 개의 메인 클래스 일 수 있습니다. 요청 핸들러 등이있는 Java에서는 드문 일이 아닙니다.
Berin Loritsch

4
이 통계는 실제로 어떻게 얻습니까? 그냥 알고 싶어
Sнаđошƒаӽ

1
나는 보통 기능에 관한 링크 된 질문에 대한이 답변을 향해 더 의지 할 것 : programmers.stackexchange.com/a/9452/100669의 LOC는 같은 어쩌면 제외 종류의 관계가 매우 간단하게 당신이 수도 궁금 시작하는 엄지 손가락의 일반적인 규칙은 더 세분화 할 수 있습니다. 그리고 나는 중첩 클래스에 대해 동의합니다. 그럼에도 불구하고 500은 아마도 일반적인 경고 표시에 더 가깝습니다.
Panzercrisis

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

32

나를 위해, 코드 라인은이 맥락에서 관련이 없습니다. 내가이 수업에 와서 그것을 바꾸려고하는 여러 가지 이유에 관한 것입니다.

개인을 검증하기위한 규칙을 변경하려고 할 때이 클래스에 오면, 주문을 검증하기위한 규칙을 변경하기 위해 같은 클래스에오고 싶지 않으며, 내가있는 곳을 변경하기 위해 여기에오고 싶지 않습니다. 사람을 유지하십시오.

즉, 당신이 그것을 목표로한다면 200 줄을 넘는 수업을 거의 찾을 수 없을 것입니다. 유효한 이유로 발생하지만 드물게 발생합니다. 따라서 빨간색 플래그 메트릭을 찾고 있다면 시작하기에 좋지 않은 곳이 아닙니다. 규칙이 아니라 지침으로 삼으십시오.


200은 매우 대략적인 추측으로 생각합니다. 당신이 말했듯이, 당신이 먼저 걱정하는 것은 아닙니다.
Steve

Java의 유일한 점은 LOC를 계산할 때 getter / setter를 무시한다는 것입니다.
MrFox

1
@ MrFox : 동의하지 않습니다. 클래스에 LOC 데이터를 기울 이기에 충분한 getter 및 setter가있는 경우 "이 클래스가 너무 많은 작업을 수행하고 있습니까?"에서 계산됩니다. 질문. 그러나 타협으로 NetBean getter / setters는 과도한 보일러 플레이트에 대해 1 라인 / 라인 미만으로 기꺼이 있습니다.
Brian

23

미안하지만 많은 답변이 "정말 중요하지 않다"고 말한 것에 매우 놀랐습니다. 클래스에 몇 줄이 있는지는 매우 중요합니다. 왜? 좋은 Java 코드를 작성할 때 이러한 원칙을 고려하십시오 ...

  • 테스트 가능성
  • 응집력
  • 커플 링
  • 이해

줄이 많은 수업은 이러한 원칙을 모두 위반할 가능성이 높습니다.

"실제로 중요하지 않다"고 말한 사람들에게는 5000 개 이상의 라인이있는 클래스를 이해하고 이해하는 것이 얼마나 재미 있습니까? 아니면 수정 하시겠습니까? 당신이 재미 있다고 말하면, 당신은 고통에 대한 이상한 친근감이 있습니다 ...

1000 줄 이상인 클래스 는 적어도 위의 원칙을 어기는 방법에 대해 의문을 제기하고 여러 "off-shoot"클래스로 파싱해야한다고 말합니다.

내 의견은 Martin Fowler, Joshua Bloch 및 Misko Hevery와 같은 저자를 읽고 연구 한 결과입니다. 좋은 Java 코드 작성을위한 훌륭한 리소스입니다.

다음 녀석 (2 년 동안 당신이 될 수 있음)에게 호의를 베풀고 더 많은 줄이 아닌 수업을 쓰려고 노력하십시오.


나는 모두가 5000 인 것에 동의 생각 하지 일반적으로 (중첩 된 클래스를 계산하지 않음) 좋은 징조하지만 실제 문제보다 부작용 또는 뭔가 더처럼 그들은 느낀다. 물론 어떤 사람들은 지나치게 장황하며 변수를 선언하고 초기화하기 위해 너무 많은 수의 행을 사용하므로이를 중지해야합니다. 즉 않습니다 덜 읽을 수 있도록. 그러나 클래스 구조와 관련이 있다면 문제는 LOC 자체가 아닙니다. 그것은 누군가가 처음부터 일을 잘 해내 지 못한다는 사실이며, LOC는 그 부작용입니다.
Panzercrisis

2
요점은 클래스가 높은 응집력과 명확한 책임을 가져야한다는 것입니다. 즉, 클래스는 일반적으로 그렇게 커지지 않습니다. 그러나 클래스가 잘 디자인되었지만 여전히 5000 줄 이상의 코드가있는 경우 누구든지 클래스를 여러 개의 작은 밀접하게 연결된 클래스로 나누는 데 도움이되지 않습니다.
JacquesB

12

행 수가 아니라 복잡성에 따라 다릅니다. 나는 이해하기 쉽고 정확하게 한 가지 일을하고 잘한 큰 바보 같은 루틴을 작성했지만 수백 줄을 계속했습니다. 이해하기 어려운 디버그 함수를 작성했습니다.

당신이 볼 수있는 또 다른 것은 클래스의 공용 함수의 수입니다. 경고 표시 일 수도 있습니다.

나는 유용한 자료가 없지만 상점에서 유용한 일을하는 괜찮은 코드를 찾고 그것을 기반으로 제안하는 것이 좋습니다. 확실히 가장 긴 클래스와 가장 큰 API를 살펴 봐야합니다.


7
+1 : 선과 같은 멍청한 것들을 측정하지 마십시오. Cyclomatic Complexity and Feature Counts (방법 수)는 선에 더 적합합니다.
S.Lott

2
예, 아니오 라인 수가 너무 많으면 디자인이 잘못되어 종종 리팩토링이 필요할 수있는 적기가 나타납니다.
jwenting

1
@jwenting 그렇습니다. 나는 많은 줄을 알고 있습니다! = 리팩토링해야하지만, 디자인이 좋지 않아서 리팩토링 해야하는 거의 모든 클래스에는 많은 줄이 있습니다.
Michael McGowan

5

클래스가 너무 많은 다른 작업을 수행하는 경우 코드 줄이 너무 많습니다. 기본적으로 수업에 대한 단일 책임 원칙을 따르는 경우 수업 규모가 커질 수있는 한계가 있습니다.

물리적 제한 사항에 관해서는 다음과 같이 할 수 있습니다 (소스 : 클래스 파일 형식 Java5 ).

  • 65,536 개의 상수, 적용된 인터페이스, 필드, 메소드 및 속성-각각. 참고 : 다른 항목 을 모두 사용 하기 전에 일정한 공간이 부족 합니다. 비고 2 : 속성은 클래스 파일 구조이며 '@Attribute'마커와 혼동하지 않아야한다 (즉, 디버그 정보와 바이트 코드는 메소드에 대한 별도의 속성으로 저장된다).
  • 각 방법은 4GB (32 비트)의 생성 된 바이트 코드 일 수 있습니다. 참고 : 1.5 이전의 Java 버전은 각 메소드에 대해 64KB (16 비트)의 생성 된 바이트 코드 만 가질 수 있습니다.

요컨대, 클래스 파일은 다른 사람들 이 유용하다고 생각 하는 것 보다 훨씬 클 수 있습니다 . 단일 책임 원칙을 고수하면 수업 파일의 크기가 적당합니다.


1
단일 책임에 대한 +1 :) @Berin 소프트웨어에서 엄격하게 구현합니까?
Aditya P

예. 비결은 책임을 이해하기 쉬운 방식으로 나누는 것입니다.
Berin Loritsch

아, 좋은 오래된 64KB 경계. 멋진 lithmus 테스트는 JSP가 모든 정적 HTML에 대해 많은 println 문을 사용하여 단일 메소드로 변환되므로 JSP가 너무 복잡한 지 여부를 테스트합니다.
jwenting

Java 5부터는 4GB로 늘 렸습니다. 지금 걱정하지 마십시오.
Berin Loritsch

5

정답은 42입니다. 농담입니다.
실제로, 클래스 당 최대 권장 라인 수는 2000 라인입니다.

1999 년 이후 "Java Code Conventions"는 다음과 같이 명시했습니다.
2000 줄보다 긴 파일은 번거롭고 피해야합니다.

Java가 발명 된 이래 Sun / Oracle Coding 규칙을 따른 후, 클래스 당 줄에 대한 이러한 경험 규칙이 합리적이라는 것을 알았습니다. Java 코드의 99 %가 준수해야합니다. 2000 이상이되면 클래스가 작동해야한다고 TODO를 맨 위에 놓으십시오.

최악의 상황은 프로그래머가 각 클래스에서 거의 실제 기능이없는 너무 작은 클래스를 너무 많이 만들 때 반대의 경우입니다. "즐겨 찾기 구성 (Favor Composition)"에 대한 조언을 무시하면서 프로그래머들은 수백 개의 상속 클래스를 만들어 큰 클래스 문제 (최소한 관련 클래스 이름으로 기능을 유지하는 것)보다 훨씬 복잡한 복잡한 개체 모델을 만듭니다.

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


실제로, 그들 대부분은 댓글 @LluisMartinez
Xtreme Biker

나는 2000에 동의하지 않는다 . 수업은 의견을 제외하고 200 줄을 넘지 않아야합니다 .
Nikolas

4

깨끗한 코드 :

수업은 작아야합니다!

수업의 첫 번째 규칙은 수업이 작아야한다는 것입니다. 클래스의 두 번째 규칙은 클래스보다 작아야한다는 것입니다. 우리는 함수 장에서 똑같은 텍스트를 반복하지 않을 것입니다. 그러나 함수와 마찬가지로 클래스를 디자인 할 때 기본 규칙은 더 작습니다. 함수와 마찬가지로 우리의 즉각적인 질문은 항상“얼마나 작은가?

** 함수를 사용하여 물리적 라인을 계산하여 크기를 측정했습니다. 클래스에서는 다른 측정 값을 사용합니다. 우리는 책임을 계산합니다. **

수업의 이름은 어떤 책임을 수행하는지 설명해야합니다. 실제로, 네이밍은 아마도 클래스 규모를 결정하는 첫 번째 방법 일 것입니다. 클래스의 간결한 이름을 도출 할 수 없다면 너무 클 수 있습니다. 클래스 이름이 모호할수록 너무 많은 책임이 있습니다. 예를 들어, 프로세서 또는 관리자 또는 Super와 같은 족제비 단어를 포함하는 클래스 이름은 종종 불행한 책임 집계를 암시합니다.

그때:

  • 메소드가 한 가지만 수행하는지 확인하십시오.
  • 그런 다음 반원들에게 너무 많은 책임이 없는지 확인하십시오.

관리 가능한 크기의 클래스로 끝납니다.


경우 Clean Code답변의 상단에 (!는 않습니다) 로버트 C. 마틴 책을 의미한다, 나는 당신 말을하고 난 공통점이있다; 그 책이 저를이 질문으로 이끌었습니다. 이 답변이 전부라고 생각합니다
Sнаđошƒаӽ

2

줄 수는 클래스 품질에 대한 지표가 매우 낮습니다. 나에게, 공개 메소드와 공개 노출 속성 (Java의 공개 getter / setter)을 (다른 사람들이 언급했듯이)보고 싶습니다. 만약 내가주의를 끌기 위해 공중에서 숫자를 뽑아야한다면, 각각 10 개 이상이있을 때 말할 것입니다. 실제로, 속성이나 메서드 중 약 5 개 이상인 경우 리팩토링하는 방법을 찾아보고 자주 찾을 것입니다. 그러나 10 개 이상은 일반적으로 노출이 제대로되지 않을 가능성이 높다는 경고 신호입니다.

그것의 또 다른 대화는 전적으로 개인적인 방법과 분야는 나에게 덜 냄새가납니다. 그래서 그들이 줄 수에 많은 기여를한다면, 나는 걱정하지 않을 것입니다. 적어도, 그것은 아마도 멀리서 물체를 조작하는 신 컨트롤러가 없다는 것을 보여줍니다. 이것은 꽤 문제가되는 디자인 문제입니다.


2

더 나은 측정 항목을 사용해보십시오.

한 가지 예는 ABC Metric 입니다. 코드가 얼마나 많은지보다 코드가 얼마나 많은 작업을 수행하고 있는지 측정하는 것입니다.


1

클래스 외부에서 작성된 클래스의 문제 영역에 속하는 라인은 클래스가있는 라인에서 너무 적은 라인과 너무 많은 라인입니다. 수업을 주제로 생각하십시오. 당신은 그것을 커버해야합니다. 간결하게 가능한 한 이상적이지만 500 줄이면 500 줄이 걸립니다. 이 줄 중 100 개가 다른 주제를 다루면 다른 곳에 속합니다. 내부 클래스로 클래스 내 더 작은 하위 도메인으로 나누는 것이 합리적이지만 다른 곳에서 사용하는 경우 클래스 외부의 하위 도메인 만 정의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.