2012-07-10 3 views
2

내가 배운 한 긴 작업 시퀀스가 ​​포함 된 메서드는 나쁜 것으로 간주되므로 다시 디자인해야합니다. 그보다는 메서드가 화면보다 커야한다는 의견이 들었습니다 (즉, 모든 메서드 코드가 스크롤없이 IDE 화면에 한 번에 표시되어야 함). 이에 대한 일반적인 규칙긴 방법은 나쁜 것입니까?

이 있습니까? 예를 들어, "메소드가 15 라인 이상인 경우 리팩터링되어야합니다". 그렇다면 어떻게 리팩토링합니까? 그냥 방법 추출 방법을 사용합니까?

답변

5

당신이 묻는 질문에 따라 다릅니다. Robert Martin은 두 가지 규칙이 있음을 알려줍니다.

  1. 방법이 작아야합니다.
  2. 방법은 그보다 작아야합니다.

줄 수의 관점에서 생각하지 마십시오. 라인 수는 임의적이며 중요하지 않습니다. 논리적으로 어떤 방법으로 인지에 관해서 생각해보십시오. 가장 좋은 규칙은 다음과 같습니다.

  • 방법은 한 가지를 수행해야합니다. 방법을 변경하는 단 하나의 이유가 있어야

    • :

  • 또는, 그것을 더 나은 방법을 넣어.

같은 다른 논리적 규칙과이 결합 (스틸, 나는 꽤 열심히 최근 청정 코드를 치는 봤는데 여기 삼촌 밥을 쏟아야.) :

그리고 일반적으로는입니다. 매우 작은 방법으로 끝납니다. 그러나 입니다. 대부분의 경우 "한 가지"는 한 줄의 코드로 표현되며 어쩌면 둘 또는 세 가지로 표현됩니다. 그러나 간단하고 표현이 풍부한 코드이며 "한 가지"가 무엇인지 분명합니다.

그러나 때때로, "한 가지"단계의 긴 순서입니다 (그리고 메소드의 이름은 물론, 명확하게 한 가지. 반영해야한다). 도메인의 단일 원자 프로세스를 캡슐화하는 메소드가있을 수도 있지만 그 프로세스는 12 개 이상의 단계로 구성됩니다. 각 단계는 자체 "하나의 것"이 될 것이며 내부적으로 다른 방법에서 다른 "한 가지"를 가질 것입니다.

각각의 방법은 "한 가지를 수행합니다.그러나 더 작은 단계를 더 큰 원자 프로세스로 집계하는 상위 수준의 캡슐화 방법은 "한 가지"가 더 작은 "한 가지"로 구성되어 있기 때문에 조금 더 오래 걸립니다. 이는 드문 일이지만 발생합니다. 그것은 하나의 메소드이며, 이것은 메소드 호출의 시퀀스 일뿐입니다. (이것이 긴 메소드의 변명이라고 할 수는 없습니다.) 코드의 로직을 조심스럽게 검사하여 더 큰 메소드를 실제로 다시 고려하는 것이 의미를.)

이 큰 봉지 방법은 종종 비즈니스 로직에 Transaction Script Pattern을 적용한 결과이다. 하나의 단계는 비즈니스 로직 내에서 여러 단계의 과정으로 구성되어 하나의 요청에 응답이있다.

방법 이어야합니다. 그들은 보다 작아야합니다. 그렇지 않은 경우 이유를 파악하기 위해 면밀히 조사하십시오. 들여 쓰기 수준이 둘 이상인 경우 일반적으로 다시 들여 쓰기해야한다는 신호입니다. 투입물로부터 여러개의 수표와 잔고가 있다면, 그것은 아마도 일부 리 팩터링을 사용할 수 있습니다. 이 방법이 두 가지 이상을 수행하거나 변경해야 할 하나 이상의 이유가있는 경우 은 확실히을 다시 고려해야합니다.

+2

저는 작은 메소드가 인수를 전달하고 더하기 크 러프트를 의미하기 때문에 "메소드가 * 작아야합니다"캠프에 있지 않습니다. 이는 빼기보다 혼동을 가중시킵니다. 나는 일관된 코드 덩어리가 명확하게 그룹화되어야한다고 믿는다. 이것은 사람들이하는 방법을 사용하는 것이다. 그러나 코드 블록이하는 일에 대해 간단히 "{...}"블록 앞에 코드를 넣는 것을 포함하여 다른 방법으로 그룹화 할 수 있습니다. 이를 통해 반드시 수많은 매개 변수를 전달하지 않고도 코드를 그룹화 할 수 있습니다. –

+2

@IraBaxter : 그렇습니다. 한정어가 있습니다. 방법은 작아야하지만, 작아서는 안됩니다. 특히 가독성과 유지 보수성을 희생 시키지는 않습니다. 당신이 말했듯이 그것은 문제가 될 수 있습니다. 코드를 개선하지 않고 맹목적으로 방법을 줄이는 것은 아무에게도 도움이되지 않습니다. 코드는 논리적이고 직관적으로 이해되어야합니다. 이것이 진정한 궁극적 인 규칙입니다. 그 밖의 모든 것은 그 목표를 뒷받침하는 부차적 인 것입니다. 예를 들어, 메소드의 크기를 줄이면 인수의 수가 늘어납니다. 그러면 인수가 헛되지 않았습니다. 그것들은 줄어들지 만, 그들은 결합되지 않았다. – David

0

그것은 일반적으로 작은 것들에 큰 기능을 분할하는 아주 좋은 생각입니다.
잘 디자인되어 있고 무슨 일이 일어나고 있는지 쉽게 이해할 수 있다면 문제가되지 않습니다. 그러나 함수가 클수록 그렇게하는 것이 어렵습니다. 기능을 간단하게 유지하면 나중에 문제를 쉽게 추적 할 수 있습니다.

0

초기 프로그래머는 메서드 길이를 단 10 줄로 제한했습니다. 그들의 방법이 더 길면, 그것들을 나눠 버리는 것보다. 이것은 오래된 프로그래밍 스타일이며 더 이상 널리 사용되지 않습니다. 대부분의 전문가들은 방법이 될 수있는만큼 오래 할 수 있다는 데 동의합니다. (논리적 인 단절 지점이없는 한 그것들은 분해되어서는 안됨을 의미 함)

개인적으로, 나는 더 짧은 방법을 위해 노력한다. 그러나 그 말은, 은 논리적 인 단점이 명백한 경우를 제외하고는 길게 끊어 버릴 점을 말하지 않습니다. 이것의 유일한 이유는 단지 코드를 읽고 디버그하기가 더 쉽다는 것입니다. 특히 메소드 이름이 설명적인 경우.

+0

초기 프로그래머? 저는 1968 년부터 코딩을 해왔고 아마도 Neandrethal과 가까울 것입니다.하지만 저는 10 라인의 "메소드"를 코딩하라는 훈계를 기억하지 않습니다. 스타일 인자는 대부분의 현재 프로그래머가 태어나 기 이전부터 잘 진행되어 왔으며 각각의 프로그래머는 일반적으로 실행 가능한 무언가에 도착했습니다. –

+0

"초기 프로그래머"는이 정보를 우리에게 전달할 때 교수가 사용했던 구입니다. 나는 이것이 프로그래밍의 초기에 표준이라는 것을 의미하지 않는다고 확신한다. 오히려 프로그래밍에 대한 초기 생각 학교였습니다. – dykeag

+0

프로그래밍에 관한 수많은 생각들이 있습니다. 오래된 안개와 조니 - 올 - 최근 요즘. 나는 나의 이의 제기가 그들 중 누구도 유익한 방식으로 지배적이라는 apparant 주장이라고 생각한다. –

관련 문제