“속성”을 구성하는 것은 언어 별 질문이며,“속성”의 호출자가 기대하는 것은 언어 별 질문이기 때문에 이것에 대한 언어 독립적 인 대답이 없다고 생각합니다. 나는 이것에 대해 생각하는 가장 유익한 방법은 발신자의 관점에서 어떻게 보이는지 생각하는 것이라고 생각합니다.
C #에서 속성은 (전통적으로) 대문자로 표시되지만 (메소드와 유사하지만) 괄호 (공개 인스턴스 변수와 같이)가 없다는 점에서 차별화됩니다. 설명서가없는 다음 코드가 표시되면 무엇을 기대하십니까?
var reciprocalHeading = myHeading.Reciprocal;
상대 C # 초보자이지만 Microsoft의 Property Usage Guidelines를 읽는 사람 은 다음 Reciprocal
과 같은 것들을 기대 합니다.
Heading
수업 의 논리적 인 데이터 멤버이다
- 내가 값을 캐시 할 필요가 없도록 호출 비용이 저렴합니다.
- 관찰 가능한 부작용이 없음
- 연속해서 두 번 호출하면 동일한 결과를 생성합니다
- (아마)
ReciprocalChanged
이벤트를 제안하십시오
이 가정들 중 (3)과 (4)는 아마도 맞을 것입니다 ( 이완의 답변Heading
에서와 같이 불변의 값 유형 이라고 가정 ) (어떤 불구하고 의미 론적 의미를 가지고 제목을 아마해야 이벤트). 이것은 C # API에서 "가상 수를 얻거나 계산하는 것"이 속성으로 구현 되어서는 안되며 특히 계산이 저렴하고 불변 인 경우 경계선 인 경우를 제안합니다 .HeadingChanged
Heading
(그러나 속성을 호출하면 (2)가 아니라 새 인스턴스를 생성 하는지 여부와 관련이 없습니다. CLR에서 객체를 만드는 것 자체는 꽤 저렴합니다.)
Java에서 특성은 메소드 이름 지정 규칙입니다. 내가 보면
Heading reciprocalHeading = myHeading.getReciprocal();
내 기대는 위의 것과 비슷합니다 (명확하게 명시되지 않은 경우). 나는 전화가 저렴하고 dem 등하 며 부작용이 없을 것으로 기대합니다. 그러나, 자바 빈즈 프레임 워크 외부에서 "속성"의 개념이 자바의 의미, 특히 결코 상응하는 불변의 특성을 고려할 때 모든하지 setReciprocal()
의 getXXX()
규칙은 지금은 다소 구식이다. 에서 효과적인 자바 , 두 번째 버전 (현재 이미 8 년 이상 된) :
boolean
호출 된 객체 의 비 기능 또는 속성 을 반환하는 메소드 는 일반적으로 명사, 명사구 또는 동사로 시작하는 동사구로 명명됩니다 get
… 으로 시작하는 세 번째 형식 만 get
허용되지만이 주장에 대한 근거는 거의 없다고 주장하는 성명서가 있습니다. 처음 두 형식은 일반적으로 더 읽기 쉬운 코드로 이어집니다… (p. 239)
그렇다면 현대적이고 유창한 API에서 볼 것으로 예상됩니다.
Heading reciprocalHeading = myHeading.reciprocal();
이것은 호출이 저렴하고 dem 등성이 있으며 부작용이 없음을 다시 제안하지만 새로운 계산이 수행되는지 또는 새 객체가 작성되는지에 대해서는 아무 말도하지 않습니다. 이건 괜찮아; 좋은 API에서는 신경 쓰지 않아야합니다.
루비에는 속성 같은 것이 없습니다. “속성”이 있지만 내가 볼 경우
reciprocalHeading = my_heading.reciprocal
나는 간단한 접근 자 메소드 @reciprocal
를 통해 인스턴스 변수에 액세스 attr_reader
하는지 또는 비싼 계산을 수행하는 메소드를 호출하는지 여부를 즉시 알 수있는 방법이 없습니다 . 그러나 메소드 이름이 단순한 명사라는 사실은 calcReciprocal
다시 말하지만 호출이 적어도 싸고 아마도 부작용이 없음을 시사합니다.
스칼라에서 명명 규칙은 부작용이있는 메소드는 괄호를 사용하고 그렇지 않은 메소드는 그렇지 않지만
val reciprocal = heading.reciprocal
다음 중 하나 일 수 있습니다.
// immutable public value initialized at creation time
val reciprocal: Heading = …
// immutable public value initialized on first use
lazy val reciprocal: Heading = …
// public method, probably recalculating on each invocation
def reciprocal: Heading = …
// as above, with parentheses that, by convention, the caller
// should only omit if they know the method has no side effects
def reciprocal(): Heading = …
(주 스칼라는 것을 허용 그럼에도 불구하고 각종 물건 낙담 에 의해 스타일 가이드를 .이 스칼라 내 주요 불만 중 하나입니다.)
괄호가 없으면 전화에 부작용이 없다는 것을 알 수 있습니다. 이 이름은 통화가 상대적으로 저렴해야 함을 나타냅니다. 그 외에도 나는 그것이 어떻게 가치를 얻는 지 상관하지 않습니다 .
한마디로 : 사용중인 언어와 다른 프로그래머가 API에 어떤 기대를 가져다 줄지 알 수 있습니다. 그 밖의 모든 것은 구현 세부 사항입니다.
Heading
아니라 불변 유형reciprocal
으로 새로운 것을 반환하는Heading
것은 "성공의 피"모범 사례입니다. (두 번의 호출에서 경고는reciprocal
"같은 것"을 반환해야한다. 즉, 그들은 평등 테스트를 통과해야한다.)