기능이 너무 짧을 수 있습니까? 작성하는 것을 발견 할 때마다 일반적으로 함수에

동일한 논리를 두 번 이상 작성하는 것을 발견 할 때마다 일반적으로 함수에 고정하므로 응용 프로그램에 단 하나의 위치 만 있으므로 해당 논리를 유지해야합니다. 부작용은 때때로 다음과 같은 하나 또는 두 개의 라인 기능으로 끝나는 것입니다.

function conditionMet(){
   return x == condition;
}

또는

function runCallback(callback){
   if($.isFunction(callback))
     callback();
}

이것이 게 으르거나 나쁜 습관입니까? 이것은 매우 작은 수의 논리를 요구하는 함수 호출이 더 많기 때문에 묻습니다.



답변

브라운 씨, 제가 만난 모든 개발자들이 이만큼 작은 기능을 유지하도록 설득 할 수 있다면 소프트웨어 세계가 더 좋은 곳이 될 것입니다.

1) 코드 가독성이 10 배 증가합니다.

2) 가독성으로 인해 코드 프로세스를 쉽게 파악할 수 있습니다.

3) 건조-스스로 반복하지 마십시오-당신은 이것을 잘 준수하고 있습니다!

4) 테스트 가능. 작은 기능은 우리가 너무 자주 보는 200 개의 라인 방법보다 테스트하기가 백만 배 더 쉽습니다.

아, 그리고 성능면에서 “기능 호핑”에 대해 걱정하지 마십시오. “릴리즈”빌드와 컴파일러 최적화는이를 매우 잘 처리하며 시스템 디자인의 다른 부분에서 성능은 99 %입니다.

게으른가요? -정반대!

이것은 나쁜 습관입니까? – 절대적으로하지. 타르 볼이나 “하느님 물체”보다 방법을 만드는 것이 더 흔합니다.

내 동료 장인의 좋은 일을 유지하십시오.)


답변

리팩토링 된 메소드가 다음 중 하나이면 너무 짧습니다.

  • 메소드를 작성하는 것 외에 다른 목적으로 원시 조작을 복제합니다.

전의:

boolean isNotValue() {
   return !isValue();
}

또는…

  • 이 코드는 한 번만 사용되며 그 의도를 한눈에 쉽게 이해할 수 있습니다.

전의:

void showDialog() {
    Dialog singleUseDialog = new ModalDialog();
    configureDialog(singleUseDialog);
    singleUseDialog.show();
}

void configureDialog(Dialog singleUseDialog) {
    singleUseDialog.setDimensions(400, 300);
}

이것은 유효한 패턴이 될 수 있지만,이 예제에서 configureDialog () 메소드를 인라인하려고합니다.


답변

기능이 너무 짧을 수 있습니까? 일반적으로

실제로 다음을 보장하는 유일한 방법은 다음과 같습니다.

  1. 디자인에서 모든 클래스를 찾았습니다.
  2. 당신의 기능은 한 가지 일을하고 있습니다.

기능을 최대한 작게 유지하십시오. 즉, 더 이상 추출 할 수 없을 때까지 함수에서 함수를 추출하십시오. 나는 이것을 “떨어질 때까지 추출”이라고 부릅니다.

이것을 설명하기 위해 : 함수는 변수로 통신하는 기능의 덩어리가있는 범위입니다. 클래스는 변수로 통신하는 기능 덩어리가있는 범위이기도합니다. 따라서 긴 함수는 항상 작은 메소드를 가진 하나 이상의 클래스로 대체 될 수 있습니다.

또한 함수에서 다른 함수를 추출 할 수있을만큼 큰 함수는 정의에 따라 둘 이상의 작업을 수행 합니다 . 당신은 그래서 만약 서로 기능을 추출, 당신은 해야 그 기능의 압축을 풉니 다.

어떤 사람들은 이것이 기능의 확산으로 이어질 것이라고 걱정합니다. 그들이 맞습니다. 그렇습니다. 실제로 좋은 일입니다. 함수에는 이름이 있기 때문에 좋습니다. 좋은 이름을 선택하는 데주의를 기울이면이 기능은 다른 사람에게 사용자의 코드를 지시하는 사인 포스트 역할을합니다. 실제로, 이름이 잘 지정된 네임 스페이스 내의 이름이 잘 지정된 클래스 내의 이름이 지정된 함수는 독자가 길을 잃지 않도록하는 가장 좋은 방법 중 하나입니다.

cleancoders.com의 Clean Code의 에피소드 III에 더 많은 내용이 있습니다.


답변

와우, 대부분의 답변은별로 도움이되지 않습니다.

ID가 정의 인 함수는 작성하지 않아야합니다 . 즉, 함수 이름이 단순히 영어로 작성된 함수의 코드 블록 인 경우 함수로 작성하지 마십시오.

귀하의 기능 conditionMet과 다른 기능을 고려하십시오 addOne(내 녹슨 JavaScript 용서하십시오).

function conditionMet() { return x == condition; }

function addOne(x) { return x + 1; }

conditionMet적절한 개념적 정의입니다. addOneA는 동어 반복은 . “조건 충족”이라고 말하면 conditionMet무엇이 conditionMet수반 되는지 모르기 때문에 좋지만 addOne영어로 읽어 보면 어리석은 이유를 알 수 있습니다 .

"For the condition to be met is for x to equal condition" <-- explanatory! meaningful! useful!

"To add one to x is to take x and add one." <-- wtf!

여전히 거룩 할 수있는 것들에 대한 사랑을 위해, 긴장된 기능을 쓰지 마십시오!

(같은 이유로 모든 코드 줄에 주석을 쓰지 마십시오 !)


답변

의견을 추가하여 일부 코드의 의도를 개선 할 수 있다고 생각한다면 해당 의견을 추가하는 대신 코드를 자체 메소드로 추출하십시오. 아무리 작은 코드라도

예를 들어 코드가 다음과 같은 경우

if x == 1 { ... } // is pixel on?

대신 다음과 같이 만드십시오.

if pixelOn() { ... }

function pixelOn() { return x == 1; }

즉, 메서드 길이가 아니라 자체 문서화 코드에 관한 것입니다.


답변

이것이 바로 당신이하고 싶은 것이라고 생각합니다. 현재이 기능은 한두 줄일 수 있지만 시간이 지남에 따라 커질 수 있습니다. 또한 더 많은 함수 호출을 통해 함수 호출을 읽고 내부에서 발생하는 상황을 이해할 수 있습니다. 이렇게하면 코드를 매우 건조 하게 만들 수 있습니다 (반복하지 마십시오) .


답변

내가 본 다른 모든 게시물에 동의합니다. 이것은 좋은 스타일입니다.

최적화 기가 호출을 최적화하고 코드를 인라인 할 수 있으므로 이러한 작은 메소드의 오버 헤드는 크지 않을 수 있습니다. 이와 같은 간단한 코드는 옵티마이 저가 최상의 작업을 수행 할 수 있도록합니다.

명확성과 단순성을 위해 코드를 작성해야합니다. 방법을 두 가지 역할 중 하나로 제한하려고합니다. 의사 결정; 또는 작업 수행. 이것은 한 줄 방법을 생성 할 수 있습니다. 이 작업을 잘 수행할수록 코드를 더 잘 찾을 수 있습니다.

이와 같은 코드는 높은 응집력과 낮은 결합을 갖는 경향이 있으며 이는 우수한 코딩 관행입니다.

편집 : 메소드 이름에 대한 참고 사항. 메소드가 수행하지 않는 방식을 나타내는 메소드 이름을 사용하십시오. verb_noun (_modifier)가 좋은 이름 지정 체계라는 것을 알았습니다. Select_Customer_Using_NameIdx가 아닌 Find_Customer_ByName과 같은 이름이 지정됩니다. 두 번째 경우는 방법이 수정 될 때 잘못되기 쉽습니다. 첫 번째 경우 전체 고객 데이터베이스 구현을 교체 할 수 있습니다.