2011-10-24 2 views
1

나는 Graph라는 객체를 가지고 있습니다.속성의 속성에 기능을 추가하십시오.

그래프 클래스에 Vertices 목록이 있습니다. 따라서 클래스는 다소 이렇게 보일 것입니다. 자사의 닷넷 2.0 코드.

public class Graph 
{ 
    public List<Vertex> Vertices 
    { 
     get{ return _vertices} 
    } 
} private List<Vertex> _vertices; 

여기 내 질문입니다. Vertex.IsValid() 메서드를 호출하여 Vertex 객체의 유효성을 검사하여 Graph 객체에 추가하고 싶습니다.

가장 좋은 방법은 무엇입니까? 저는 속성의 getter 블록 안에 코드를 추가하는 방법을 좋아합니다. 비슷한 방법이 있습니까?

해결 방법이 있지만 최선의 방법으로 해결하고 싶습니다.

+0

'해결 방법'은 무엇입니까? 적어도 하나의 예. 닷넷 2.0에서는 확장 방법이 없다 ... 그래서 당신이하고있는 일이 당신이하려고하는 것에 대한 완전한 그림을 제공하는데 도움이된다고 생각하는 것을 본다. – IAbstract

답변

2

가장 좋은 방법은 변경 가능한 목록으로 정점의 목록을 노출하지 않는 것입니다. 대신 Vertices 속성이 필요한 경우 읽기 전용 데이터 구조를 반환하십시오. 그런 다음, 단지 Add() 방법을 포함, 모두를 확인 당신이 원하는 :

public ReadOnlyCollection<Vertex> Vertices 
{ 
    get { return _vertices.AsReadOnly(); } 
} 

public void Add(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 
+1

설정 정점을 방지하고 싶지만 설정자가 필요할 때 하드 코딩을하는 경우가 있습니다. –

+0

@Saeed 우리가 제공 한 유일한 제한은 "추가 된 버텍스가 유효하다는 것"이었습니다. 이를 수행하는 일반적인 방법은 추가가 포함 된 클래스에 의해 조정되는지 확인하는 것입니다. 완전히 변경 가능한 목록을 표시한다는 것은 제한이 의미가 없다는 것을 의미합니다. 그래프의 경우 어쨌든 정점을 "설정"할 이유가 거의 없습니다. 당신은 그것들을 추가합니다 (그리고 그것들을 제거 할 수도 있습니다.) 그리 어렵지 않습니다. – dlev

1

이런 식으로 뭔가를 시도 할 수하는 의사 :

편집

확장 방법

public static class MyCoolVertex 
    { 
     public static void AddVertexAndValidate(this List<int> list, Vertex value) 
     { 
      if(value.IsValid()) 
       list.Add(value); 
     } 
    } 

그리고이 사용 AddVertexAndValidate 방법 후

. 좋은

이 : 기본적으로 당신은

나쁜

수행 : 그냥 Add 목록에이 방법으로 호출 워크 플로우를 위반하는 사람을 중지 할 수 없습니다. 이 도움이

희망 ..

+1

이것은 실제로 도움이되지 않습니다. 'Vertices'는 컴파일 타임 타입'List '입니다. 이것은 클래스의 숨기기'Add()'메소드가 호출되지 않음을 의미합니다. – dlev

+0

안녕하세요 @ Tigran, 답변 해 주셔서 감사합니다. 하지만 파생 된 클래스를 갖는 것은 문제에서 언급 한 해결 방법이었습니다. 그렇지 않으면 그것을 할 방법이 있는지 궁금 해서요. – SaravananArumugam

+3

Vertices가 List 구현이 아닌 인터페이스로 노출되어야하는 이유는 무엇입니까? – Vadim

2
비슷한 상황에 대한 나의 해결책은 다음과 같이 그래프에 정점 객체를 추가하는 도우미 메서드 추가하는 것입니다

:

public void AddVertex(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 

하는 경우를 당신은 많은 수의 Graph 객체를 가지고 있지 않습니다. Graph는 대개 Vertex를 가지고 있습니다. 그래서 List 콜렉션을 미리 할당합니다. 따라서 항상 비어 있고 null이 아닙니다. (아마도이 ​​특별한 경우에는 좋은 생각입니다). 그렇지 않으면 AddVertex 메서드는 _vertices가 null인지 확인하고 List를 할당해야합니다. 그런 상황에서 필자는 일반적으로 null 인 경우 List를 할당하는 CreateVertices() 메서드를 만들 것이므로 필요할 경우 클래스의 다른 메서드 나 심지어 클래스의 사용자가 사용할 수도 있습니다. 쉬운 방법은 항상 컬렉션을 미리 할당하는 것이지만 클래스의 인스턴스 수가 많고 컬렉션을 사용하지 않는 경우가 종종 있습니다.

List가 변경되지 않기 때문에이 솔루션이 완벽하지는 않습니다. 클래스의 사용자는 Vertices 속성을 사용하여 목록을 가져오고 직접 Add()를 수행 할 수 있습니다. 그에 대한 유일한 해결책은 문서를 추가하는 올바른 방법을 설명하는 Vertices 속성의 설명 태그와 같은 문서입니다. C#은 반환 된 콜렉션을 읽기 전용으로 플래그하는 방법의 이점을 얻을 수 있습니다. 만약 당신이 필사적이라면, List를 랩핑하고 일반 List에서 복사를 자체적으로 생성 할 수있는 읽기 전용 콜렉션을 작성한 다음, 불변 목록을 특성으로 리턴 할 수 있습니다.

관련 문제