클래스의 자체 멤버 필드에 액세스하기 위해 항상 GET 및 SET 메소드를 사용하는 것은 패턴 방지입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1095034

  •  11-09-2019
  •  | 
  •  

문제

이 질문은 이미 여기에 답이 있습니다.

Java 클래스에서는 Getters와 Setters와 함께 회원 필드에 액세스하는 것이 좋거나 나쁜 관행으로 간주됩니까?

예, 더 나은 :

public Order {
    private Agreement agreement;

    public Agreement getAgreement() {
    return agreement;
    } 

    public void process() {
       //should I use:
       getAgreement().doSomething();
       //Or:
       agreement.doSomething();
    }
}

일반적으로 나는 키스 원칙으로 인해 필드에 직접 액세스하는 것이 가장 좋다고 생각하며 누군가가 예측할 수없는 결과로 나중에 GET 방법을 무시할 수 있다고 생각합니다.

그러나 동료들은 추상화 계층을 유지하는 것이 낫다고 주장합니다. 이것에 대한 합의가 있습니까?

도움이 되었습니까?

해결책

여기서 핵심 문제는 직접 필드 액세스가 서브 클래스 재정의 메소드, AOP, 동적 프록시 등으로 가로 채기에 부적합하다는 것입니다. 이것은 사건에 따라 좋거나 나쁜 일이 될 수 있습니다. 내부적으로 게터와 세터를 사용하는 것은 반포 또는 패턴이 아니라고 말합니다. 상황과 수업의 디자인에 따라 좋든 나쁜 일입니다.

다른 팁

솔직히 말해서, 그것은 당신이 그것을 사용하는 것에 달려 있습니다. 개인적으로, 의심의 여지없이, 나는 나중에 서브 클래스에서 그것을 무시해야 할 경우를 대비하여 항상 그 여분의 추상화 수준을 남겨 둡니다. 여러 번 나는 getter 또는 setter를 무시할 수 있도록 수업을 다시 작성하는 고통에서 구원을 받았습니다.

또 다른 것은 다른 클라이언트/프로그래머가 예를 들어 계약 클래스를 데이터베이스 밖으로 끌어내는 것과 같이 아직 생각하지 않은 방식으로 클래스를 사용해야 할 수도 있다는 것입니다. 이 경우, 그들이 당신의 수업을 무시할 때, 당신은 그들 (또는 잠재적으로 미래)가 해당 데이터를 검색하는 방법을 수정하는 것을 고통스럽게 만들었습니다.

따라서 해당 필드에 액세스 할 수있는 방법이 한 가지만 있고 100% 직접적이라고 확신하지 않는 한, 값의 검색 및 수정을 분리하여 일부 미래 지점에서 재 작성 어려움에서 자신을 절약 할 수 있도록하는 것이 가장 좋습니다.

나는 클래스의 공개 인터페이스가 주 주변의 캡슐화를 나타내며, 그와 같은 클래스의 다른 작업조차도 그 캡슐화의 혜택을받습니다.

당신이 공개 GET 방법에 필드를 감싸고 있다면 그렇게 한 이유가 있습니다. 아마도이 방법 내에 필드를 게으른로드하거나 감사 트레일을 제공하는 논리가있을 수 있습니다. 방법의 이유가 무엇이든, 수업은 그 논리도 필요할 것입니다.

어떤 사람들 이이 질문을 외부에서 사용하는 게터와 세터에 관한 것으로 해석하는 것처럼 들립니다. Pablojim의 질문에 대한 저의 해석은 수업이 해당 분야에 직접 액세스하는 것이 아니라 수업 내에서 그것들을 사용하는 것입니다. (개인입니다.)

그 관점에서, 나는 Jherico와 Patros와 함께 있습니다. 아무 이유가 없다면 클래스 내에서 직접 액세스를 사용하십시오.

Java에서는 추상화 층을 유지하는 것이 좋습니다.

문제는 클래스가 클래스 제어하에 있지 않다는 사실을 알지 못하고 멤버 변수에 직접 액세스하는 모든 코드가 있다는 것입니다.

따라서 예제로 부서에서 사용되는 한 멤버가 0이어야하는 방식으로 클래스를 편집하기로 결정한 순간이 값을 보장하는 방식으로 만 변경되도록 할 수 있어야합니다. 따라서이 방법에 대한 세터를 추가하고 멤버를 비공개로 변경합니다. 그러나 이제 세터없이 멤버에 액세스하는 모든 코드를 변경해야합니다.
당신이 클래스 외부에서 값을 바꾸고 있다는 것을 알고 있다면 변수를 비공개로 만들고 나중에 액세스가 필요한 경우 getter 또는 setter를 제공 할 수있는 경우 세터를 제공하십시오.

다른 개체에 항상 get for amber를 사용하는 특정 메소드가 있으면 일부 계산을 수행 한 다음 get을 사용하는 경우 반포가 발생합니다. 이것은 멤버가 다른 클래스에 있거나 메소드 가이 클래스에 있어야 함을 보여줍니다.

모든 회원이 캡슐화를 중단하고 좋은 디자인 선택이 아닙니다. Mor 내부는 이것을 읽으십시오 기사

나는 지금 Getters에 찬성하는 일을하고 있습니다. 우리는 이제 우리의 속성의 일부를 "속성 백"으로 옮기고 있습니다. 즉, 변수를 참조 할 수는 없습니다. 따라서 Getter를 변경하는 것 외에도 변수를 참조하는 모든 장소를 변경해야합니다. 명심해야 할 것입니다.

그것은 당신이 당신의 getters와 setter를 사용하는 것에 따라 다릅니다. 일반적으로 나는 클래스 또는 형식 데이터로 나오는 데이터를 확인해야 할 때 사용합니다. 그런 점에서 저는이 클래스와 데이터에 액세스해야 할 다른 클래스 사이의 인터페이스 계층으로 Getters와 Setter를 실제로 사용합니다.

나는 내부 코드를 작성 하여이 클래스에 비공개 데이터를 처리하는 방법을 알고 있으므로 자체 게터 및 세터로 액세스하는 것은 일반적으로 불필요하고 원하지 않습니다.

그러나 그것은 모두 당신의 게터와 세터를 사용하는 방법에 달려 있습니다.

내 규칙은 단지 값을 설정하거나 반환하는 것보다 더 복잡한 일을한다면 세터/게터를 사용한다는 것입니다. 그렇지 않으면 멤버 변수 변경으로 인한 문제를 해결할 수 있기 때문에 필요하지 않습니다.

당신은 모든 속성 변수에 대해 모든 추가 작업을 수행하는 것이 성가신 일이라는 점에서 옳습니다. 왜 언어가 아무도하지 않는 기본적인 것을 허용합니까? 그러나 직접 속성 액세스를 허용하지 않는 매우 강력한 이유가 있습니다.

나는 에펠의 통합 액세스 원칙을 선호합니다. 속성에 할당 할 수 없으며 속성과 함수가 같은 방식으로 액세스됩니다.

class EXAMPLE
feature
  variable: INTEGER
  variable_function: INTEGER
    do
      result := 4
    end
  variable_two: INTEGER assign variable_assign
  variable_assign (in: INTEGER)
    do
      variable_two := in
    end  
end

feature
test
local
  test: EXAMPLE
  value: INTEGER
do
  create test
  value := test.variable  -- Valid
  value := test.variable_function  -- Valid and same even though it's a function
  test.variable := value -- Invalid
  test.variable_two := value -- Valid, an explicit setter is defined
end

나는 이것이 사례별로 고려해야 할 것이라고 생각합니다. 클래스 코드 전체에서 getter를 사용하면 복잡해지며 아마도 약간 느리게 만듭니다. 그러나 또한 더 확장 가능하고 재사용 가능합니다.

내가 보통 한 것은 누군가가 내 getter를 다른 사람으로 무시하고 싶어하는 이유를 예상 할 수 있다면 Getter를 사용하는 것입니다. 그것이 기본적이고 단순한 것이 아니라면 결코 말이되지 않을 것이라면, 나는 일반적으로 getters를 사용하지 않습니다.

Getter없이 변수에 액세스하기 위해 코드를 작성하는 경우 Getter 기능을 "최종"로 만드는 것을 고려하십시오. 그렇게하면 아무도 코드를 무시하고 머리카락이 왜 작동하지 않는지 궁금해하지 않을 것입니다. (Spring과 Hibernate Proxies는 이것을 나쁜 생각으로 만들 수 있습니다.)

반란이 되려면 결정적으로 유해해야합니다. 나는 게터와 세터를 정의하는 데 어떻게 해를 끼칠 수 있는지 알 수 없습니다. 최대, 그것은 시간 낭비 (및 타이핑)이며, 무의미하지만 반포 스킨은 아닙니다.

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