boolean (물음표 없음)을 반환하는 Java 메서드에 대한 명명 규칙


94

다른 언어의 메서드 / 함수 이름 끝에 물음표를 사용하는 것을 좋아합니다. Java는 이것을 허용하지 않습니다. 해결 방법으로 Java에서 부울 반환 메서드의 이름을 어떻게 지정할 수 있습니까? 을 사용하여 is, has, should, can어떤 경우에는 괜찮 방법 사운드의 전면입니다. 그러한 방법의 이름을 지정하는 더 좋은 방법이 있습니까?

예를 들어 createFreshSnapshot?


2
?메서드 이름에 허용되는 언어는 무엇입니까 ?
— SLaks

11
@SLaks, Scheme, Ruby ...
— Skilldrick

체계에서, 우리는 항상 p메소드 이름의 끝에를 넣습니다
— Erick Robertson

@Erick : 항상하지만, "P"는 지정 조건의 하나의 표준 방법입니다
— 제이슨 S

우리 = 나의 학부 계획 수업은 항상 그랬습니다. Java에서는이 규칙을 사용하지 않습니다.
— Erick Robertson

답변:


123

대회는 이름으로 질문하는 것입니다.

다음은 JDK에서 찾을 수있는 몇 가지 예입니다.

isEmpty()

hasChildren()

이렇게하면 끝에 물음표가있는 것처럼 이름이 읽 힙니다.

컬렉션이 비어 있습니까?
이 노드에 자식이 있습니까?

그리고 나서, true예를 의미하고 아니오를 false의미합니다.

또는 주장처럼 읽을 수 있습니다.

컬렉션이 비어 있습니다.
노드에는 자식이 있습니다.

참고 :
때때로 메소드의 이름을 createFreshSnapshot?. 물음표가 없으면 이름은 스냅 샷이 필요한지 확인하는 대신 메소드가 스냅 샷을 작성해야 함을 의미합니다.

이 경우 실제로 무엇을 요구하는지 다시 생각해야합니다. 이와 같은 isSnapshotExpired이름은 훨씬 더 나은 이름이며 메서드가 호출 될 때 알려줄 내용을 전달합니다. 이와 같은 패턴을 따르면 부작용없이 더 많은 기능을 순수하게 유지할 수 있습니다.

Java API에서 Google 검색 을 수행 isEmpty()하면 많은 결과를 얻을 수 있습니다.


createFreshSnapshot은 어떻습니까?
— letronje

4
@letr, 글쎄, 나는 아마도 그것을 lit isSnapshotExpired또는 비슷한 이름으로 바꿀 것 입니다. (귀하의 기준에 따라)
— jjnguy

8
즉, "shouldCreateFreshSnapshot ()"(이 경우 isSnapshotExpired ()가 더 있지만) - 나는 단어 '해야'를 사용하여 'createFrshSnapshot'문제를 피해 갈
— DJClayworth

1
하트 비트 메시지를 shouldHeartbeat()메소드 로 보내야하는지 확인합니다 .
— Erick Robertson

왜 그렇게 생각 isEmpty()하고 hasChildren()있습니다 질문 , 그리고 주장 ? 그 이름을 단언이나 술어로 생각하면 실제로 영어로 약간 더 잘 읽습니다.
— rick

29

클래스가 Java Beans 사양 과 호환되기를 원하면 리플렉션을 사용하는 도구 (예 : JavaBuilders , JGoodies Binding )가 getXXXX()또는 isXXXX()메서드 이름으로 부울 게터를 인식 할 수 있습니다 . Java Beans 사양에서 :

8.3.2 부울 속성

또한 부울 속성의 경우 getter 메서드가 패턴과 일치하도록 허용합니다.

public boolean is< PropertyName > ();

이것은 "<이다 PROPERTYNAME 방법 대신"GET <제공 될 수있다>는 " PROPERTYNAME >"법, 그것은 "GET <외에 제공 될 수 PROPERTYNAME >"방법. 두 경우 모두 부울 속성에 대해 "is < PropertyName >"메서드가 있으면 "is < PropertyName >"메서드를 사용하여 속성 값을 읽습니다. 부울 속성의 예는 다음과 같습니다.

public boolean isMarsupial();
public void setMarsupial(boolean m);

public boolean is<PropertyName>(); 제네릭처럼 보인다고 말하면 혼란 스럽습니다 .
— Erick Robertson

이봐, 나는 단지 사양을 인용하고있다. 사양에 따라 이탤릭체로 표시하겠습니다.
— Jason S

4
나는 자바 콩 호환성 있습니다 ABT 상관 없어, 난 그냥 내 메소드 이름은 바로 :) 소리를 할
— letronje

4
Javabeans 호환성에 관심이 없더라도 명명 규칙은 IDE에서 구성되는 '빈'의 원래 범위를 넘어서 성장했기 때문에 따를 가치가 있습니다. 예를 들어 isEmpty를 메서드 이름으로 사용하는 경우 object.empty를 사용하여 JSP에서이 메서드를 호출 할 수 있지만 다른 접두사가있는 메서드를 호출 할 수 없으므로 object.children을 사용하여 object.hasChildren ()을 호출 할 수 없습니다. 따라서 JSP 및 EL (Expression Language)을 사용하면 Javabeans 속성에 액세스 할 수 있습니다. 저에게 물어 보면 큰 승리입니다.
— Stijn de Witt

JavaBeans는 매우 구체적입니다.이를 상기시켜 주셔서 감사합니다. 나는 종종 내가 'is'접두사에 갇혀 있다고 생각하고 생각하는 경향이 있지만 실제로는 전혀 그렇지 않습니다.
— Snicolas

26

이 링크를 게시하고 싶습니다.이 답변을 확인하고 더 많은 자바 스타일 규칙을 찾는 친구들에게 더 도움이 될 수 있습니다.

자바 프로그래밍 스타일 가이드 라인

항목 "2.13 은 부울 변수 및 메서드에 사용되어야하는 접두사입니다." 특히 관련성이 있으며 is 접두사를 제안합니다 .

스타일 가이드는 다음을 제안합니다.

일부 상황에 더 적합한 is 접두사에 대한 몇 가지 대안이 있습니다. 다음은 has , can 및 should 접두사입니다.

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

지침을 따르는 경우 적절한 방법이 다음과 같이 명명 될 것이라고 생각합니다.

shouldCreateFreshSnapshot()

2
참고로, 지침은 Geotechnical Software Services에 저작권이 있습니다. 즉, 그들은 합법적이라고 제안하기 위해 하단의 출처를 참조했습니다.
— Donal Lafferty

11

실패 할 수있는 메서드, 즉 반환 유형으로 부울을 지정하면 접두사를 사용합니다 try.

if (tryCreateFreshSnapshot())
{
  // ...
}

다른 모든 경우에는 is.. has.. was.. can.. allows....


15
그러나 try는 그것이 질문이라는 것을 전달하지 않습니다 (반환 값이 있음).
— Steve Kuo

메서드가 실패했는지 여부를 나타내는 부울을 반환하지 마십시오. 메서드가 실패하면 예외를 throw합니다. 방법이 실패하고 거짓이 발생했다고 상상해보십시오. 정확히 무엇이 잘못되었는지 어떻게 판단 할 수 있습니까?
— Wouter van Koppen 19.10.29

5

표준은 'is'또는 'has'를 접두사로 사용하는 것입니다. 예를 들어 isValid, hasChildren.


2

is내가 다른 어떤 것보다 더 많이 만난 것입니다. 하지만 현재 상황에서 의미가있는 것이 최선의 선택입니다.


0

이 일반적인 명명 규칙 에 대해 다른 관점을 가리키고 싶습니다 . 예 :

java.util.Set 참조 :boolean add​(E e)

근거는 다음과 같습니다.

일부 처리를 수행 한 다음 성공 여부 를 보고 합니다 .

(가) 동안 return실제로하는 boolean메소드의 이름을 가리켜 야한다 완료 처리를 대신의 결과 유형 (이 예를 들어, 부울).

귀하의 createFreshSnapshot예는 다음을 의미하는 것처럼 보이 므로이 관점과 더 관련이있는 것 같습니다. 새 스냅 샷을 만든 다음 만들기 작업이 성공했는지보고하십시오. 이러한 추론을 고려할 때 이름이 createFreshSnapshot귀하의 상황에 가장 적합한 것 같습니다.


1
왜 당신이 반대표를 받는지 잘 모르겠습니다. 동의합니다. 나는 그것을 사용하지 않더라도 의미 론적이지 않기 때문에 많은 내부 Java API에서 사용하는 규칙입니다.
— Kamil Bęben

1
처음에는 "Set : boolean add (E e)"만 썼기 때문에 사람들이 잘 알려진 java.util.Set에 대해 알아 차리지 못했습니다. 아니면 내 영어가 너무 나빠서 : D.
— 투표 해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.