간단한 Getter / Setter 주석


124

getter 및 setter에 주석을 달기 위해 어떤 규칙을 사용합니까? 이것은 예를 들어 꽤 오랫동안 궁금해했던 것입니다.

/**
 * (1a) what do you put here?
 * @param salary (1b) what do you put here?
 */
public void setSalary(float salary);

/*
 * (2a) what do you put here?
 * @return (2b)
 */
public float getSalary();

나는 항상 1a / b와 2a / b에 대해 거의 똑같은 것을 쓰고 있다는 것을 알았습니다. 1a) 직원의 급여를 설정하고 1b) 직원의 급여를 설정합니다. 너무 중복되는 것 같습니다. 이제 더 복잡한 것을 볼 수 있습니다. (a) 부분에 더 많이 작성하여 컨텍스트를 제공 할 수 있지만 대부분의 getter / setter에 대한 표현은 거의 동일합니다.

간단한 게터 / 세터의 경우 (a) 부분 또는 (b) 부분 만 채우는 것이 괜찮은지 궁금합니다.

어떻게 생각해?


54
제발, 금전적 (예 : 여기 급여)에는 부동액을 사용하지 마십시오. 예를 들어 stackoverflow.com/questions/965831/…
Jonik

3
대신 BigDecimal을 사용하십시오.
Josep 2013

답변:


83

저는 보통 setter의 경우 param 부분을 채우고 getter의 경우 @return 부분을 채 웁니다.

/**
 * 
 * @param salary salary to set (in cents)
 */
public void setSalary(float salary);

/**
 * @return current salary (in cents, may be imaginary for weird employees)
 */
public float getSalary();

그렇게하면 javadoc 검사 도구 (예 : Eclipse의 경고)가 깔끔하게 나오고 중복이 없습니다.


오타를 수정할 수 있습니까? "@return part for setters"
Jonik

1
salary ()의 주석에도 오타가 있습니다. JavaDoc 주석이 아닙니다.
Fostah 2009-06-22

1
나는 이것이 접근 자에게 댓글을 달기위한 최선의 접근 방식이라는 데 동의합니다.
Fostah 2009-06-22

31
우리 도구에서 지나치게 현명한 경고를 침묵시키기 위해 코드에 노이즈를 추가하는 것은 나에게 잘못되었다고 느낍니다. 프로그래머에게 가치를 더하지 않는다면, 올바른 해결책은 도구의 자세한 정도를 낮추거나 수정하거나, 도구가 우리에게 보상을주기 위해 농구를 뛰어 넘는 것에 대해 얼마나 신경 쓰는지를 완화하는 것입니다. 분석 도구는 우리를 위해 더 무의미한 작업을 생성하는 것이 아니라 우리를 돕고 노력을 절약하도록되어 있습니다.
Lyle 2011 년

1
@Lyle 사실 일 수 있지만 프로그래머가 단순히 메소드 서명 만하는 것보다 더 나은 getter / setter를 설명 할 수있는 유용한 것이 거의 항상 있다고 느낍니다. 예, 프로그래머가 게으르고 주석에서 메서드 서명을 반복하는 경우가 있지만 일반적으로 말하면 강제로 유용한 동작이라고 생각합니다.
Matt Vukas 2014 년

174

절대적으로 무의미합니다. 이런 종류의 쓰레기가 코드를 어지럽히 지 않는 것이 좋습니다.

/**
 * Sets the foo.
 * 
 * @param foo the foo to set
 */
public void setFoo(float foo);

보증되는 경우 매우 유용합니다.

/**
 * Foo is the adjustment factor used in the Bar-calculation. It has a default
 * value depending on the Baz type, but can be adjusted on a per-case base.
 * 
 * @param foo must be greater than 0 and not greater than MAX_FOO.
 */
public void setFoo(float foo);

특히 속성이 실제로 의미하는 바에 대한 설명은 도메인 모델에서 중요 할 수 있습니다. 투자 은행가, 생화학 자 또는 양자 물리학 자만 이해하는 모호한 이름의 속성으로 가득 찬 콩을 볼 때마다 setGobbledygook () 메서드가 "구 블디 국을 설정"한다고 설명 할 때마다 누군가 목을 졸라 매고 싶습니다.


2
내 감정이 정확히 말하면, 최악은 도메인 전문가 만이 부동산이 의미하는 바를 아는 도메인 특정 모델입니다.
ThaDon 2009-06-23

7
유용하더라도 getFoo ()에 대해 무엇을 하시겠습니까? getFoo ()에 대해서도 동일한 주석을 복사 하시겠습니까?
Vinoth Kumar CM

3
@cmv : 분명히 "param"부분은 복사되지 않습니다. 정보를 두 접근 자 모두에게 첨부하는 것이 정보 복제를 직접적으로 정당화하는지 여부는 결정되지 않았습니다. 아마도 그렇습니다. 둘 다에 하나의 주석을 첨부하는 방법이 더 좋습니다. 나는 이것이 Project Lombok에서 가능하다고 믿습니다.
Michael Borgwardt 2011 년

@VinothKumar : getter의 속성 ( "Foo는 막대 계산에 사용되는 조정 요소"에서와 같이)과 setter의 값 변경 효과 (또는 필요한지 여부)를 간단히 설명하는 것이 더 좋을 것입니다. 또는 그 값을 초기화하지 마십시오-대답의 예에서는 "Baz 유형에 따라 기본값이 있기 때문에 Foo를 초기화 할 필요가 없습니다.")
freitass

+1 "투자 은행가, 생화학 자 또는 양자 물리학 자만 이해하는 모호한 이름"
Jackson

36

내가 도울 수 있다면 일반적으로 아무것도 아닙니다. 게터와 세터는 자명해야합니다.

답이없는 것처럼 들리지만 설명이 필요한 부분에 대해 설명하는 데 시간을 사용하려고합니다.


5
이 줄에 따른 또 다른 유효한 대답은 "게터와 세터가있는 디자인은 캡슐화 개념을 제대로 이해하지 못합니다."입니다. :)
Trejkaz

2
@Trejkaz : 접근 자 메서드가 읽기 전용 또는 쓰기 전용 속성과 다형성 (및 랩핑, 프록시 등)을 허용하기 때문에 사실이 아닙니다.
Laurent Pireyn 2011

2
그것들은 그러한 것들을 허용 할 수 있지만, 종종 빌더 패턴이 setter를 대체 할 수 있거나 (덜 변경 가능) 방문자 패턴이 getter를 대체 할 수 있습니다 (더 유연합니다.)
Trejkaz

나는 확실히 빌더 패턴을 좋아하고 사용하지만, (예를 들어 Hibernate에서) POJO에 대한 지원이 너무 많아서 게터와 세터가 더 좋든 나쁘 든 여전히 매우 눈에 띄는 위치를 차지합니다. Java, IMHO에 대한 가장 까다로운 점이며 10 년 넘게 반복적 인 JavaDocs를 작성한 후 @sleske의 조언을 구독 할 준비가되었습니다.
Michael Scheper 2013 년

34

getter와 setter에 일종의 부작용이 있거나 초기화 외부의 전제 조건이 필요한 경우에만 주석을다는 것에 대해 걱정한다고 말하고 싶습니다 (예 : 데이터 구조에서 항목을 제거하거나 필요한 것을 설정하기 위해 x와 y를 먼저 배치). 그렇지 않으면 여기에있는 주석이 상당히 중복됩니다.

편집 : 또한, getter / setter에 많은 부작용이 관련되어있는 경우 getter / setter를 다른 메서드 이름 (예 : 스택에 대해 푸시 및 팝)으로 변경하고 싶을 수 있습니다. [감사합니다. 아래 댓글]


10
모든 개발자가 주석을 읽는 것은 아니므로 부작용이있는 게터의 이름을 더 명확하게 변경해야합니다.
akf 2009-06-22

괜찮습니다.하지만 API 사용자가 부작용 이 있었다면 문서화되었을 것임을 알아야합니다 !
oxbow_lakes

akf, 게시 후 정확히 생각했습니다. :) 내 응답에 추가 할 것 같아요.
Gopherkhan 2009-06-22

1
하지만 "멍청한"게터와 세터를 문서화하지 않으면 (나도 선호하는 것입니다!)-javadoc 누락에 대한 Eclipse 경고를 어떻게 제거합니까? 그런 경고로 내 작업 공간을 어지럽히고 싶지는 않지만 다른 모든 방법에 대해 해당 경고가 비활성화되는 것도 원하지 않습니다.
Zordid

12

주석이 JavaDocs (브라우저에서)로 표시 될 때 사람들이 무엇을 보길 원하는지 자문 해보십시오. 많은 사람들은 문서가 뻔하기 때문에 필요하지 않다고 말합니다. 필드가 비공개 인 경우에는 유지되지 않습니다 (개인 필드에 대해 JavaDocs를 명시 적으로 설정하지 않는 한).

귀하의 경우 :

public void setSalary(float s)
public float getSalary()

급여가 무엇으로 표시되는지 명확하지 않습니다. 센트, 달러, 파운드, 인민폐?

setter / getter를 문서화 할 때 인코딩에서 무엇을 분리하고 싶습니다. 예:

/**
 * Returns the height.
 * @return height in meters
 */
public double getHeight()

첫 번째 줄은 높이를 반환한다고 말합니다. 반환 매개 변수는 높이가 미터 단위임을 문서화합니다.


1
나는 당신에게 동의하지만, 함수 주석이 잘못 선택된 비명 시적 함수 이름을 나타내지 않도록해야한다고 생각합니다.
karlipoppins

저는 JavaDocs의 큰 지지자이자 자체 문서화 코드의 큰 지지자이기도합니다. 그래서 적어도 세터에게는 public void setSalary(float aud)(또는 더 현실적으로 public void setSalary(BigDecimal aud)) 같은 것을 할 것 입니다. 더 좋은 점은 속성이 유형이어야 abstract class CurrencyAmount하고 속성이 java.util.Currency currencyjava.math.BigDecimal amount. 내가 함께 일한 대부분의 개발자는 JavaDoc에 대해 매우 게으르지 만 이와 같이 API를 적용하면 문제가 줄어 듭니다.
Michael Scheper

단위가 미터 / 초와 같은 SI 단위 인 경우 문서화 할 필요가 적습니다. Si 단위가 아니면 비표준 단위 (예 : heightFeet
AlexWien)

8

필드 값과 getter 및 setter의 참조를 주석 처리 할 수 ​​있도록 참조 태그를 포함하지 않는 이유는 무엇입니까?

/**
* The adjustment factor for the bar calculation.
* @HasGetter
* @HasSetter
*/
private String foo;

public String getFoo() {
  return foo;
}

public void setFoo() {
  this foo = foo;
}

따라서 문서는 필드뿐만 아니라 getter 및 setter에도 적용됩니다 (개인용 javadocs가 켜져있는 경우).


나는 동의한다. 그리고 저는 깨달았습니다. 왜이 모든 상용구를 작성하는 것일까 요? Project Lombok에 대한 내 대답을 참조하십시오.
Michael Scheper 2014

7

이러한 종류의 상용구는 Project Lombok 을 사용하여 피할 수 있습니다 . 필드 변수를 문서화하십시오.private 되며 Lombok 주석이 적절하게 문서화 된 getter 및 setter를 생성하도록합니다.

저에게있어이 혜택만으로도 비용의 가치가 있습니다 .


4

기본적으로 포괄적 인 문서화가 시간 낭비라고 말하는 답변에 대해 정말 실망합니다. API의 클라이언트는 호출 된 메소드 setX문서에서 그렇게 명확하게 말하지 않는 한 표준 JavaBean 속성 설정 자임을 어떻게 알 수 있습니까?

문서가 없으면 호출자는 메서드에 부작용이 있는지 알 수 없습니다.

호출 된 메서드 setX가 속성을 설정하는 것보다 훨씬 더 많은 작업을 수행하는 어려운 방법을 알아내는 불행을 겪은 사람은 저 뿐만이 아닙니다.


11
문서가 없으면 호출자는 setX라는 메서드가 X를 설정한다고 가정합니다. setX가 실제로 X를 설정하면 다른 중요한 작업을 수행하지 않고 문서가 필요하지 않습니다.
mqp 2009-06-22

훌륭합니다! 이제이 회사는 API를 코딩하고있는 CrudTech가 귀하의 관례를 따르거나이 스레드의 다른 사람을 따르나요? Hmmmm
oxbow_lakes 2009-06-22

5
메소드가 가격 속성에 대한 값을 설정하기 만하면 setPrice 문서에 "가격 설정"을 기록 할 필요가 없지만, 예를 들어 totalPrice 속성을 업데이트하고 세금을 다시 계산하는 경우 이러한 동작은 분명히 문서화되어야합니다.
João Marcus

8
당신은 "이것은 당신이 기대하는 바를 수행한다"는 문서를 요구하는 것 같습니다. 이것은 커피 한 잔에 "Caution : HOT"라고 쓰는 것과 비슷합니다. 완벽한 세상에서는 그런 말을 할 필요가 없습니다.
Kevin Panko

1
예-같은 것 같은 메서드 setX가 예상과 다른 부작용이 있는 API를 사용 했기 때문에 이것이 완벽한 세상이 아니라는 확신을 가지고 말할 수 있습니다.
oxbow_lakes

4

getter / setter에 특별한 작업이 없으면 일반적으로 다음과 같이 작성합니다.

Javadoc 사용 (개인 옵션 사용) :

/** Set {@see #salary}. @param {@link #salary}. */
public void setSalary(float salary);

및 / 또는

/** 
 * Get {@see #salary}.
 * @return {@link #salary}.
 */
public float salary();

Doxygen 사용 (개인 추출 옵션 사용) :

/** @param[in] #salary. */
public void setSalary(float salary);

/** @return #salary. */
public float salary();

2
이 접근법의 문제점은 Javadoc이 기본적으로 개인 문서를 생성하지 않는다는 것입니다! 이 경우 {@see #salary}생성 된 문서에서 참조 태그 가 유효하지 않습니다.
Jarek Przygódzki

1

특히 접근 자에 대해 아무 작업도 수행하지 않는 경우 주석을다는 것은 불필요하며 손끝을 낭비합니다.

당신의 코드를 읽는 누군가 person.getFirstName()가 그 사람의 이름 을 반환하는 것을 이해하지 못한다면 , 그를 해고하기 위해 당신의 능력으로 모든 것을 시도해야합니다. 데이터베이스 마법을 사용하고 주사위 몇 개를 던지고 이름을 얻기 위해 이름 비서에게 전화를 걸면 사소한 작업이라고 가정하고 잘 문서화하는 것이 안전합니다.

반면에, 당신 person.getFirstName()이 사람의 이름을 돌려주지 않는다면 ... 글쎄, 거기 가지 말자, 우리?


6
getFirstName ()이 null을 반환하면 어떻게됩니까? 어디에 문서화됩니까?
Steve Kuo

security.getFinalMaturity ()는 어떻습니까? 모든 속성 이름이 즉시 이해할 수있는 의미를 갖는 것은 아닙니다. 그게 무슨 뜻인지 모르기 때문에 해고 당하고 싶습니까?
Michael Borgwardt

방법이 swizzling으로 구현되면 어떻게됩니까? 명확하게 문서화되지 않은 한 어떻게 알 수 있습니까? 의사가 말하지 않는 한 표준 세터라는 것을 어떻게 알 수 있습니까?
oxbow_lakes

2
get / set은 제 생각에 getter와 setter를 위해 예약되어야합니다. 데이터베이스 조회 이름은 "lookupPerson"등으로 지정해야합니다.
Thorbjørn Ravn Andersen

1

필드 이름이 내용을 충분히 설명하는 경우 아무것도 입력하지 마십시오.

일반적으로 코드는 자립하고 가능하면 주석 처리를 피하십시오. 리팩토링이 필요할 수 있습니다.

편집 : 위의 내용은 게터와 세터 만 참조합니다. 나는 사소한 것이 아닌 것은 적절하게 javadoc되어야한다고 믿습니다.


1
주석 달기와 문서화에는 차이가 있습니다.
Tom Hawtin-tackline

1
매우 사실입니다. 그렇기 때문에 게터와 세터에 대해 주석을 달지 않습니다. 설명은 자명해야하며 주석을 추가하면 코드가 자명하지 않음을 나타냅니다.
Thorbjørn Ravn Andersen 2009-06-22

0

(b) 부분을 채우는 것이 좋습니다. 특히 필드 선언에 필드가 무엇인지 나타내는 주석을 넣는 경우에는 더욱 그렇습니다.


좋지 않다-사람들은 현장 댓글을 읽지 않습니다. Javadoc은 기본적으로 개인 문서도 생성하지 않으며 IDE는 메서드 호출에 대한 빠른 도움말을 사용할 때 필드 문서를 표시하지 않습니다.
Trejkaz

사람들은 필요하지 않는 한 필드 주석을 읽지 않습니다. 필요한 정보가 많을수록 좋습니다.
akf

0

javadoc이 아무것도 추가하지 않으면 javadoc을 삭제하고 자동 생성 된 주석을 사용합니다.


0

나는 항상 둘 다 작성합니다. 입력에 소요되는 추가 시간은 무시할 수 있으며 일반적으로 정보가 많을수록 더 좋습니다.


"이것은 속성 설정자입니다"라고 말하면 자명합니다. 그렇지 않으면 API의 클라이언트가 실제로 방법 내부에 무슨 일이 일어나고 있는지 전혀 생각이없는 것은
oxbow_lakes

1
자기 설명에 대해 누가 말했습니까?
Paul Sonier 2009-06-22
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.