문제

나는 Java (C# 포함)의 많은 곳에서 많은 "getter"방법이 "get"으로 접두사를 가지고 있고 다른 많은 사람들은 그렇지 않다는 것을 알았습니다. 나는 어떤 종류의 패턴이 태양이 따르고있는 것처럼 보이는 것을 본 적이 없다. Getter 메소드 이름에서 "get"을 사용하기위한 몇 가지 지침이나 규칙은 무엇입니까?

도움이 되었습니까?

해결책

그것은 의미론으로 내려진다. 예, C#은 "속성"을 가지고있어 "get"으로 시작하는 .NET 프레임 워크에서 get/set 'method'stub ... 그러나 함수 (... "메소드")가 있습니다. 개발자는 일부 작업이 일부 결과를 얻기위한 목적으로 발생한다는 사실을 발전시킵니다.

당신은 그것이 이상하다고 생각하고 "왜 단서에 대한 단서를 사용하지 않습니까?"라고 말하면 대답은 간단합니다. 다음 방법을 생각하십시오.

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

그 방법의 이름으로, 당신은 아마도 데이터베이스 활동이 관련 될 것이며, 새로 만든 "사람"이 반환 될 것임을 알 수 있습니다.

그러나 이것에 대해서는 다음과 같습니다.

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

바로 저것 방법의 이름, 데이터베이스에서 사람의 100% "안전한"검색이 수행되고 있다고 가정 할 수 있습니다.

당신은 "CreatePerson"을 여러 번 부르지 않을 것입니다 ...하지만 당신은 ~해야 한다 항상 "getperson"이라고 부르는 것이 안전하다고 느낍니다. (응용 프로그램의 '상태'에 영향을 미치지 않아야합니다).

다른 팁

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

모범 사례 자바 속성에 Get and Set 접두사를 사용하는 것입니다.

프레임 워크, 태그 라이브러리 등은 이러한 접두사가있는 메소드를 찾고 속성으로 사용합니다.

따라서 이와 같은 Java 클래스가 있다면 ...

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

.. Struts-tags (또는 다른 Ognl 기반 태그 라이브러리)를 사용하면 이름 속성에 액세스 할 수 있습니다. user.name.

Spring Framework는 또한 XML 구성 파일 에서이 컨벤션을 사용합니다.

Java는 (아직) 속성을 지원하지 않습니다. getters와 setters는 이것을 돌아 다니기위한 바보입니다. C# - 지원 속성을 포함한 다른 언어는 대신 사용해야합니다. 이것은 단순히 "모범 사례"가 아닙니다. C#의 직렬화는 Getters & Setter가 아닌 속성에 의존 할 것이므로 속성을 사용하지 않으면 수업을 직렬화 해야하는 경우 향후 모든 종류의 문제로 이어질 수 있습니다.

속성의 장점은 코드를 더 읽기 쉽게 만든다는 것입니다. 같은 것

obj.setX(10);

Java에서는됩니다

obj.X = 10;

그러나 무대 뒤에서 X는 변수가 아닌 방법이며 더러운 입력 검사 등을 수행 할 수 있습니다.

나는 개인적으로 다음 규칙을 좋아합니다.

  • 사용 get 접두사는 해당 값으로 직접 수정할 수있을 때마다 접두사 set 방법
  • 떨어 뜨립니다 get 접두사는 값이 속성으로 직접 설정할 수없는 상황 인 상황에서 (즉, 동등한 SETXXX 메소드가 없습니다)

두 번째 사례의 근거는 값이 실제로 사용자가 설치 가능한 "속성"이 아닌 경우 get/set 메소드 쌍이 필요하지 않아야한다는 것입니다. 이 협약이 따르고 getxxx 메소드가 표시되면 SETXXX 방법도 존재한다고 가정 할 수 있습니다.

예 :

  • String.length() - 문자열은 불변이기 때문에 길이는 읽기 전용 값입니다.
  • ArrayList.size() - 요소가 추가되거나 제거 될 때 크기 변경이지만 직접 설정할 수 없습니다.

API가 종종 읽기 전용 속성을 노출시키는 경우가 분명히 사용되었습니다. get 접두사: String.length() 그리고 심지어 새로도 Buffer.capacity() 합리적인 예가됩니다.

이것의 거꾸로는 보풀이 적다는 것입니다. 단점은 컨벤션을 기반으로 속성을 자동으로 결정하려는 모든 것이이를 발견하지 못한다는 것입니다. 개인적으로 나는 추세 접두사를 포함하는 측면에 오류.

물론 C#에서는 어쨌든 "실제"속성이 있기 때문에 대부분 관련이 없습니다 :)

때에 따라 다르지. 속성이없는 언어로도 중복 정보입니다.

C ++에서 getAttr ()/setattr () 쌍 대신 attr () 함수의 두 개의 과부하를 제공하는 것이 일반적입니다. void attr (foo f); // Setter foo attr (); // getter

Java에서는 접두사 GET/SET을위한 일반적인 관행입니다. 나는 모범 사례가 당신의 언어의 표준을 가지고가는 것입니다. Java에서는 사람들이 접두사를 얻거나 설정하는 것을 기대하기 때문에 사람들을 생략하면 사람들이 밀접하게 필요하지 않더라도 혼동 될 수 있습니다.

목표 C 2.0은 동일한 DOT 구문을 사용하여 속성을 사용합니다.

그 전에는 getters and setter에 약간 다른 명명 체계를 사용했습니다 (자연스럽게 속성 또는 일반 기존 속성에 사용할 수 있음).

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

즉, GET는 다른 방식으로 사용됩니다. 값을 반환하지는 않지만 결과를 변수로 전달합니다.

일반적인 getter는 속성과 동일한 이름을 가지며, 세터는 세트에 의해 접두사가있는 속성입니다 (Java의 규칙에 따라). 이러한 규칙은 KVO (Key-Value Observation) 시스템에 의해 사용되므로 준수해야합니다.

단지 짧은 부록 : 또 다른 대회는 부울 필드의 getters가 "get"대신 "is"로 접두사를하는 것입니다. bool isEnabled() { return enabled; }

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top