코드 형식 : 클래스 파일 내에서 호출 계층 구조를 기반으로 함수를 배치합니까?


10

Bob Martin의 "청결한 코드"에서 제안한 내용으로 인해 머리가 긁혔습니다. "한 번 함수가 다른 함수를 호출하면 수직으로 가까이 있어야하고 호출자는 수신자 위에 있어야합니다."

지금까지 나는 클래스 멤버를 유형 (속성, ctor, 함수) 및 가시성 (public / prot. / private)으로 그룹화하는 .Net 지침에 거의 충실했습니다. 팁은 처음에는 문제가있는 것 같지만 "그냥 효과가있을 것"입니다. 개인적으로이 레이아웃이 마음에 들었습니다. 올바른 콜 체인에있을 때 쉽게 드릴 다운 할 수 있습니다.

팁 뒤에있는 아이디어는 적절 해 보이지만 "이 클래스의 공개 인터페이스를 보자"와 같은 다른 시나리오는 더 나빠질 수 있습니다. 어쩌면 밥 아저씨는 작은 클래스들과 타입보기를위한 IDE 지원에 의존하고 있습니다.

누구든지 오랫동안 이것을 사용해 보셨습니까?

업데이트 : 코드 스 니펫이 정상인 것처럼 보입니다.

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}

2
엄청나게 "Uncle Bob"은 상자에서 가장 날카로운 연필이 아닙니다.
Neil Butterworth

1
그 아이디어는 단지 "나쁜 세부 사항 전에 큰 그림을 알려줘"입니다. 필요에 따라 조정하십시오.
Ryan Culpepper

2
내가 Neil의 의견에 동의한다는 것을 알았 기 때문에 Eagles는 다시 함께 가야 할 것입니다. PASCAL과 함께 자랐고 PASCAL 컴파일러가 참조되기 전에 모든 것을 정의해야했기 때문에 "작은 것들을 먼저 입력"하고 FORWARD 선언은 일반적으로 눈살을 찌푸 렸습니다.
John R. Strohm

@Neil-나는 출처에 관계없이 조언의 장점을 판단하려고 노력하고있다. @ John-팁은 정방향 선언과 반대입니다. 호출자를 먼저 배치합니다. 'callee'는 호출자 바로 아래에 선언됩니다.
Gishu

@ryanc-그 단락의 서문은 "밀접하게 관련된 / 응집력있는"개념이 서로 수직으로 가까워 져야 함을 강조합니다 [무엇을 알아 내려고 할 때 스크롤하는 것을 방지합니다]. 호출 된 함수는 호출 순서대로 호출자 아래에 배치됩니다. 추가 코드 스 니펫 참조
Gishu

답변:


2

나는 여기 사지에 나갈 수도 있지만, 사용하는 도구가 이것에 영향을 미치는지 궁금합니다. 개발자가 해야하는 IDE 편집기 결정과 텍스트 편집기를 언급하고 있습니다.

IDE에는 소스 파일을 볼 수있는 훨씬 더 많은 기능이 있습니다. 일반적으로 가시성에 따라 알파벳순으로 정렬 된 메소드 목록을 가져 오거나 사이드 바에서 리턴 유형을 얻을 수 있습니다. 메소드를 사용하는 경우 메소드로 이동할 수도 있습니다. 메소드의 콜 트리를 생성하고 드릴 다운 할 수도 있습니다. 또한 일반적으로 정규식을 지원할 수있는 강력한 찾기 명령이 있습니다. 이 상황에서 사용 가능한 소스 코드 이외의보기가 있으므로 작성하는 메소드 순서는 중요하지 않습니다.

텍스트 편집기에는 일반적으로 이러한 기능이 없습니다. 가장 가까운 것은 아마도 찾기 / 바꾸기 일 것입니다. 여기에서는 탐색하기가 더 어려울 수 있으므로 파일 구조에 더주의를 기울이려고합니다. 찾고자하는 것을 찾기 위해 파일을 스크롤하는 데 소요되는 시간을 최소화하고 일관성 있고 논리적 인 방법의 순서가 도움이 될 수 있습니다.


IDE의 경우 +1; IDE가 좋을수록 그러한 것들에 대해 걱정할 필요가 없습니다
user281377

1

요점은 물건을 부르는 것보다 물건을 부르는 것이 덜 흥미 롭다는 것입니다. 메소드가 다른 메소드를 호출할수록 해당 메소드가 오브젝트의 외부 API의 일부일 가능성이 높습니다 (구현 세부 사항이 아닌). 즉, 클래스의 외부 API (공용 메서드, 해당 언어가 해당 개념을 지원하는 경우)는 자연스럽게 파일의 맨 위에 오기를 원하므로 해당 메서드를 쉽게 찾을 수 있습니다. 반대로, 도우미 기능 등은 파일의 맨 아래에 "원합니다".

(나는 그 효과를 평가하지 않고 개념을 설명하고 있습니다.)


그렇습니다.하지만 모든 공용 함수는 하나의 그룹으로 파일의 맨 위에 떠 있어야 함을 의미합니다. 전통적인 접근. 제안 된 접근 방식은 다릅니다 (또는 적어도 그것을 읽는 방법). 문제의 업데이트 참조
Gishu

그렇습니다. 공개 기능이 맨 위에 표시됩니다. 물론 일부 언어에는 가시성 수정자가 전혀 없습니다.
Frank Shearar

1

연장 된 기간에 이틀 이상을 의미한다면? 그런 다음 호
년의 부부 나는 몇 가지 새로운 코드에이 일을 시작 전에 내가이 정지 될 때까지 천천히, 미친 자신을 몰았다.

개인 클래스를 배치 선호입니다

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

그러나 그것은 종교적이지 않으며, 속성과 방법이 섞일 수 있습니다. 공개되지 않음 (공개 / 보호 / 개인별로 그룹화하지 않음)

우리는 여기 사무실에있는 사람이 클래스 파일의 모든 것에 대해 엄격한 구조를 유지하며 모든 것이 기본 그룹과 하위 그룹으로 그룹화되어 지역에 멋지게 중첩되어 있습니다. . . 나는 지역이 사탄의 일이라고 생각해야한다.

나는 그의 수업 중 하나를 열 때마다 조금 안에서 죽습니다.


나는 냄새를 가리기 위해 지역이 추가 된 큰 수업을 옹호하지 않습니다. 종교적인 태도를 가지려고하지 않고 프로젝트 내에서 일관된 레이아웃을 유지하면 어디를보아야하는지 알 수 있습니다. bu 가시성을 그룹화하여 공개 API를 가까이두면 특정 진입 점을 찾고 드릴 다운 할 수 있습니다.
Gishu

그리고 생성자? 그것들은 "방법들"하에 있습니까?
코디 그레이

@Cody Grey : 사과, ctors를 잊어 버렸습니다!
이진 걱정

@Gishu : 최신 시각화 및 탐색 도구로 엄격한 파일 레이아웃이 필요하지 않다는 것을 알게되었습니다. 사용법을 마우스 오른쪽 단추로 클릭하고 "정의로 이동"할 수있는 경우 메소드가 구현되는 위치가 중요합니까?
이진 걱정
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.