우선 패러다임을 명확하게합니다.
- 데이터 구조-> 적절한 지식을 갖춘 기능으로 순회 및 조작 할 수있는 메모리 레이아웃.
- Objects-> 구현을 숨기고 통신 할 수있는 인터페이스를 제공하는 독립형 모듈.
게터 / 세터는 어디에 유용합니까?
게터 / 세터는 데이터 구조에 유용합니까? 아니.
데이터 구조는 일련의 기능에 공통적이고 조작되는 메모리 레이아웃 사양입니다.
일반적으로 기존의 새로운 기능은 다른 기능이 여전히 이해할 수있는 방식으로 데이터 구조를 처리하고 조작 할 수 있으며이 기능은 패밀리에 합류합니다. 그렇지 않으면 악성 기능과 버그의 원인이됩니다.
잘못 이해하지 마십시오. 어디서나 스 니치, 턴 코트 및 이중 에이전트가있는 데이터 구조를 다루는 여러 기능 군이있을 수 있습니다. 각자 고유의 데이터 구조를 가지고 있으면 좋지만, 공유 할 때 ... 정치에 대해 동의하지 않는 여러 범죄 가족을 상상하면 정말 혼란스러워 질 수 있습니다.
확장 기능 패밀리가 달성 할 수있는 혼란을 감안할 때, 데이터 구조를 인코딩하여 불량 함수가 모든 것을 망칠 수있는 방법이 있습니까? 예, 그것들은 객체라고 불립니다.
게터 / 세터는 객체에 유용합니까? 아니.
데이터 구조를 객체로 감싸는 요점은 악성 함수가 존재하지 않도록하는 것입니다. 그 기능이 가족과 합류하기를 원했다면, 먼저 철저히 조사한 다음 물체의 일부가되어야했습니다.
게터와 세터의 요점 / 목적은 객체 외부의 함수가 객체의 메모리 레이아웃을 직접 변경할 수 있도록하는 것입니다. 그것은 도적을 허용하는 열린 문처럼 들립니다 ...
가장자리 케이스
공개 게터 / 세터가 의미가있는 두 가지 상황이 있습니다.
- 개체 내 데이터 구조의 일부는 개체에 의해 관리되지만 개체에 의해 제어되지는 않습니다.
- 일부 요소가 구현 객체를 제어하지 않을 것으로 예상되는 데이터 구조의 고급 추상화를 설명하는 인터페이스입니다.
컨테이너와 컨테이너 인터페이스는이 두 상황의 완벽한 예입니다. 컨테이너는 내부적으로 데이터 구조 (linked-list, map, tree)를 관리하지만 특정 요소를 모두 수동으로 제어합니다. 인터페이스는 이것을 추상화하고 구현을 완전히 무시하고 기대치를 설명합니다.
불행히도 많은 구현들이 이것을 잘못 알고 실제 객체에 직접 접근 할 수 있도록 이러한 종류의 객체의 인터페이스를 정의합니다. 다음과 같은 것 :
interface Container<T>
{
typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
TRef item(int index);
}
이 고장입니다. 컨테이너의 구현은 내부의 컨트롤을 사용하는 사람에게 내부 컨트롤을 명시 적으로 전달해야합니다. 나는 이것이 괜찮은 가변 값 언어를 아직 보지 못했다.
복사 의미 만 사용하거나 프록시를 사용하여 getter / setter를 개선 / 수정할 수 있습니다.
interface Proxy<T>
{
operator T(); //<returns a copy
... operator ->(); //<permits a function call to be forwarded to an element
Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}
interface Container<T>
{
Proxy<T> item(int index);
T item(int index); //<When T is a copy of the original value.
void item(int index, T new_value); //<where new_value is used to replace the old value
}
논란의 여지가있는 기능은 여전히 많은 노력을 기울여도 여전히 위력을 발휘할 수 있지만, 카피 시맨틱 및 / 또는 프록시는 많은 오류 가능성을 줄입니다.
- 과다
- 언더 플로
- 하위 요소와의 상호 작용은 형식 확인 / 유형 확인 가능 (언어를 잃어 버리면 이것이 좋습니다)
- 실제 요소는 메모리 상주이거나 아닐 수 있습니다.
개인 게터 / 세터
이것은 유형에 대해 직접 작업하는 게터와 세터의 마지막 요새입니다. 사실 나는 이러한 게터와 세터뿐만 아니라 접근 자와 조작자를 부르기도합니다.
이러한 맥락에서 때때로 데이터 구조의 특정 부분을 조작하려면 항상 / 거의 항상 / 일반적으로 특정 장부 유지가 필요합니다. 트리의 루트를 업데이트 할 때 look-aside 캐시를 제거해야하거나 외부 데이터 요소에 액세스 할 때 잠금을 얻거나 해제해야한다고 가정하십시오. 이 경우 DRY 교장을 적용하고 해당 조치를 함께 소포하는 것이 좋습니다.
사적인 맥락에서, 가족의 다른 기능들이 이러한 '게터와 세터'를 회피하고 데이터 구조를 조작하는 것이 여전히 가능하다. 따라서 왜 그것들을 접근 자와 조작자로 생각합니다. 데이터에 직접 액세스하거나 다른 가족 구성원에게 의존하여 해당 부분을 얻을 수 있습니다.
보호 된 게터 / 세터
보호 된 컨텍스트에서 공개 컨텍스트와 크게 다르지 않습니다. 외부의 불량 함수는 데이터 구조에 액세스하려고합니다. 따라서 존재하지 않는 경우 공용 게터 / 세터처럼 작동합니다.
this->variable = x + 5
하거나UpdateStatistics
setter에서 함수를 호출 하려고 할 수 있으며 이러한 경우classinstancea->variable = 5
문제가 발생할 수 있습니다.