2008-11-04 5 views
4

나는 Java의 많은 부분 (C# 포함)에서 많은 "getter"메소드 앞에 "get"접두사가 있지만 다른 것들은 그렇지 않다는 것을 알았습니다. 나는 Sun이 따르는 패턴을 전혀 발견하지 못했다. getter 메소드 이름에 "get"을 사용하기위한 지침이나 규칙은 무엇입니까?메소드 이름에 "get"을 사용하는 가장 좋은 방법은 무엇입니까?

+0

C#에서는 필드를 사용하는 것처럼 느껴지도록 get 및/또는 set을 캡슐화하는 속성을 더 잘 사용해야합니다. –

답변

4

의미에 이릅니다. 예, C#에는 "메서드"스텁 가져 오기/설정을 제공하는 "속성"이 있지만 .NET Framework에서 "Get"으로 시작하는 함수 (... "메서드"...)는 개발자는 일부 작업이 결과를 얻기위한 유일한 목적으로 발생한다는 사실을 알게됩니다.

당신은 이상하게 생각할 수 있습니다. "왜 사람들이 단서 유형을 사용하지 않는 이유는 무엇입니까?"대답은 간단합니다.다음과 같은 방법을 생각해 :

public Person CreatePerson(string firstName, string lastName) {...} 

을 그냥 그 메소드의 이름으로, 당신은 아마 데이터베이스 활동 참여 후 새로 만든 "사람이"반환됩니다있을 것이라는 점을 알 수 있습니다.

하지만, 무엇 이것에 대해 :

public Person GetPerson(string firstName, string lastName) {...} 

그냥 으로 메소드의 이름, 당신은 아마 데이터베이스에서 사람의 100 % "안전"검색이 수행되고 있음을 가정 할 수있다.

"CreatePerson"을 여러 번 호출하지 않아도되지만 이 항상 "GetPerson"을 호출하는 것이 안전해야합니다. (응용 프로그램의 '상태'에 영향을주지 않아야 함).

+0

C#에서 함수는 종종 대문자로 시작한다는 것을 알고 있습니다. 이것은 또한'public Person Person (string firstname) {...}'과 같은 것을 써야한다는 것을 의미합니다 - 읽기에는 좋지 않습니다. (컴파일도한다면? C#을 아직 사용하지 않았습니다). ('public person person (string firstname) {...}') 다른 프로그래밍 언어와 같은 소문자 함수 이름을 사용하면이 혼란이 많이 걸릴 것이고'get'-prefix 더 이상 필요하지 않을 것입니다 ... 그래서 당신의 논쟁은 매우 C# 관련적입니다. – mozzbozz

4

Java의 "get"및 "set"접두어 쌍은 원래 Java bean을 나타내는 규칙으로 사용됩니다. 나중에 Java는 C#과 달리 적절한 속성이 없기 때문에 캡슐화 규칙이됩니다.

2

Java는 (아직) 특성을 지원하지 않습니다. 게터와 세터는이 문제를 해결할 교두보입니다. 다른 언어 (C# 포함)는 속성을 지원하므로 대신이 속성을 사용해야합니다. 이것은 단지 "모범 사례"일뿐만 아니라 C#의 직렬화는 getter가 아닌 & setters가 아닌 속성에 의존하므로 클래스를 직렬화해야하는 경우 나중에 속성을 사용하면 모든 종류의 문제가 발생할 수 있습니다.

속성의 이점은 코드를보다 읽기 쉽게 만드는 것입니다. 자바

obj.setX(10); 

비슷해, X가 아니라 가변되는보다는 방법 등 등 검사 더러운 입력 확실히

1

그것을 수행 할 수 막후 그러나

obj.X = 10; 

된다 이전에는 API가 get 접두어없이 읽기 전용 속성을 노출하는 경우가 많았습니다 : String.length() 및 더 최신의 Buffer.capacity()이 합리적인 예입니다.

위의 단점은 보풀이 덜 복잡하다는 것입니다. 단점은 규칙을 기반으로 속성을 자동으로 결정하려고 시도하는 것은 아무것도 발견하지 못한다는 것입니다. 개인적으로 나는 접두사를 포함하는면에서 오류가 있습니다. 물론

는 C#으로는 "진짜"속성 어쨌든 있기 때문에 :) 대부분 무관의

C 2.0 같은 도트 구문을 사용하여 속성을 사용
+1

그래서 일부 데이터 (읽기 전용)를 반환하고 읽기 전용 속성, 이름이 "Get"으로 시작하는 함수와 이름이 "Get"으로 시작하지 않는 함수 사이의 결정에 직면 한 경우 너 선택할거야? – toddmo

+0

@toddmo : Java에서는 보통 get을 사용합니다. 컨텍스트가 Java라는 점을 감안할 때, "get"으로 시작하는 함수에 비해 읽기 전용 속성이 무엇을 의미하는지 확신 할 수 없습니다. –

+0

@toddmo : 아, 그게 확실하지 않습니다. C#에서는 거의 항상 재산이 될 것입니다. –

0

목적.

이전에는 게터와 설정자에 약간 다른 이름 지정 체계가 사용되었습니다 (자연스럽게 속성이나 일반 속성에 사용할 수 있음).

value = [obj attr]; 

[obj setAttr:value]; 

[obj getAttr:&value]; 

즉 get은 다른 방식으로 사용됩니다. 값을 반환하지는 않지만 전달 된 변수에 결과를 저장합니다.

일반적인 getter는 속성과 이름이 같으며 setter는 set이 접두어로 붙은 속성입니다 (Java 규약에 따라). 이 규칙은 KVO (Key-Value Observation) 시스템에서 사용되므로 준수해야합니다.

4

의 모범 사례는 속성에 get 및 set 접두사를 사용하는 것입니다.

프레임 워크, 태그 라이브러리 등은 해당 접두어가있는 메소드를 찾아 속성으로 사용합니다. 당신이 스트럿 - 태그 (또는 다른 OGNL 기반의 태그 라이브러리)와 같은 자바 클래스 ...

public class User{ 
    private String name; 
    public String getName(){ return name;} 
    public void setName(String name){ this.name = name; } 
} 

을 ..이있는 경우

그래서, 당신은 user.name로 이름 속성에 액세스합니다.

또한 Spring 프레임 워크는 xml 구성 파일에서이 규칙을 사용합니다.

1

다릅니다. 속성이없는 언어에서도 중복되는 정보입니다.

C++에서 getAttr()/setAttr() 쌍 대신에 Attr() 함수의 두 가지 오버로드를 제공하는 것이 일반적입니다. void Attr (Foo f); // 세터 Foo Attr(); // getter

자바에서는 get/set 접두사를 접두어로 사용하는 것이 일반적입니다. 나는 당신의 언어로 된 표준과 함께하는 것이 가장 좋습니다. 자바에서는 사람들이 접두사를 가져 오거나 설정하기를 기대하므로 엄밀히 따지지는 않더라도 사람들을 혼동시킬 수 있습니다.

0

간단한 부록 : 부울 필드의 getter 접두어 앞에 "get"대신 "is"가 붙습니다. bool isEnabled() { return enabled; }

0

나는 개인적으로 다음과 같은 규칙 같은 :

  • 를 사용하여 값이 해당 set 방법
  • 드롭 상황에서 get 접두어가 직접 수정할 때마다 get 접두사 값이 뭔가 당신이 할 수있다 ' 속성으로 직접 설정하지 마십시오 (즉, 동등한 setXXX 메소드가 없습니다)

두 번째 경우의 이론적 근거는 값이 실제로 우리가 아닐 경우 er-settable "속성"을 사용하면 get/set 메서드 쌍이 필요 없습니다. 이 규칙을 따르고 getXXX 메소드를 볼 수 있다면 setXXX 메소드가 있다고 가정 할 수 있습니다.

예 :

  • String.length() - 문자열은 불변이므로, 길이가 읽기 전용 값
  • ArrayList.size() - 요소를 추가 또는 제거,하지만 당신이 직접
  • 을 설정할 수 있습니다 크기 변경