2011-01-22 4 views

답변

7

게터 세터는 일반적으로 내부에서 외부 클래스로 필드에 직접 액세스하는 데 사용됩니다. 당신의 게터 세터는 다음을 사용하는 일부 논리 코드가있는 경우 가장 큰 장점/목적은 게터 세터의 캡슐화,

입니다. 예를 들어

:

public void setValue(int val){ 
    if(val > 100) 
    this.val = 0; 
    else 
    this.val = val; 
    } 

는 또한

+0

링크이 아주 좋은 설명합니다. – Knubo

+0

int 타입 힌팅이 PHP에서 작동하지 않습니다. – GolezTrol

+0

@Geolez 나는 OP에서 PHP 태그를 보지 않습니다. OOP의 개념은 여기에 설명되어 있습니다. –

5

예, getter 및 setter가 유용 참조하십시오. PHP는 int 또는 string과 같은 간단한 유형에 대해 유형 힌트를 지원하지 않으므로 값을 올바른 유형으로 강제 설정할 수 없습니다.

설정자를 사용하면 설정 한 값을 항상 확인할 수 있습니다. int 프로퍼티로 설정된 값이 int가 아니면 잘못된 값을 받아들이지 않고 타입 변환하거나 오류를 발생시킬 수 있습니다.

이렇게하면 디버깅을 수행하고 응용 프로그램을 훨씬 쉽게 유지 관리 할 수 ​​있습니다. 따라서 getter와 setter를 사용하는 것이 좋습니다.이 검사 이외에 많은 로직이 포함되지 않은 경우에도 마찬가지입니다.

+0

+ 1. 유용한 것은 유용합니다. org.life가 옳습니다.나는 intensionally 언어 특정 태그를 추가하지 않았다 –

0

클래스 내부를 포함하여 거의 모든 곳에서 getter 및 setter를 사용해야합니다. 그렇지 않으면 잠재적으로 캡슐화가 깨지고 더 나쁜 경우 불변성을 무효화 할 수 있습니다.

class BankAccount 
{ 
public: 
    void withdraw(int amount) 
    { 
     m_balance -= amount; 
     m_withdrawals++; 
    } 

    void transfer(BankAcount& other, int amount) 
    { 
     m_balance -= amount; 
     other.m_balance += amount; 
    } 

private: 
    int m_balance; 
    int m_withdrawals; 
}; 

이 버그를 참조하십시오 : C++의 간단한 예를 들어

? transfer은 돈을 인출하지만, m_withdrawals은 증가하지 않습니다. 수동으로 저울을 줄이기보다는 간단히 withdraw을 호출하면이를 피할 수있었습니다.

getters와 setter도 마찬가지입니다. 예를 들어, 게으르게 값을 초기화하는 getter를 가지는 것은 매우 일반적입니다. 다른 멤버 함수가 초기화되지 않은 멤버에 직접 액세스하려고하면 null 포인터 참조 해제가 발생합니다.

기본적으로 getter 및 setter는 원하는 기능을 제공 할 때마다 항상 사용해보십시오. 낮은 수준의 일을 수행할수록 더 낮은 수준의 버그가 발생합니다. getter와 setter를 쓰지 않는다면 getters와 setter를 쓰는 것이 중요하지 않습니다.

+1

당신 getter/setters 아니라 오히려 캡슐에 대한 예제를 설명한 것 같아 –

+0

게터와 세터는 캡슐화 - 그 모든 목적입니다. –

+0

"Getters와 setters는 캡슐화됩니다"no : getters와 setters는 캡슐화를 중단합니다. 캡슐화 == 객체는 데이터 (속성)를 외부에 제공하지 않습니다. – smentek

1

@GolezTrol

이 주제에 대한 더 PHP 배지는 없다 당신은 잘못이다. 당신이 묘사하고있는 것은 세터와 아무런 관련이 없습니다. setter뿐만 아니라 어떤 방법을 사용하여 (PHP에서) 매개 변수를 강제로 입력 할 수 있습니다.

당신은 쓸 수 있습니다 : 단지

setX(X $x){ ...} 
setY(Y $y){ ...} 

또는 :

iAmMethodNotASetter(X $x, Y $y){ 

    //20lines of code here end then: 

    $this->x = $x; 
    $this->y = $y; 
    } 

을 당신은 내가 개체 속성에서 유형을 적용 할 세터가 필요하지 않았다 볼 수있다.

변수 유형을 확인한 후 setter에서 오류가 발생하는 것은 어쨌든 바람직하지 않습니다. 정적으로 입력 된 언어에서 동적으로 입력되는 언어로 전환 한 것은 프로그래머의 일반적인 실수입니다.

세터와 geters는 CONVENTION이며 아무런 시행하지 않습니다! 오늘 우리는 대개 Plain Old Java Objects의 생성을 위해 그것들을 사용합니다. (POJO - php word POPO) 그래서 이것은 라이브러리 나 프로젝트 사이에서 사용할 수있는 객체 생성을위한 단순한 컨벤션 (표준) 일뿐입니다.

유형 검사 또는 유형 검사와 결합 할 수 있지만 그보다 더 중요한 것은 아닙니다. Jigar 조시

"가장 큰 장점/목적은, 게터 세터의 캡슐화"

@ 피터 알렉산더

-

org.life.java @

: 캡슐화 소개

"getters를 사용해야합니다.거의 모든 곳에서과 세터, 을 포함한 "클래스. 그렇지 경우에, 당신은 "캡슐을 깨는 잠재적 있다"게터와 호텔은 캡슐화있다 "

잘못, 잘못, 잘못된. 캡슐화가 getter 및 setter과 함께 할 수 없다 매우 일반적인 실수입니다. 많은 기사들이 거꾸로 뒤집어 반복되는 것을 많이 알고 있습니다 ...
getters와 setters는 캡슐화를 더욱 악화시키지 않습니다. 캡슐화를 깨뜨릴 수도 있습니다. 개체에 데이터를 보내 사용자가 자신의 데이터로 무언가를 수행하도록 요청하는 대신

캡슐화 == 개체가 데이터에 대해 전적인 책임을지고 행 데이터를 제공하지 않습니다. 그리고 사유 재산에 대한 게터는 그 재산을 복잡한 패션 == 제동 캡슐화로 공개하는 것 이상입니다.

Chceck 단락 캡슐화 : 세터 또는 게터에 대한 http://en.wikipedia.org/wiki/C%2B%2B 또는 http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 심지어 하나 개의 단어 ... 다른 기사

+0

위키에서 : "[캡슐화는] 해당 데이터에서 작동하는 메소드 (또는 다른 함수)와 데이터를 묶는 것을 용이하게 해주는 언어 구조입니다." 게터와 세터는 클래스에서 데이터를 처리하기 위해 번들로 제공되는 메서드입니다. 어쨌든, 당신은 질문에 답하지 않았기 때문에 나는 -1을 주었고 다른 응답자들을 괴롭히는 것만 게시했습니다. 주석을 사용하십시오. –

+0

당신은 내가 원하는 모든 것을 줄 수 있습니다. 책을 읽어주세요. – smentek

+0

+ 1. 약간은 초초 적이기 때문에 재미있는 시점을 제시하고 있습니다.이 책에 대해 조금 더 읽어야합니다. 감사합니다. –