컬렉션에 무언가를 추가하는 가장 일반적인 방법은 컬렉션이 Add
제공하는 일종의 방법 을 사용하는 것입니다 .
class Item {}
var items = new List<Item>();
items.Add(new Item());
실제로는 그다지 특이한 것이 없습니다.
그러나 우리가 왜 이런 식으로하지 않습니까?
var item = new Item();
item.AddTo(items);
첫 번째 방법 보다 다소 자연 스럽습니다 . 이것은 Item
클래스에 다음과 같은 속성이 있을 때 andvantange을 갖습니다 Parent
.
class Item
{
public object Parent { get; private set; }
}
세터를 비공개로 만들 수 있습니다. 이 경우 물론 확장 방법을 사용할 수 없습니다.
그러나 아마도 내가 틀렸고 아주 드물기 때문에이 패턴을 본 적이 없었습니까? 그러한 패턴이 있는지 아십니까?
C#
확장 방법 에서는 유용합니다.
public static T AddTo(this T item, IList<T> list)
{
list.Add(item);
return item;
}
다른 언어는 어떻습니까? 나는 대부분의 Item
클래스에서 ICollectionItem
인터페이스 라고합시다 .
업데이트 -1
나는 그것에 대해 조금 더 생각해 왔으며이 패턴은 예를 들어 항목을 여러 컬렉션에 추가하지 않으려는 경우에 유용합니다.
테스트 ICollectable
인터페이스 :
interface ICollectable<T>
{
// Gets a value indicating whether the item can be in multiple collections.
bool CanBeInMultipleCollections { get; }
// Gets a list of item's owners.
List<ICollection<T>> Owners { get; }
// Adds the item to a collection.
ICollectable<T> AddTo(ICollection<T> collection);
// Removes the item from a collection.
ICollectable<T> RemoveFrom(ICollection<T> collection);
// Checks if the item is in a collection.
bool IsIn(ICollection<T> collection);
}
샘플 구현 :
class NodeList : List<NodeList>, ICollectable<NodeList>
{
#region ICollectable implementation.
List<ICollection<NodeList>> owners = new List<ICollection<NodeList>>();
public bool CanBeInMultipleCollections
{
get { return false; }
}
public ICollectable<NodeList> AddTo(ICollection<NodeList> collection)
{
if (IsIn(collection))
{
throw new InvalidOperationException("Item already added.");
}
if (!CanBeInMultipleCollections)
{
bool isInAnotherCollection = owners.Count > 0;
if (isInAnotherCollection)
{
throw new InvalidOperationException("Item is already in another collection.");
}
}
collection.Add(this);
owners.Add(collection);
return this;
}
public ICollectable<NodeList> RemoveFrom(ICollection<NodeList> collection)
{
owners.Remove(collection);
collection.Remove(this);
return this;
}
public List<ICollection<NodeList>> Owners
{
get { return owners; }
}
public bool IsIn(ICollection<NodeList> collection)
{
return collection.Contains(this);
}
#endregion
}
용법:
var rootNodeList1 = new NodeList();
var rootNodeList2 = new NodeList();
var subNodeList4 = new NodeList().AddTo(rootNodeList1);
// Let's move it to the other root node:
subNodeList4.RemoveFrom(rootNodeList1).AddTo(rootNodeList2);
// Let's try to add it to the first root node again...
// and it will throw an exception because it can be in only one collection at the same time.
subNodeList4.AddTo(rootNodeList1);
add(item, collection)
것이지만, 좋은 OO 스타일은 아닙니다.
item.AddTo(items)
확장 유형 메소드가없는 언어가 있다고 가정하십시오 (자연적이든 아니든). 모든 유형에 대해 addTo를 지원하려면이 메소드가 필요하며 추가를 지원하는 모든 유형의 콜렉션에이를 제공하십시오. 그것은 내가 들어 본 모든 것 사이에 의존성을 도입하는 가장 좋은 예와 같습니다. P-여기서 잘못된 전제는 프로그래밍 추상화를 '실제'삶으로 모델링하려는 것 같습니다. 종종 잘못됩니다.