함수의 최대 길이로 입증 된 것은 무엇입니까? [닫은]


43

함수 길이가 프로그래머의 생산성에 영향을 줍니까? 그렇다면 생산성 손실을 피하기위한 최대 라인 수는 얼마입니까?

이것은 매우 의견이 많은 주제이므로 일부 데이터로 주장을 백업하십시오.


5
길이는 LOC로 측정하지 말고 정확히 무엇을 이해하는 데 필요한 시간으로 측정해야합니다. 그리고 그 길이는 1 분을 넘지 않아야합니다. 몇 초 안에 알아낼 수 없다면 1 분 후에 너무 많은 일을하고있을 것입니다.
CaffGeek


12
최대 길이는 17이어야합니다.
ThomasX

1
SOLID에서 S를 생각하십시오.
Kris Krause

1
@CaffGeek 또는 아마도 함수는 단순히 사소한 일을하고 있습니다. 완전히 이해하는 데 며칠이 걸리는 기능을 보았습니다. 내가 관련된 모든 개념을 이해하는 기능조차도 세부 사항을 다루는 데 30 분이 걸릴 수 있습니다. 사소한 기능을 갖는 것이 좋지만 많은 문제는 본질적으로 어렵습니다.
코드 InChaos

답변:


46

1970 년에이 미친 라켓을 시작한 이래로, 실제로 하나 이상의 인쇄 된 페이지 (약 60 줄)가 필요한 하나의 모듈을 보았습니다 . 더 긴 모듈을 많이 보았습니다.

그 문제에 대해서는 더 긴 모듈을 작성했지만 일반적으로 큰 스위치 상태로 작성된 대형 유한 상태 머신이었습니다.

문제의 일부는 요즘 프로그래머가 물건을 모듈화하도록 가르치지 않았다는 것 같습니다.

수직 공간 낭비를 최대화하는 코딩 표준도 문제의 일부인 것으로 보입니다. (저는 Gerald Weinberg 의 " 컴퓨터 프로그래밍의 심리학 "을 읽은 소프트웨어 관리자를 아직 만나지 못했습니다 . Weinberg는 여러 연구에서 프로그래머의 이해가 본질적으로 프로그래머가 특정 순간에 볼 수있는 것으로 제한됨을 보여주었습니다. 프로그래머는 페이지를 스크롤하거나 페이지를 넘기면 이해력이 크게 떨어집니다. 기억하고 추상화해야합니다.)

FORTH 로부터 많은 문서화 된 프로그래머의 생산성 향상은 소스 코드에 대한 FORTH "블록"시스템으로 인한 것이라고 확신합니다 . 모듈은 최대 16 줄의 64 자로 제한되었습니다. 무한히 고려할 수는 있지만 어떤 상황에서도 17 줄 루틴을 작성할 수는 없습니다 .


3
FORTH의 전체 철학은 이것을 장려하기 위해 고안되었습니다 ... 당신은 자신의 어휘를 디자인하고, 프로그램을 작고 작은 조각으로 끊임없이 나누고, 적은 스크립트와 더 많은 사전으로 끝납니다. 길이 제한만으로는하지 않습니다. 일부 코딩 표준을 만족시키기 위해 루틴을 임의의 조각으로 나눕니다. 프로그래머가 단순히 "모듈화하는 법을 배우지 않았다"고 의심하는 것은 당신의 생각이 옳다고 생각합니다. 이 해야 OOP의 큰 승리 중 하나, 그러나 여러 가지 이유로 그것은 종종 자신에게 목표로 해제 강조합니다.
Shog9

1
@씨. CRT : 블록 지향 FORTH 구현의 길이 제한은 FORCED 모듈화입니다. 대부분의 FORTH의 대화식 특성은 작은 모듈을 장려하고 해당 모듈을 신속하게 테스트함으로써 도움이됩니다. 파일 기반의 FORTH 인 D85는 모듈화를 강요하지 않았으며, D85를 사용하는 사람들은 많은 프로그래머에 대한 의식이 영원히 모듈로 작성되는 것을 보았습니다. 따라서 내 신념. (가치가있는 것에 대해 Liz Rather는 저와 동의하지 않습니다. 그녀는 그것이 주로 생산성 향상을 가져 오는 상호 작용이라고 생각합니다.)
John R. Strohm

2
+1 저에게 "컴퓨터 프로그래밍의 심리학"이라는 위대한 책을 소개합니다 :)
Samuel

30

정말로 적당한 크기는 무엇입니까?

사용하는 언어에 따라 다르지만 일반적으로 (나의 개인적인 취향에 따라) :

  • 이상적으로 , 25 줄 미만.
  • 수용 가능한 미만의 35 개 라인.

더 있다면 나중에 돌아와서 다시 작업해야 할 문제입니다.

그러나 현실적으로 , 당신이 무언가를 전달해야 할 때 필요하고 어떤 식 으로든 뱉어내는 것이 더 합리적이라고 생각하는 모든 크기는 때로는 선적하기 전에 누군가가 검토하기를 더 쉽게 만듭니다. (그러나 여전히 나중에 다시 가져옵니다).

(최근에 우리 팀은 코드베이스에서 프로그램을 실행했습니다. 우리는 197 개의 메소드를 가진 클래스를 찾았고 3 개의 메소드 만있는 클래스를 찾았지만 그 중 하나는 600 줄이었습니다. 귀여운 게임 : 2 악의 더 나쁜 점은 무엇입니까?)


이제 더 많은 대답을 얻으려면 ... 일반적으로 한 두 명의 위대한 인물을 인용하는 것이 좋습니다 (TM)으로 간주되므로 다음과 같습니다.

모든 것이 가능한 한 단순해야하지만 단순하지 않아야합니다. - 아인슈타인

더 이상 추가 할 항목이 없을 때가 아니라 더 이상 제거 할 항목이 없을 때 완벽하게됩니다. - 생 텍쥐페리 드 A.


주석 스타일에 대한 부록

이것에 대한 부록으로서, 함수는 그 의도를 설명하는 명확한 이름을 가져야합니다. 주석과 관련하여 일반적으로 함수 내부에는 주석을 달지 않습니다.

  • 코멘트"왜?" ,
  • 코드"어떻게?" .

각 기능의 맨 위에있는 설명 블록 (설명 필요)으로 충분합니다. 함수가 작고 함수 이름이 충분히 명시 적이라면 달성하고자하는 것과 그 이유를 말하면됩니다. 의도가 불분명 한 경우 25-35 라인 규칙을 위반하는 함수의 경우 일부 언어의 필드 또는 블록 시작에 대해서만 인라인 주석을 사용합니다. 예외적 인 상황이 발생할 때 코드 내에서 블록 주석을 사용합니다 (예를 들어 필요하지 않거나 수행하려는 catch 블록은 이유를 알려주는 주석이 있어야 함).

자세한 내용 은 스타일 및 주석 코드 권장 사항에 대한 답변 을 읽으십시오.


@haylem 나는 이것이 프로그래머의 Freddy 대 Jason의 버전이라고 생각한다 :-)
Gaurav

동의하지만 한 화면 페이지 크기로 추가해야합니다. 한 화면에 72 줄이있는 경우이 기능은 72 줄을 초과하지 않아야합니다.
표시 이름

@ 스크롤하지 않도록 단일 기능이 화면 페이지에 유지되도록하는 문제가 있지만 일반적으로 내 주요 관심사는 아닙니다. 내 관심사는 함수를 읽을 때 정보를 처리하는 데 걸리는 시간이며 25 줄로 명확하게 작성된 경우 거의 즉각적입니다. 함수 호출을 따르는 것이 문제가됩니다. 72는 나에게 너무 큽니다. (그리고 화면을 분할하면 어떻게 될까요? 글꼴에 따라 다릅니다. 그러나 권장 사항의 역사적 가치에 동의합니다)
haylem

1
물론 70 개의 다른 필드를 70 개의 다른 장소로 복사하는 기능이있는 경우도 있습니다. 나는 주로 tt이것들을 생성 하는 데 사용 하지만 때로는 어쨌든 관심있는 것을하지 않는 긴 엉덩이 기능 (또는 긴 엉덩이 기능)이 붙어 있기 때문에 실제 문제는 아닙니다.
구성자

1
함수가 예를 들어, Map(x => x.Property1); Map(x => x.Property2); Map(x => x.Property3);그것이 완전히 똑같다는 것이 분명합니다. (이것은 단지 예일 뿐이며, 이런 종류의 기능은 때때로 팝업됩니다)
구성자

12

제 생각에는 모든 기능은 가능한 한 작아야합니다. 각 기능은 한 가지 작업 만 수행하고 잘 수행해야합니다. 그것은 최대 길이 질문에 실제로 대답하지는 않지만 기능의 길이에 대한 나의 감정입니다.

밥 아저씨의 말을 사용하려면 "더 이상 추출 할 수 없을 때까지 추출하십시오. 떨어질 때까지 추출하십시오."


2
가능한 한 작은 의미는 무엇입니까? 각 기능에 두 줄이 있습니다. 하나는 단일 작업을 수행하고 다른 하나는 나머지를 수행하기 위해 함수를 호출하는 것입니다.
Kelmikra

10

건물의 최대 높이는 얼마입니까? 빌드 위치 또는 원하는 높이에 따라 다릅니다.
다른 도시에서 온 다른 사람들로부터 다른 답변을 얻을 수 있습니다.
일부 스크립트 함수 및 커널 인터럽트 처리기는 매우 깁니다.


전적으로 당신에게 동의합니다. 나는 은유를 좋아한다. :) 3 층 건물은 유효한 안전 출구를 어디에 둘지 모르는 바보 건축가에 의해 지어 졌을 수 있으며 다른 건물은 10 층이며 완벽한 건축 디자인이 될 수 있습니다. 가독성과 유지 관리 성은 크기 자체가 아닌 크기를 줄이는 방법을 리팩터링하는 주된 이유 여야한다는 점을 항상 명심해야합니다. 공상 과학 영화를 제외하고는 마천루의 90 %로 도시를 건설 할 수 없습니다. :)
Samuel

10

나를 위해 작동하는 방법은 다음과 같습니다. 더 긴 기능의 일부가 의미있는 이름을 줄 수 있습니까? 나는 방법의 길이가 좋은 명명과 같이 중요하지 않다고 생각합니다. 이 방법은 이름이 말하는 것을 더 이상해서는 안됩니다. 그리고 당신은 좋은 이름을 줄 수 있어야합니다. 메소드의 이름을 적절하게 지정할 수 없으면 코드가 잘 맞지 않을 수 있습니다.


그리고 당신의 방법은 좋은 이름을 가지기 위해 한 가지 일을해야합니다.
사무엘

9

필요한 작업을 수행해야하는 한 더 이상 필요하지 않습니다.


"c에서 말하는 것처럼,"포인터에 다른 포인터를 추가하여 해결할 수없는 문제는 없습니다. " 당신은 항상 그 아래에 다른 기능을 추가 할 수 있습니다. 그의 질문은 당신의 주현절에 대한 것입니다.
표시 이름

1
나는 실제로 그것을 뒤집어 "필요한만큼 짧지 만 짧지 않다"고 말하지만, 당신은 충분히 가까이 있다는 것에 대한 나의 +1을 얻는다 :)
Ben Hughes

6

트레이드 오프가 있다고 생각합니다. 짧은 메소드가 많으면 하나의 긴 메소드보다 디버그하기가 더 어렵습니다. 하나의 메소드 호출을 추적하기 위해 편집기를 20 또는 30 번 서로 다른 곳으로 이동해야하는 경우,이를 모두 머리 속에 두는 것은 어렵습니다. 한편 잘 작성된 명확한 방법이 있다면 100 줄이더라도 머리에 두는 것이 더 쉽습니다.

실제 질문은 왜 항목이 다른 방법으로 이루어져야하는지, 위의 답변은 코드 재사용입니다. 코드를 다시 사용하지 않거나 알지 못하는 경우 하나의 거대한 방법으로 코드를 남기고 재사용해야 할 때 재사용해야 할 부분을 분할하는 것이 좋습니다. 더 작은 방법으로 사용합니다.

실제로 좋은 방법 설계의 일부는 기능적으로 응집력있는 방법을 만드는 것입니다 (본질적으로 한 가지 일을합니다). 방법의 길이는 중요하지 않습니다. 함수가 잘 정의 된 것을 수행하고 1,000 줄이면 좋은 방법입니다. 함수가 3 개 또는 4 개의 작업을 수행하고 15 행에 불과하면 나쁜 방법입니다 ...


나는 짧은 방법을 좋아한다.
Marcie

방법이 10 줄을 넘지 않아야한다고 말하는 것이 유토피아라고 생각하기 때문에 당신이 말한 것을 좋아합니다. 좋아, 방법을 작성할 때마다 명심하는 것이 좋은 규칙이지만 1 + 1 = 2와 같은 수학 규칙이 아니어야합니다 .KISS, DRY, YAGNI 등과 같은 원리를 존중한다면 방법은 다음과 같습니다. 너무 길기 때문에 일부 세부 사항을 설명하는 주석이 가득하지 않습니다. 메소드에는 100 줄의 코드가있을 수 있으며 이해하고 유지하기 위해 완전히 깨끗할 수 있습니다. 그러나 습관보다는 예외가되어야합니다. 팩토리 방식의 스위치 케이스는 예외의 좋은 예라고 생각합니다.
사무엘

5

전체 기능을 한 번에 볼 수 있다면 내가하고있는 일을 추적하는 것이 더 쉽다는 것을 알게되었습니다. 다음은 함수 작성을 선호하는 방법입니다.

  1. 합리적인 글꼴로 모니터에 맞도록 짧습니다.
  2. # 1보다 길어야하는 경우 적절한 글꼴로 종이에 인쇄 할 수있을 정도로 짧습니다.
  3. # 2보다 길어야하는 경우 한 장의 용지에 2 장 인쇄 할 수있을 정도로 짧습니다.

그보다 더 긴 함수는 거의 쓰지 않습니다. 이들 중 대부분은 거대한 C / C ++ 스위치 문입니다.


모니터에 맞을 수있을 정도로 짧으면서도 좋지만 글꼴 유형과 크기를 지정하십시오. 우리는 2013 년에 종이에 코드를 인쇄하는 사람이 누구인지, 종이에 맞는지 확인하기 위해 인쇄하는 사람이 있기 때문에 종이가 내 관점에서 규칙이되어서는 안됩니다. IntelliTense와 같은 Visual Studio와 같은 도구를 사용하면 더 이상 종이로 코드를 분석 할 이유가 없습니다.
사무엘

5

나를 위해, 함수는 필요한 길이입니다. 내가 나누는 대부분의 시간은 코드를 재사용 할 때입니다.

기본적으로 나는 '높은 응집력, 낮은 결합력'을 고수하고 길이에 대한 제약은 없습니다.


5

문제는 함수가 얼마나 많은 작업을 수행해야 하는가하는 것입니다. 일반적으로 "한"작업을 수행하기 위해 100 줄이 필요한 경우는 거의 없습니다. 다시 말하지만 코드를 보는 수준에 따라 다릅니다. 암호 해싱이 한 가지입니까? 아니면 암호를 해시하고 저장하는 것이 하나입니까?

암호를 하나의 기능으로 저장하는 것으로 시작하십시오. 해싱이 다르다고 생각하고 코드를 리팩터링하십시오. 나는 어떤 방법으로도 전문 프로그래머가 아니지만 IMHO, 함수의 전체 아이디어는 작게 시작합니다. 함수가 많을수록 코드 재사용 가능성이 높고 두 곳 이상에서 동일한 변경을 할 필요가 없습니다. 등

1000 줄 이상을 실행하는 SQL 저장 프로 시저 를 보았습니다 . 저장 프로 시저 줄 수도 50보다 작습니까? 모르겠지만 코드를 읽습니다. 위 아래로 스크롤해야 할뿐만 아니라 "this does validate1", "this update in the database"등과 같은 몇 줄의 코드를 프로그래머에게 제공해야합니다.


첫 번째 단락에만 +1 다른 모든 것은 당신이 작업하는 사건과 관련이 있습니다.
표시 이름

5

에서 복잡성을 (위키 백과)

소스 코드 섹션의 순환 복잡도는 소스 코드를 통한 선형으로 독립적 인 경로의 수입니다.

  • 단일 방법으로 해당 숫자를 10 미만으로 유지하는 것이 좋습니다. 10에 도달하면 리팩터링해야합니다.

  • 코드를 평가하고 순환 복잡도를 제공 할 수있는 도구가 있습니다.

  • 이러한 도구를 빌드 파이프 라인에 통합하려고 노력해야합니다.

  • 말 그대로 메소드 크기를 쫓지 말고 복잡성과 책임을 살펴보십시오. 하나 이상의 책임이있는 경우 리팩토링하는 것이 좋습니다. 순환 복잡성이 증가하면 리팩토링해야 할 때입니다.

  • 비슷한 피드백을 제공하는 다른 도구가 있다고 확신하지만 아직 조사 할 기회가 없었습니다.


예를 들지 않은 대규모 공공 저장소 중 하나의 실제 코드에서 순환 복잡성이 원시 SLOC와 매우 밀접한 상관 관계가있는 것으로 나타났습니다. 이것은 캐리지 리턴을 계산하는 것이 훨씬 쉽기 때문에 기본적으로 가치가 없습니다. (예, SLOC 게임을 할 수 있습니다. 솔직히, 여기 : 고용주에서 SLOC 메트릭을 게임하는 사람이 얼마 동안 월급을 계속받을 수 있습니까?)
John R. Strohm

4

일반적으로 메서드 / 기능을 1680x1050 모니터 화면에 맞는 것으로 유지하려고합니다. 맞지 않으면 도우미 메소드 / 함수를 사용하여 작업을 소포하십시오.

화면과 종이 모두에서 가독성을 향상시킵니다.


나는 똑같은 일을하지만 사용중인 글꼴 유형과 크기를 지정하는 것이 좋습니다. 나 자신을 위해, Scott hanselman이 제안한대로 크기가 14 인 "consolas"를 선호합니다. hanselman.com/blog/… 너무 큰 글꼴로 작업하는 것은 어렵지만 항상 방법이 가장 작아야한다는 것을 항상 기억하는 것이 가장 좋습니다.
사무엘

4

올바르게 최적화 될 수있을 정도로 짧음

정확히 한 가지 작업을 수행 할 수있는 방법은 짧아야합니다. 그 이유는 간단합니다. 따라서 코드를 올바르게 최적화 할 수 있습니다.

Java 또는 C #과 같은 JIT 언어에서는 JIT 컴파일러가 코드를 빠르게 생성 할 수 있도록 메소드가 단순해야합니다. 길고 복잡한 방법은 자연스럽게 더 많은 JIT 시간이 필요합니다. 또한 JIT 컴파일러는 소수의 최적화 만 제공하며 가장 간단한 방법 만이 기능을 활용할 수 있습니다. 이 사실은 Bill Wagner의 Effective C # 에서도 나타났습니다 .

C 또는 C ++와 같은 저수준 언어에서는 짧은 방법 (수십 줄 정도)을 갖는 것도 중요합니다. 이렇게하면 레지스터가 아닌 RAM에 로컬 변수를 저장할 필요가 최소화되기 때문입니다. (일명 '유출 등록')이 관리되지 않는 경우 각 함수 호출의 상대 비용이 상당히 높을 수 있습니다.

루비 나 파이썬과 같은 동적 언어에서도 짧은 메소드를 사용하면 컴파일러 최적화에도 도움이됩니다. 동적 언어에서는 기능이 '동적'일수록 최적화하기가 더 어렵습니다. 예를 들어, X를 사용하고 Int, Float 또는 String을 반환 할 수있는 긴 메서드는 각각 단일 형식 만 반환하는 세 개의 개별 메서드보다 훨씬 느리게 수행됩니다. 컴파일러가 함수가 반환 할 형식을 정확히 알고 있으면 함수 호출 사이트도 최적화 할 수 있기 때문입니다. 예를 들어 유형 변환을 확인하지 않습니다.


응용 프로그램의 약 99.999 %는 데이터베이스 액세스, 파일 액세스 또는 네트워크 대기 시간과 같은 프로그램의 속도를 늦추는 것들이 훨씬 더 많습니다. 방법을 설계하는 동안 속도를 생각하는 것은 게임, 실시간 응용 프로그램 또는 수많은 데이터로보고 할 수있는 다른 이유 일 수 있습니다. 그러나 좋은 점이지만 프로그래머만큼 작기 때문에 응용 프로그램에서 이러한 유형의 최적화를 수행 할 필요가 거의 없습니다.
사무엘

3

일부 함수는 본질적으로 복잡한 알고리즘을 구현하고 더 짧게 만들려고하면 새로운 짧은 함수 간의 상호 작용이 너무 복잡해져 순 결과가 단순하게 줄어들지 않기 때문에 어떤 것도 하드 라인 제한을 두지 않습니다. 또한 높은 수준의 추상화에서 "하나의 것"이 낮은 수준에서 "많은 것"일 수 있기 때문에 함수가 "하나의 것"만 수행해야한다는 생각이 좋은 가이드라고 생각하지 않습니다.

나에게 길이가 DRY를 미묘하게 위반하면 함수가 너무 길어서 함수의 일부를 새로운 함수 또는 클래스로 추출하면이를 해결할 수 있습니다. 그렇지 않은 경우 함수가 너무 길 수 있지만 함수 나 클래스를 쉽게 추출 할 수 있으므로 코드를 모듈 식으로 만들 수있어 예측 가능한 변경에 직면 할 경우 유용합니다.


함수는 특정 추상화 수준에서 "하나의"작업을 수행하며 해당 추상화 수준에 대해서만 걱정합니다. 그게 요점입니다. 당신이 그것을 이해할 수 없다면, 나는 당신이 추상화를 이해한다고 생각하지 않습니다.
Zoran Pavlovic

3

그것은 코드에 무엇이 있는지에 달려 있습니다.

나는 아무런 문제가없는 천 줄의 루틴을 보았습니다. 그것은 거대한 스위치 문장이며, 옵션은 12 줄을 초과하지 않았으며 모든 옵션의 유일한 제어 구조는 단일 루프였습니다. 요즘에는 객체로 작성되었지만 그 당시에는 옵션이 아니 었습니다.

나는 또한 내 앞에서 스위치에서 120 라인을보고 있습니다. 가드, 과제, 휴식 등 3 줄을 넘지 않아야합니다. 텍스트 파일을 구문 분석하고 객체를 사용할 수 없습니다. 다른 대안은 읽기가 더 어렵다.


2

대부분의 컴파일러는 함수의 길이를 신경 쓰지 않습니다. 기능은 기능적이어야하지만 이해하기 쉽고 사람에게 변화와 재사용이 용이해야합니다. 가장 적합한 길이를 선택하십시오.


1

내 일반적인 규칙은 기능이 화면에 맞아야한다는 것입니다. 이것을 위반하는 경향이있는 세 가지 경우가 있습니다 :

1) 디스패치 기능. 옛날에는 이것들이 일반적 이었지만 요즘 대부분은 객체 상속으로 대체되었습니다. 그러나 객체는 프로그램 내에서만 작동하므로 다른 곳에서 도착한 데이터를 처리 할 때 가끔 디스패치 기능이 표시됩니다.

2) 목표를 달성하기 위해 전체 단계를 수행하고 단계가 세분화되지 않은 기능. 당신은 단순히 다른 함수의 긴 목록을 순서대로 호출하는 함수로 끝납니다.

3) # 2와 비슷하지만 개별 단계가 너무 작아서 개별적으로 호출되는 것이 아니라 단순히 인라인됩니다.


1

아마도 함수 길이가 그리 좋지 않을 수도 있습니다. 우리는 메소드에서도 사이클로 매틱 복잡성 을 사용하려고하며 클래스와 메소드에서 사이클로 매틱 복잡성이 X보다 낮아야한다는 미래의 소스 제어 체크인 규칙 중 하나입니다.

방법의 경우 X는 30으로 설정되어 있으며 매우 빡빡합니다.

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