java - 함수 - 객체 메소드 내에서 객체 속성에 어떻게 액세스 하시겠습니까?




자바스크립트 프로퍼티란 (12)

getter / setter 메소드가 아닌 객체 메소드 내에서 객체의 속성에 액세스하는 "순수한"또는 "올바른"방법은 무엇입니까?

나는 객체 외부에서 getter / setter를 사용해야하지만 내부에서 당신은 그렇게 할 것이라고 알고 있습니다.

자바:

String property = this.property;

PHP :

$property = $this->property;

아니면 하시겠습니까?

자바:

String property = this.getProperty();

PHP :

$property = $this->getProperty();

Java가 약간 벗어난 경우 용서하십시오 .Java로 프로그래밍 한 지 1 년이 지났습니다.

편집하다:

사람들이 내가 개인 또는 보호 된 변수 / 속성에 대해서만 이야기한다고 가정합니다. OO를 배웠을 때 나는 모든 공공 재산에 대해 게터 / 세터를 사용하는 법을 배웠습니다 (실제로 변수 / 재산을 공개하지 말라고 들었습니다). 따라서 나는 시작에 대한 잘못된 가정에서 출발 할 수 있습니다. 이 질문에 대답하는 사람들은 아마도 당신이 공공 재산을 가져야하고 게터와 세터가 필요하지 않다고 말하고있는 것 같습니다. 게터와 세터가 필요하지 않습니다. 잘. 그것은 아마도 다른 질문에 대한 좋은 주제 일 것입니다 ...


방금 배를 타고 가나 요?

혹시 ;)

또 다른 접근 방법은 개인 / 보호 된 방법을 사용하여 실제로 가져 오기 (캐싱 / db / etc) 및이를 증가시키는 공용 래퍼를 수행하는 것입니다.

PHP :

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

그런 다음 객체 자체에서 :

PHP :

$name = $this->_getName();

이렇게하면 캐시 된 데이터를 사용할지 여부에 대한 플래그를 보내는 것과 같이 다른 인수로 첫 번째 인수를 계속 사용할 수 있습니다.


"purist"가 "most encapsulation"을 의미하는 경우 일반적으로 모든 필드를 private으로 선언 한 다음 클래스 자체에서 this.field를 사용하지만 서브 클래스를 포함한 다른 모든 클래스는 getter를 사용하여 인스턴스 상태에 액세스합니다.


PHP는 매직 메소드 __get__set 포함하여이를 처리하는 무수한 방법을 제공하지만 명시 적 getter 및 setter를 선호합니다. 이유는 다음과 같습니다.

  1. 검증은 setter (및 해당 문제에 대한 getter)에 배치 될 수 있습니다.
  2. Intellisense는 명시 적 방법으로 작동합니다
  3. 속성이 읽기 전용인지, 쓰기 전용인지 또는 읽기 / 쓰기인지는 의문의 여지가 없습니다.
  4. 가상 속성 검색 (예 : 계산 된 값)은 일반 속성과 동일하게 보입니다.
  5. 실제로는 어디에도 정의되지 않은 객체 속성을 쉽게 설정할 수 있으며 문서화되지 않습니다.

setter / getters를 사용하면 코드를 쉽게 읽을 수 있습니다. 또한 다른 클래스가 메서드를 사용할 때 제공하는 컨트롤을 좋아하며 데이터를 변경하면 속성이 저장됩니다.


객체 내에서도 접근 자 메서드를 사용하는 것이 더 좋습니다. 바로 내 마음에 오는 요점은 다음과 같습니다.

1) 객체 외부의 액세스와 일관성을 유지하기 위해 수행해야합니다.

2) 경우에 따라 이러한 접근 자 메서드는 단순히 필드에 액세스하는 것 이상을 수행 할 수 있습니다. 그들은 추가 처리를 할 수 있습니다 (드물지만). 이 경우 필드에 직접 액세스하면 추가 처리가 누락되고 해당 처리 중에이 처리가 항상 수행되는 경우 프로그램에 문제가 발생할 수 있습니다.


공용 또는 보호 속성이있는 개인 필드 값에 대한 액세스는 특성을 거쳐야하며 메소드에서 두 번 이상 사용될 경우 로컬 변수에 복사되어야합니다. 응용 프로그램의 나머지 부분이 완전히 조정되고 흔들리고 다른 방법으로 관련 속성을 통해 값에 액세스하는 위치에 병목 현상이 발생한 경우에만 (그리고 절대로 일어날 수는 없습니다.) 속성 이외의 것이 백킹 변수에 직접 닿도록 고려하십시오.

.NET 개발자는 자동 속성을 사용하여 디자인 타임에 백업 변수를 볼 수 없으므로이를 적용 할 수 있습니다.


내가 autodidact이기 때문에 잘못 될 수는 있지만 Java 클래스의 공용 속성을 절대 사용하지 마십시오. 항상 개인 또는 보호되어 있으므로 외부 코드가 getter / setter에 의해 액세스되어야합니다. 유지 관리 / 수정 목적으로 더 좋습니다. 그리고 내부 클래스 코드의 경우 ... getter 메소드가 사소한 경우 속성을 직접 사용하지만 원하는 경우 이벤트를 발생시키는 코드를 쉽게 추가 할 수 있기 때문에 항상 setter 메소드를 사용합니다.


따라 다릅니다. 그것은 다른 것보다 스타일 문제이며 더 어려운 규칙은 없습니다.


속성을 편집하지 않으면 다른 객체 내부의 MySQLi 객체와 같은 특별한 경우가 아니라면 get_property() 공용 메소드를 사용합니다.이 경우 속성을 공개하고 $obj->object_property

객체 안에는 항상 $ this-> property입니다.


순수한 OO 방법은 Tell Do n't Ask 접근법을 사용하여 둘 다를 피하고 미터 법칙을 따르는 것입니다.

두 클래스를 밀접하게 연결 하는 객체의 속성 값을 얻는 대신 객체를 매개 변수로 사용하십시오.

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

속성이 기본 유형 (예 : int) 인 경우 액세스 방법을 사용하고 프로그래밍 도메인이 아닌 문제 도메인의 이름을 지정하십시오.

  doSomethingWithProperty( this.daysPerWeek() ) ;

이를 통해 캡슐화와 사후 조건 또는 종속 불변량을 유지할 수 있습니다. setter 방법을 사용하여 사전 조건 또는 종속 불변량을 유지 관리 할 수는 있지만 setter의 이름을 정하는 함정에 빠지지 말고 숙어를 사용할 때 할리우드 원칙으로 돌아가 이름을 지정하십시오.


이것은 종교적 전쟁 가능성이 있지만 게터 / 세터를 사용하는 경우 내부적으로 사용해야합니다. 둘 다 사용하면 유지 관리 문제가 발생할 수 있습니다 (예 : 누군가가 필요한 세터에 코드를 추가 함) 속성이 설정 될 때마다 실행되고 속성이 해당 설정자가 호출되지 않고 내부적으로 설정되고 있음).


일부 의견에서 언급했듯이 : 때로는해야하고 때로는하지 않아야합니다. 개인 변수의 가장 큰 부분은 무언가를 변경할 때 사용되는 모든 장소를 볼 수 있다는 것입니다. getter / setter가 필요한 작업을 수행하는 경우 사용하십시오. 중요하지 않다면 결정하십시오.

반대로 게터 / 세터를 사용하고 누군가 게터 / 세터를 변경하면 게터와 세터가 내부적으로 사용되는 모든 장소를 분석하여 무언가를 엉망으로 만드는지 확인할 수 있습니다.





theory