Java 메소드 순서 규칙이 있습니까? [닫은]


159

코스 과정으로 제출할 패키지의 일부인 큰 클래스 (40 정도의 메소드)가 있습니다. 현재 유틸리티 공공 / 개인 등의 측면 에서이 방법이 상당히 혼란스럽고 합리적인 방법으로 주문하고 싶습니다. 이 작업을 수행하는 표준 방법이 있습니까? 예를 들어 일반적으로 필드는 메소드 앞에 나열되고 생성자는 다른 메소드 앞에 나열되며 getter / setter는 마지막입니다. 나머지 방법은 어떻습니까?


또한 이와 같은 코드로 작업 할 때 대부분의 IDE에서는 커서 아래에있는 모든 것에 대한 정의를 자동으로 볼 수 있습니다. 이것은 당신이 한 눈에 아무것도 할 필요가 없다는 것을 의미합니다.
— Thorbjørn Ravn Andersen

단일 클래스에 40 개의 메소드가있는 경우
— Ben

답변:


132

일부 규칙은 모든 공용 메소드를 먼저 나열한 다음 모든 개인 메소드를 나열합니다. 즉, 인터페이스가없는 경우에도 의미가 무엇인지 알더라도 API를 구현에서 쉽게 분리 할 수 ​​있습니다.

또 다른 아이디어는 관련 방법을 함께 그룹화하는 것입니다. 이렇게하면 기존 대형 클래스를 여러 개의 더 작고 대상이 지정된 여러 클래스로 분할 할 수있는 이음새를 쉽게 찾을 수 있습니다.


1
+1. 나는 가시성별로 정렬하는 것을 선호합니다. 부끄러운 이클립스는 자동 으로이 작업을 수행 할 수 없습니다 (항상 모든 생성자와 모든 메소드를 함께 그룹화합니다)
— finnw

16
@finnw, 버그 보고서를 제출하십시오. 낯선 것들이 그곳에서 구현 된 것으로 알려져 있습니다.
— Thorbjørn Ravn Andersen

3
@Ben : 제 경험은 "never"는 예외가 있다는 것입니다.
— Jon Skeet

1
주문 규칙이 더 이상 관련이없는 경우는 @JonSkeet입니다. 예를 들어 클래스를 테스트하십시오. 잘못된 코드를 작성하지 않는 것이 나쁜 코드를 정렬하는 방법보다 조언하는 것이 좋습니다.
— Ben

1
@Ben : 동의하지 않으면 동의해야한다고 생각합니다. 나는 관심사 등의 분리를 위반하지 않고 매우 자연스럽게 많은 멤버가있는 코드를 작성했습니다.
— Jon Skeet

121
  1. 클래스 (정적) 변수 : 먼저 공개 클래스 변수, 보호 된 변수 및 개인 변수.

  2. 인스턴스 변수 : 먼저 공개, 보호 및 비공개

  3. 생성자

  4. 방법 : 이러한 방법은 범위 나 접근성보다는 기능별로 그룹화해야합니다. 예를 들어 프라이빗 클래스 메서드는 두 퍼블릭 인스턴스 메서드 사이에있을 수 있습니다. 목표는 코드를 쉽게 읽고 이해하는 것입니다.

출처 : http://www.oracle.com/technetwork/java/codeconventions-141855.html


4
이것은 15 살이며 아마도 현대적인 IDE의 모습으로 약간 구식입니다.
— assylias

16
@assylias : IMO, 가독성은 IDE와 무관합니다. 개인 전에 공개하는 것이 일반적으로 좋습니다.
— saurabheights

40

«코드 규칙»에 대한보다 정확한 링크 : «클래스 및 인터페이스 선언»


8
+1, afaik-이것은 실제로 질문에 답변하는 유일한 게시물입니다. 예. Oracle 및 Sun에서 명시한 표준 순서가 있습니다. 1. 공개 의견, 2. 클래스, 3. 내부 의견, 4. 정적 데이터, 5. 인스턴스 데이터, 6. ctors, 7. 메소드 및 각 섹션 그룹 접근성에 의한 것이 아니라 논리적으로
— 존 헨켈

@VadimKirilchuk«인터넷 아카이브»가 다운…
— Timofey Gorshkov


15

보편적으로 인정되는 표준이 있는지는 확실하지 않지만 제 자신의 선호는 다음과 같습니다.

  • 먼저 생성자
  • 정적 메소드 다음, 항상 메인 메소드가있는 경우 항상 다른 정적 메소드 앞에
  • 다음은 일반적으로 메소드의 중요성 순서에 따라 정적 메소드가 아닌 메소드를 호출합니다. 이것은 다른 클래스 메소드를 호출하는 퍼블릭 메소드가 맨 위에 표시되고 다른 메소드를 호출하지 않는 개인 메소드는 일반적으로 맨 아래로 표시됨을 의미합니다.
  • 표준 방법 좋아 toString, equals하고 hashcode다음
  • 게터와 세터는 수업 하단에 특별한 장소가 있습니다.

제대로 작성된 생성자는 속성에 인수를 할당하는 것 외에는 다른 작업을 거의 수행하지 않기 때문에 생성자를 마지막으로 선호합니다.
— GordonM

@GordonM 왜 그렇게 생각하십니까? 나는 그 반대가 사실이라고 주장하기까지 갈 것이다. 항상 클래스에 가장 깨끗한 API를 생각해야합니다. 그리고 그것은 종종 그들이 저장되는 방식이 아니므로, 나는 종종 호출자를이 부담으로부터
— Neuron

@ GordonM 부작용에 대해 이야기하고 있지 않습니다. 따라서 전달 된 목록이나 비슷한 항목은 변경되지 않습니다. 그냥 전달하고 값을 설정하면 클래스의 경우 안 그것의 구현에 대해 많이 알 것을 요구한다
— 신경 세포

@LonelyNeuron 여기서 무슨 말을하는지 잘 모르겠지만 생성자가 인수를 내부 상태에 할당하는 것 외에 많은 설정 작업을 수행해야한다고 말하는 것 같습니다. 이것은 "마법"에 의해 일이 일어나고 있음을 의미하기 때문에 가장 잘못되었습니다. 호출 new Thing()하면 새로운 Thing이 인스턴스화됩니다. 데이터베이스 연결이 열리거나 파일이 작성되는 등의 결과를 초래해서는 안됩니다.
— GordonM

@LonelyNeuron 생성자에 종속성이 있다고해서 클래스의 구현에 대한 의존성 외에 다른 것을 알려주지는 않습니다. 이것은 나쁜 것이 아니라 좋은 것입니다.
— GordonM

12

하나의 클래스에서 40 개의 메소드는 약간 많다.

기능 중 일부를 다른 적절한 클래스로 옮기는 것이 합리적입니까? 그렇다면 이해하기가 훨씬 쉽습니다.

수가 적을수록 자연스럽게 읽는 순서대로 나열하는 것이 훨씬 쉽습니다. 빈번한 패러다임 중 하나를 목록 것들입니다 전에 또는 후에 당신은 당신이 그들을 필요로하는 순서를해야합니다.

이것은 일반적 main()으로 상단 또는 하단에 있음을 의미합니다 .



4
예를 들어 많은 메소드로 인터페이스를 구현하는 경우 항상 선택할 수있는 것은 아닙니다.
— finnw

5
이 때문에 단순히 다른 곳 갈 수 없어 많이있다, 안드로이드 활동 onPause(), onResume()등 내 모든뿐만 아니라, OnClickListener그들이 필드가 있지만, 모양 또는가 합리적인 그래서 그들처럼 행동하지 않는, 필드, 별도로 나열하십시오.
— Fredley

@finnw, 추상 클래스는이 목적을 위해 훌륭하고 사용 가능합니다.
— Thorbjørn Ravn Andersen

11

내 "컨벤션": 인스턴스 앞에 정적, 개인 앞에 공개, 메서드 앞에 생성자, 맨 아래에 기본 메서드 (있는 경우).



1

Eclipse를 사용하고 있습니까? 그렇다면 기본 멤버 정렬 순서를 고수 할 것입니다. 왜냐하면 코드를 읽는 사람에게 가장 친숙하기 때문입니다 (내가 가장 좋아하는 정렬 순서는 아니지만).

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