동사 인 명명 부울 필드


14

Java에서 규칙에 따라 부울 필드의 getter 및 setter는 isField()and setField()입니다. 이 같은 형용사 필드 이름과 완벽하게 잘 작동 active, visible, closed, 등

그러나 동사와 같은 동사의 의미가있는 필드의 이름을 어떻게 지정 haveChildren합니까? 동사 ( )에 “_ing”을 추가 하시겠습니까?havingChildren

명확히하기 위해 메소드 이름 (getter 및 setter)이 IDE에 의해 자동 생성되므로 제어 할 수 없습니다. 그래서 내가 필요한 것은 IDE가 getter를 생성 할 때 의미가 있도록 적절한 필드 이름입니다. 예를 들어, hasChildren완벽한 필드 이름이지만, IDE는 필드의 게터를 생성 할 때이 될 것이다 isHasChildren. 이 문제를 어떻게 해결합니까?


3
이것이 부울 필드 parent라면 효과가 있습니다.
yannis

2
의미를 뒤집어 놓을 수 없다면 '자녀'는 속임수입니다.
Kilian Foth

3
IDE로 인한 문법 문제를 피하기 위해 필드 이름과 관련하여 후프를 뛰어 넘어야하는 것은 어리석은 것처럼 보입니다. 어쨌든 여기에 다른 제안이 더 있다고 생각하지만 다음과 같은 추가 제안이 있습니다. isAllowedChildren, isNotEmpty, isContainer, isLeaf,
Dr. Wily 's Apprentice

자녀가없는 길인 것 같습니다. 부모의 문제는 부모 개체에 대한 참조를 보유하는 부모 필드가 이미 있다는 것입니다. 필요한 것은 모든 동사를 부울 필드의 형용사로 변환하는 일반적인 규칙이라고 생각합니다.
dnang

1
IDE가 이와 같은 것을 지시해서는 안된다는 @dnhang에 동의합니다. 변수와 메소드 이름을 선택하는 것은 코드를 읽을 수있게하는 데 중요하며, 작성된 IDE는 관련이 없습니다.
Digitalex

답변:


11

짧은 답변:

  • 메서드 이름은 내부 구현이 아니라 예상되는 동작을 반영하도록되어 있습니다.

긴 대답 :

haveChildren()이름을 지정해야합니다 hasChildren().

또한 필자는 hasChildren()부울 클래스 멤버의 getter 인 것으로 보지 않습니다 . 그런 방법은 유형의 멤버 Collection가 비어 있는지 여부를 알 수 있습니다.

IDE가 생성 된 게터에 제공하는 기본 이름이며 세터는 법으로 정해져 있지 않습니다.

또 다른 요점 : 인터페이스에는 아직 구현되지 않은 방법의 이름이 있습니다.

내부 구현을 반영하기 위해 메소드 이름을 가정했다면 어떻게 누군가가 인터페이스를 설계 할 수 있을까요? 인터페이스에는 구현이 없으며 구현자가 실제로 수행 할 작업을 미리 알고 있습니다.

Iterator자바 인터페이스 를 예로 들어 보자 .

구현할 Iterator때 이름이 부울 멤버 인 경우에도 또는 next로 이름 hasNext()을 바꾸지 않아도 됩니다. 그것은 구현 세부 사항입니다. 실제로, 내가 구현 했으며 내가하는 일은 클래스 에 부울이 아닌 목록이있는 유형의 멤버를 갖는 것 입니다. 그런 다음를 반환합니다 .isNext()isHavingNext()IteratornexthasNext()next!=null

또한 이것을보십시오 :

class patient {
      private boolean pulse;
      private boolean breaths:
      public boolean isDead(){ return (!pulse & !breaths);}
}

isDead()에는 정상 게터 없습니다.

IDE의 생산성 도구를 활용하십시오.


3

parentgetter가 isParent되고 setter가 되도록 필드의 이름을 바꾸는 것이 좋습니다 setParent.

또한 시도 할 수 있습니다 childPresent변수 이름과에 대한 isChildPresentsetChildPresent게터와 세터로.


1
위의 Yannis의 의견과 같은 아이디어이지만 문제는 이미 parent부모 개체에 대한 참조를 보유 하는 필드가 있다는 것 입니다. 필요한 것은 모든 동사를 부울 필드의 형용사로 변환하는 일반적인 규칙이라고 생각합니다.
dnang

0

does동사 앞에 놓을 수 있습니다. doesHaveChildren예를 들어 귀하가 제공 한 것과 같습니다 . 또는 shouldHaveChildren상황에 따라.


1
문제는 getter와 setter가 IDE (예 : Eclipse)에 의해 자동 생성되기 때문에 메소드 이름을 제어 할 수 없다는 것입니다.
dnang

1
메소드 이름을 바꾸시겠습니까? 키 바인드를 추가하여 메소드의 이름을 바꾸십시오 (아직없는 경우).
miguel.martin

@dnhang 코드 인 경우 IDE가 자동 생성시 호출하는 방식에 관계없이 원하는 방식으로 원하는 방식으로 메서드를 호출 할 수 있습니다.
Richard

1
@ miguel.martin 이것을 원하지 않는 한 가지 이유는 Java-beans입니다. 에 대한 가정은 isSomething그 사양의 일부이며, 더 나은 또는 더 나쁜 이유로, 이것에 반대 doesSomething하는 것은 그렇게 명백하지 않은 방식으로 일을 중단하여 버그로 이어질 수있는 많은 가정이 그 주위에 만들어졌습니다 .

0

문제는 완벽하게 합리적입니다. 때로는 자동 생성 방법의 이름을 바꾸는 것만으로는 충분하지 않습니다. 예 : JSF 관리 Bean은 특성 isXyz()의 getter 메소드로 예상됩니다 boolean xyz.

필드 이름을 바꾸고 메소드 이름으로 parent사용 하도록 제안하는 BlackPanther에 동의합니다 isParent. 정보 숨기기 원칙에 따라 getter 및 setter 메서드의 가독성이 속성보다 중요합니다.

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