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 , canshould 접두사입니다.

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.