코드 파일이 어느 시점 / 범위에 있습니까?


36

2-3k 라인 파일을 많이 찾고 있는데 실제로 그렇게 커야한다고 생각하지 않습니다.

소스 코드 파일을 "너무 큰"객관적으로 호출하기위한 좋은 기준은 무엇입니까? 소스 코드 파일에 있어야하는 최대 행 수와 같은 것이 있습니까?


코드를 검토 한 후 동료가 알려줍니다. "코드 자체가 말한 것보다 저자에 대해 더 많이 알고 있기 때문에 스스로 결정할 수는 없습니다. 컴퓨터는 그림이 예술인지 아닌지를 알 수없는 것과 같은 이유로 말할 수 없습니다. 따라서 다른 인간이 필요합니다. 소프트웨어 유지 관리-귀하가 작성한 것을보고 의견을 제공하기 위해 ... "
gnat

일부 컴파일러는 소스 코드 크기에 최대 제한 길이 (최대 행 길이 또는 최대 행 수)가있었습니다. 컴파일러가 불평 할 때 이는 코드가 너무 크거나 업그레이드해야 할 시점이라는 객관적인 지표입니다.
mouviciel

2
파일의 무결성을 손상시키지 않으면 서 가능한 많이 분할하십시오. 각 파일 (또는 헤더 / 소스 파일 쌍)은 다른 파일의 내부 구현과 상관없이 항상 둥근 전체 여야합니다. 이것이 의미하는 경우 일부 파일은 복잡한 것을 구현하기 때문에 크기가 커질 수 있습니다.
Ambroz Bizjak

복잡성은 숫자뿐만 아니라 구조에 관한 것입니다. 예를 들어, 파이썬 선에 "평면이 중첩보다 낫습니다"라고 말하고 싶습니다 .100 건의 플랫 목록은 계층 구조보다 간단합니다 (100 건을 모두 기억하지는 않지만 100 개의 대안이 있음을 쉽게 기억합니다) . 분기가 형제와 동일한 구조를 갖는 "정규"계층 구조는 불규칙한 하위 구조를 가진 계층 구조보다 간단합니다.
Juh_

"그게 소스 코드입니까?" "아니요, 그게 makefile입니다. 소스 코드는 뒤 따르는 트럭 안에 있습니다."
mckenzm

답변:


26

이상적인 모델로서 나는 다음과 같은 기준을 사용합니다 (마틴 베켓이 제안한 것과 유사한 근거, 즉 코드 구조가 아닌 논리적 구조에 대한 생각) :

규칙 1

파일 당 하나의 클래스 (C ++에서 하나의 클래스-> 하나의 헤더와 하나의 구현 파일)

규칙 2

일곱은 우리 뇌가 혼란스럽지 않고 동시에 관찰 할 수있는 항목의 수로 간주됩니다. 7 이상에서는 우리가 보는 것에 대한 개요를 유지하기가 어렵습니다. 따라서 각 클래스에는 7-10 개 이상의 메서드가 없어야합니다. 메소드가 10 개를 초과하는 클래스는 아마도 너무 복잡하므로 분할하려고 시도해야합니다. 분할은 클래스를 분할 할 때마다 각 개별 클래스의 복잡성을 최소한 2 배 줄이므로 매우 효과적인 방법입니다.

규칙 3

하나 또는 두 개의 화면에 맞지 않는 메소드 본문이 너무 큽니다 (화면 / 편집기 창이 약 50 줄이라고 가정합니다). 이상적으로는 전체 방법을 한 창에서 볼 수 있습니다. 그렇지 않은 경우 숨겨지는 메소드 부분을 잊지 않고 약간 위아래로 스크롤하면됩니다. 따라서 전체 분석법 본문을 읽기 위해 둘 이상의 화면을 위나 아래로 스크롤해야하는 경우 분석법이 너무 커서 개요를 쉽게 잃을 수 있습니다.

다시 개인 도움말 메소드를 사용하여 메소드를 분할하면 메소드 복잡성이 매우 빠르게 감소 할 수 있습니다 (매 분할마다 복잡성이 절반으로 줄어 듭니다). 개인 도움말 메소드를 너무 많이 도입하면 별도의 클래스를 작성하여 수집 할 수 있습니다 (공용 메소드보다 개인 메소드가 더 많은 경우 두 번째 클래스가 기본 클래스에 숨어있을 수 있음).

이 대략적인 추정치를 정리하면 다음과 같습니다.

  • 소스 파일 당 최대 하나의 클래스
  • 수업 당 최대 10 개의 공개 방법.
  • 클래스 당 최대 10 개의 개인용 메소드.
  • 방법 당 최대 100 줄.

따라서 2000 줄 이상의 소스 파일이 너무 커서 너무 지저분 해지기 시작합니다.

이것은 실제로 매우 거친 추정치이며 체계적으로 이러한 기준을 따르지 않습니다 (특히 적절한 리팩토링을 수행 할 시간이 항상 충분하지 않기 때문에). 또한 Martin Beckett이 제안했듯이 클래스가 많은 메소드 모음이며 클래스를 더 작게 만들기 위해 인위적인 방식으로 나누는 것이 합리적이지 않은 상황이 있습니다.

어쨌든, 내 경험상 위의 매개 변수 중 하나가 존중되지 않으면 파일을 읽을 수 없게됩니다 (예 : 6 개의 화면에 걸쳐있는 300 줄 메서드 본문 또는 5000 줄 코드가있는 소스 파일).


1
또한 10 줄을 넘지 않는 분석법을 위해 노력하고 있습니다 ... 가독성을 높이고 분석법이 수행하는 작업을 이해하고 큰 분석법에서 쉽게 발생할 수있는 복잡성을 줄입니다 ...
Zack Macomber

4
Rule2는 결론에 따라 어색합니다. 디렉토리에 파일이 7 개를 넘지 않아야하므로 프로젝트에서 수십 또는 수백 개의 파일이 혼동되지 않도록 파일을 크게 유지해야합니다. 마찬가지로, 깊이 중첩 된 디렉토리 구조는 지나치게 혼동되므로 모든 파일을 분산시키는 것보다 하나의 디렉토리에 몇 개의 큰 파일을 유지하는 것이 좋습니다.
hasen

1
죄송합니다.이 답변은 전적으로 임의의 측정 항목을 기반으로합니다. "7 개 항목"은 분명히 엉망입니다. 그렇지 않으면 알파벳을 사용할 수 없습니다. 물체의 크기는 임의의 숫자가 아니라 우려의 분리, 단일 책임, 높은 응집력-낮은 결합 및 유사한 원리를 기반으로해야합니다.
JacquesB

1
@JacquesB 7 가지 항목은 일반적으로 7 가지 관련이없는 정보를 나타냅니다. 당신의 두뇌가 정보를 연관 시키거나 그룹화 할 수 있다면, 실제로 의미하는 것은 당신이 기억하려고하면 더 많은 정보를 이끌어 낼 수있는 하나의 정보입니다 (사실 "알파벳"은 모두 26 글자가 아닌 상징입니다). 더 좋은 예는 펜과 종이를 사용할 필요없이 전화로 알려주는 7 자리 숫자를 기억하는 것입니다. 메소드는 임의의 숫자가 아니지만, 해당 메소드가 코딩중인 코드와 관련이있는 경우 7 이후에 예상 할 수 있습니다. 올바르게 리콜하기 전에 해당 메소드를 찾아야합니다.
Neil

3
@Neil : 클래스의 메소드가 관련없는 임의의 정보 조각 인 경우 클래스 설계에 메소드 수보다 더 큰 문제점이 있습니다.
JacquesB

33

아니요-코드 줄과 관련이 없습니다. 드라이버는 논리적 그룹이어야합니다. 예를 들어 하나의 큰 파일에 여러 클래스가 없어야합니다.

합법적으로 수백 가지 방법이있는 클래스가 있다면 (3D 모델링에서는 불가능하지는 않습니다) 클래스를 임의의 파일로 분할하는 것이 훨씬 편리하지 않습니다. 우리는 메모리가 부족하고 프로세서 속도가 느릴 때이 작업을 수행해야했습니다.


2
수백 가지 방법을 가진 클래스가 클래스 부러움, 응집력 부족, 디자인 부족, 단일 책임 원칙 위반 등의 증상이 아닌가?
Tulains Córdova

2
@ user1598390 : 일반적으로 항상 그런 것은 아닙니다.
whatsisname

4
@ user1598390-gis / 3d 모델링에서 일반적으로 수행 할 수있는 많은 작업을 수행 한 다음 2D, 3D, 4D, 3D + 신호에 대해 오버로드되고 float / double / integer 등에 과부하가 걸리는 경우-템플릿은 약간이지만 효율성에 도움이됩니다. 많은 작업이 종종 꽤 계급 계층보다 낫습니다
Martin Beckett

2
@ tp1-작은 글꼴을 사용하여 공간을 많이 차지하지 않습니까?
Martin Beckett

2
@ tp1 Dude, 죄송합니다. 무례 함을 의미하지는 않습니다. 1200 개의 클래스가있는 경우 디렉토리 규칙을 사용하고 너무 많은 디렉토리가 있으면 독립 모듈 / 라이브러리로 분할하십시오.
dukeofgaming

8

코드가 유지되지 않으면 즉 : 찾고있는 메소드 / 클래스 / 함수가 있고 편집 / 디버그 해야하는 코드가 있는지 여부와 코드의 위치를 ​​알 수 없습니다.

IDE / Editor의 선택과 기능은이 상한의 실제 수량에 영향을 미칩니다. 코드 폴딩 , 함수 / 메소드 목록 및 조회 는 이 개발 시나리오가 제시하는 순간 을 연기 합니다.

그러나 그렇게 할 때, 그것을 나누어야 할 때입니다.


2

대체보기는 다음과 같습니다. 파일 크기를 제한하는 방법을 묻습니다. 내 의견은 큰 코드 파일을 매우 문제를 일으키는 많은 요소가 있다는 것입니다. 때로는 코드 파일이 크지 만 내용이 잘 클러스터되어 있고 매우 깨끗한 코드이므로 크기가 큰 문제를 일으키지 않습니다. LOC가 높음에도 불구하고 읽을 수있는 많은 파일을 보았습니다.

LOC 메트릭을 사용하는 대신 이력 데이터를 사용하여 큰 파일에서 코드가 얼마나 자주 손상되는지 이해하려고합니다. 일반적으로 그 이유는 개발자가 동일한 파일에서 관련 다른 위치를 확인하고 충분한 이해없이 "빠른 수정"사고 방식으로 변경할 시간이 없기 때문입니다.

더 큰 위험은 복사-붙여 넣기 코드가 있다는 것입니다. 복사-붙여 넣기 코딩도 당연히 LOC 성장 속도를 높입니다. LOC를 마법의 숫자 이하로 유지하는 것보다 복사 붙여 넣기를 제거하는 것이 더 중요하다고 생각합니다. 순수한 복사-붙여 넣기 외에도 큰 파일에는 두 번째 위험 인 중복되는 기능이 있습니다. 파일이 클수록 이미 같은 파일의 다른 섹션에있는 일부 스 니펫을 다시 구현할 가능성이 높아집니다.

따라서 더 큰 파일에 대해 버그 수정 비율 (모든 커밋에 대한 버그 수정 커밋 비율)이 낮 으면 상황이 허용됩니다. 시도해 git log보고 오류와 관련된 커밋 수를 살펴 보십시오 . 또는 자동 분석 및 시각화 할 수있는 도구 (예 : Softagram)를 사용하십시오 .


-1

이것을 고려하십시오 Metaphor. 코드 길이와 관련하여 다음을 고려해야한다고 생각합니다.

The Cat in The Hat (50 pp.)

Lord of The Rings (1,178 pp.)

에 아무런 문제가 없습니다 Lord of the Rings. 멋진 책입니다. The Cat in the Hat또한 훌륭한 책입니다. 둘 다 5 살짜리 어린이들에게 이해 될 수 있지만, 내용 때문에 하나만 더 적합합니다.

요컨대, 코드 작성은 가능할 때마다 5 세가되어야합니다. Cyclomatic Complexity개발자가 코드를 생성 할 때 고려해야 할 중요한 개념입니다. 기능 및 코드 재사용 성을 최대한 향상시키기 위해 라이브러리 활용 및 생성 이런 식으로 우리 코드는 우리가 작성한 것보다 많은 양을 말할 수 있습니다.

우리 대부분은 어셈블리 코드를 작성하지 않습니다 . 그러나 코드의 근본은 어셈블리입니다. 10000 라인 어셈블리를 통한 검색은 올바르게 수행되면 10000 라인의 파이썬보다 어렵습니다.

그러나 일부 작업에는 500 ~ 1000 줄을 작성해야합니다. 코드의 목표는 300 줄의 깨끗한 코드를 작성하는 것입니다.

개발자로서 우리는 "반지의 제왕"을 쓰고 싶습니다. 버그가 생길 때까지 "Cat in the Hat"을 쓰고있었습니다. 코딩을 자아의 척도로 만들지 마십시오. 간단한 방식으로 작업을 수행하십시오.

개발자는 코드를 문서화하고 싶지 않습니다 (문서화 된 코드를 개인적으로 좋아합니다. 저는 이기적이지 않습니다). 따라서 이해하고 읽을 수있는 코드는 작성하지 마십시오. Cat in the Hat코드를 작성 하십시오.

우리 모두는 당신이 JRR Tolken (머리에 있음)을 알고 있습니다 . 버그가없는 코드로는 증명할 것이 없습니다.

은유의 또 다른 이유.

독자에게 부를 퍼 뜨리지 마십시오. 여러 사람들과 함께 일하고 그들 모두가 같은 큰 파일을 변경해야한다면, 아마도 당신은 아마도 git지옥 에 합류 하게 될 것입니다 .

모두는 rebasing을 좋아합니다.

-> 아무도 말하지 않았다!

TL; DR 가독성에 중점을 둡니다. 코드와 도우미를 여러 줄과 파일에 최대한 많이 퍼뜨립니다. 단일 파일에 8 개 또는 9 개의 클래스를 넣지 마십시오. 코드를 읽기 어렵고 유지 관리하기가 어렵습니다. 큰 조건 코드 또는 루프가있는 경우 언어에서 지원하는 경우 Lambdas로 변경하십시오. 유틸리티 기능은 코드 가독성을 높이기위한 훌륭한 수단으로 고려해야합니다. 무거운 중첩을 피하십시오.


downvoter는 아니지만 당신의 비유는 나에게 약간 손실됩니다. 코드를 여러 줄로 나누는 것이 더 좋으며 각 줄에 적은 단어가 있습니까?
사료

여러 줄과 파일에 코드를 최대한 많이 퍼 뜨리십시오. 가독성에 중점을 둡니다. 단일 파일에 8 개 또는 9 개의 클래스를 던지지 마십시오. 코드를 읽기 어렵고 유지 관리하기가 어렵습니다. 큰 조건 코드 또는 루프가있는 경우 유틸리티로 바꾸십시오. 무거운 중첩을 피하십시오. 이것이 도움이되는지 알려주십시오.
GetBackerZ

아마도 당신은 그것을 당신의 대답으로 편집해야합니다.
사료

Jackie Brown의 스크립트를 모듈 식 z / OS COBOL 프로그램의 척도로 사용했습니다. 아시다시피 칵테일 파티
밴터를

"우리가 할 수있을 때마다 5 살짜리 아이에게 의미가 있습니다." -청구서를 지불하는 실제 문제의 경우, 이것은 거의 가능하지 않으며, 잘못된 것을 목표로합니다
06 분 whatsisname
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.