답변:
침입 데이터 구조는 저장하려는 요소의 도움이 필요한 구조입니다.
다시 말하겠습니다. 데이터 구조에 무언가를 넣으면 그 "무언가"가 어떤 식 으로든 그 데이터 구조에 있다는 사실을 인식하게됩니다. 데이터 구조에 요소를 추가하면 요소가 변경됩니다.
예를 들어, 각 노드에 왼쪽 및 오른쪽 하위 트리에 대한 참조와 해당 노드의 요소 값에 대한 참조가있는 비 간섭 이진 트리를 빌드 할 수 있습니다.
또는 해당 하위 트리에 대한 참조가 값 자체에 포함되는 방해 요소를 만들 수 있습니다.
침입 데이터 구조의 예는 변경 가능한 요소의 정렬 된 목록입니다. 요소가 변경되면 목록을 다시 정렬해야하므로 목록 개체는 요소의 협력을 위해 요소의 프라이버시를 침해해야합니다. 즉. 요소는 자신이있는 목록에 대해 알고 변경 사항을 알려야합니다.
ORM 시스템은 일반적으로 큰 객체 목록에 대한 반복을 최소화하기 위해 침입 데이터 구조를 중심으로 회전합니다. 예를 들어, 데이터베이스에있는 모든 직원의 목록을 검색 한 다음 그 중 하나의 이름을 변경하고 데이터베이스에 다시 저장하려면 직원 개체가 변경 될 때 방해가되는 직원 목록을 알려줍니다. 개체는 어떤 목록에 있는지 알고 있습니다.
방해가되지 않는 목록은 알려지지 않았으며 변경된 내용과 자체적으로 변경된 방법을 파악해야합니다.
침입 컨테이너에서 데이터 자체는 컨테이너에 필요한 정보를 저장합니다. 즉, 한쪽에서는 데이터 유형이 저장 방법에 따라 특수화되어야하고 다른 쪽에서는 데이터가 저장 방법을 "알고"있으므로 약간 더 최적화 할 수 있음을 의미합니다.
비침 입성 :
template<typename T>
class LinkedList
{
struct ListItem
{
T Value;
ListItem* Prev;
ListItem* Next;
};
ListItem* FirstItem;
ListItem* LastItem;
[...]
ListItem* append(T&& val)
{
LastItem = LastItem.Next = new ListItem{val, LastItem, nullptr};
};
};
LinkedList<int> IntList;
방해 :
template<typename T>
class LinkedList
{
T* FirstItem;
T* LastItem;
[...]
T* append(T&& val)
{
T* newValue = new T(val);
newValue.Next = nullptr;
newValue.Prev = LastItem;
LastItem.Next = newValue;
LastItem = newValue;
};
};
struct IntListItem
{
int Value;
IntListItem* Prev;
IntListItem* Next;
};
LinkedList<IntListItem> IntList;
개인적으로 저는 투명성 때문에 침입 형 디자인을 선호합니다.