작은 반복적 인 코드 세그먼트에 대해 함수 / 메소드를 작성하는시기에 대한 좋은 코드 관행은 무엇입니까?


12

더 큰 프로그램을 작성하는 동안 여러 번 나는 코드를 함수 나 메소드에 넣는 것이 얼마나 많은 복사 및 붙여 넣기가 좋은지, 그리고 좋은 경험 법칙은 무엇인지에 대해 의문을 제기했습니다. 나는 4 줄 이상의 엄지 손가락 규칙을 사용하고 두 번 이상 나타나고 그 코드를 포함하는 간단한 함수 / 메소드를 만듭니다. 더 나은 방법을 생각하거나 조언을 줄 수 있습니까? 이것은 언어 별 질문보다는 일반적인 디자인 패턴 질문입니다.

답변:


29

코드를 문서화하는 방법으로 부분적으로 함수를 사용합니다. 의미있는 이름으로 함수를 호출하면 코드를 더 쉽게 이해할 수 있습니다. 경우에 따라 한 줄의 기능조차도 의미가 있습니다.

예를 들어 "Clean Code"에서 Robert C. Martin은 다음 예제를 제공합니다. 어느 것을 보시겠습니까? 이:

// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
    (employee.age > 65))

아니면 이거?

if (employee.isEligibleForFullBenefits())

나는 항상 그에게 동의하지는 않지만이 경우에는 동의합니다. 코드는 코드를 작성할 때뿐만 아니라 모든 세부 사항을 알고있을 때뿐만 아니라 다른 사람의 코드에서 버그를 수정해야하는 오후 9시에 읽을 수 있어야합니다. 긴 상태를 응시하고 모든 이중 음성을 알아내는 것은 권장되지 않습니다. 이름을 입력 할 수 있다면 (조건뿐만 아니라 작성하는 모든 코드) 훨씬 간단 해집니다.

함수에 무언가를 넣는 것을 후회 한 적이 없으며 성능이 걱정된다면 먼저 프로파일하십시오.


2
이 간단한 연습을 따르면 응용 프로그램 코드를 비교적 높은 수준으로 작성할 수 있습니다. 작은 함수는 작은 클래스로 수집되며 곧 기능 사양을 거의 단어에 대한 코드로 변환합니다.
케빈 클라인

11
나는이 예를 좋아했다. 갑자기 더 이상 그 의견이 필요하지 않습니다. 이것은 경험규칙입니다 . 주석을 변수 또는 함수 이름으로 변환 할 수 있다면 그렇게하십시오!
Karoly Horvath

나는 여기에서 omrib에 동의합니다. 코드 정리에 관한 것입니다. 다른 법칙보다 더 읽기 쉽습니다. 무언가를 재사용하면 메소드로 추출합니다. 그러나 내 IDE와 툴링이 종종 도움이되므로 쉽고 빠릅니다.
트래비스

+1 이런 종류의 코드는 적어도 JIT가 필요한 경우 더 빠를 수도 있습니다. 사용한만큼만 지불하면됩니다.
Job

1
의도 공개 이름 이라고도 합니다.
rwong

13

반복적 인 코드 세그먼트를 피하기 위해 함수 호출을 수행해야한다는 오해가 널리 퍼져 있습니다. 제 경험에 따르면 논리적 인 작업 단위는 단일 장소에서만 사용되는 경우에도 기능으로 만들어야합니다. 이것은 일반적으로 가독성을 높이고 함수 이름이 주석을 대체하고 수행중인 작업을 설명하는 추가 주석을 작성할 필요가없는 자체 문서화 코드를 작성할 수있게합니다.


1
댓글 작성을 피하기 위해 프로그래머가 어떤 길이로 갈 것입니까?
Alger

1
@Alger 그대로
MatrixFrog

6

여러 곳 에서 사용하는 경우

  • 변경 될 가능성이 있거나
  • 제대로하기가 까다 롭습니다

그런 다음 함수 또는 메소드로 만드십시오. 내 경험상 반복되는 긴 코드 조각은 자연스럽게 이러한 범주 중 하나에 속합니다 (보통 첫 번째 범주이지만 범주는 많이 중복됩니다). 물론, 인터페이스에 있어야하는 것은 그 자체로 기능 / 방법입니다.


3
문제는 바로 올바른 코드를 변경하거나 변경하기가 쉽지 않더라도 일반적으로 반복되는 코드에 대해 함수를 작성하지 않는 이유는 무엇입니까? (내 경험에 비추어 볼 때 : 반복적이고 길게 함수를 호출하면 함수로 만듭니다)
Winston Ewert

나는 더 나아갈 것입니다. 프로그래머는 모든 종류의 반복 을 제거해야합니다 . 데이터베이스에 있는지 (정규화), 일부 수동 테스트 (단위 테스트로 대체) 또는 배포 (자동화)입니다.
Karoly Horvath

@Winston : 사용되는 언어에 따라 다릅니다. 모든 구문을 함수로 자연스럽게 캡처 할 수있는 것은 아니며, 함수가 원래 코드보다 더 많은 공간을 차지할 수 있으며 (C를 생각하고 포인터로 리턴) 함수 호출에 오버 헤드가 발생할 수 있습니다.
Fred Foo

@larsman, 당신이 "(C를 생각하고 포인터로 리턴)"으로 무엇을 말하는지 궁금합니다. 그러나 당신이 말하는 것은 내가 경험하는 엄지 손가락으로 달성하려는 것입니다. 함수를 호출하는 것이 더 쉬워야하고 (즉, 자연스럽게 캡처하고 공간을 덜 차지함) 함수의 내용을 구현해야합니다.
Winston Ewert

코드 조각이 여러 값을 계산하는 경우 (예 float x: int ydouble density) 이러한 계산을 C 함수로 설정하는 것은 코드를 반복하는 것보다 까다로울 수 있습니다. 세 개의 값을 모두 가져 오는 방법을 고안해야하기 때문입니다. 반복 된 계산 자체가 사소한 경우에는 때때로 인라인으로 두는 것이 좋습니다.
Fred Foo

4

거의 항상, 특히 각 복제본이 개념적 관점에서 동일한 작업을 나타내는 경우. 동일한 방식으로 수행되지만 다른 유형으로 수행되는 경우 일반적인 구현을 수행하십시오.

내가 생각할 수없는 유일한 이유는 유지 보수 중 하나입니다. 때로는 중복이 발생하더라도 별도의 항목 사이에 종속성을 피하는 것이 더 편리 할 수 ​​있습니다.


오리 타이핑을 조심하십시오. 지금 은 구현이 비슷하지만 기능이 실제로 다르기 때문에 두 가지를 병합하면 다시 분리하기가 어려워집니다. 특히 IDE 지원이 열악한 언어 (이봐, C ++에서 일한다 ...)
Matthieu M.

반면에 그것들을 분리함으로써 테스트 할 같은 일을하는 두 가지 기능, 코드가 실행될 확률의 절반, 같은 버그가 발생할 수있는 두 곳이 있으며 그 중 하나를 수정 해야하는 것을 기억해야합니다 버그가 아직 감지되지 않았습니다. 나는 여전히 C ++에서 일하고 싶습니다. ;-)에도 불구하고 열악한 IDE 지원
26 분에 Nicola Musatti

1

" 리팩토링 "을 검색 하면이 매우 일반적인 프로세스에 대한 업계 "모범 사례"에 대한 많은 리소스가 제공됩니다. 다소 유명한 기사 인 Once and Only Once 는 질문에 의해 제기 된 문제에 대한 "모범 사례"로 어떤 견해를 설명하는 위대한 역사적 참고 자료입니다. 또한 훨씬 일반적인 개념은 DRY (Do n't Repeat Yourself) 로 알려져 있습니다. 귀하의 질문에 대한 답변을 정말 깊이있는 세트의 읽기, 마틴 파울러 의 위대한 고전, 리팩토링 : 기존 코드의 디자인 개선 을 위해 가장 잘 알려진 조언의 일부를 포함, 리팩토링 직관적 달성 하려는지 인을, !


0

코드가 두 번 이상 정확하게 반복되고 가까운 시일 내에 반복 섹션이 변경되지 않으면 코드를 함수로 분리합니다.


1
변경 될 경우 리팩토링해야 할 더 많은 이유가 있습니다. 그러면 한 번만 변경하면됩니다
SHug

0

이는 반복되는 코드의 응집 특성에 달려 있습니다. 반복되는 코드 섹션이 특정 기능을 수행하는 경우, 부분적으로 는 DRY 원칙 으로 인해 메소드로 만들 수있는 훌륭한 후보입니다. 처리 할 코드

연관이 우연의 일치라면 코드를 메소드로 만드는 것보다 반복하는 것이 좋습니다. 해당 스 니펫의 사용 중 하나를 만족시키기 위해 코드 시퀀스 중 하나의 중간에 무언가를 추가해야하는 경우, 메소드에서 변경 한 경우 해당 메소드의 다른 사용에 영향을 줄 수 있습니다.

코드 응집 개념에 대한 Wikipedia 기사를 참조하십시오 .


연관성이 우연적으로 보이는 경우 두 프로세스가 공통된 아이디어를 공유 할 가능성이 높으며 두 프로세스가 실제로 동일한 두 가지 측면인지 여부를 탐색해야합니다. 종종 그렇지 않습니다.
거짓말 라이언

0

구조적 프로그래밍 의미의 함수와 클래스의 메소드를 구별해야합니다.

귀하의 예에서, 당신이 보여준 것은 인라인으로 코딩되어서는 안되는 방법 입니다.

문자열이 숫자인지 아닌지 확인하기 위해 문자열의 유효성을 검사해야 할 수도 있습니다.이 경우 함수 를 사용 하고 대부분의 이전 답변이 적용됩니다.

이 차이는 대규모 프로젝트에서 특히 중요합니다.

가능한 많은 방법으로 비즈니스 규칙 (메소드)을 컴퓨팅 알고리즘 (순수한 프로그래밍 함수)과 분리하십시오.

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