2012-11-26 3 views
2

나는 각 클래스가 일반적으로 다른 클래스의 인스턴스 목록을 포함하는 프로젝트에서 작업하고 있습니다. 이 작업은 여러 레이어에서 반복되므로 Class1에는 Class2 인스턴스 목록이 포함되며 Class2 인스턴스 목록에는 Class3 인스턴스 목록이 차례로 포함됩니다.클래스 인스턴스에 대한 추가 정보를 저장하는 올바른 방법은 무엇입니까?

각 프로젝트를 가능한 한 독립적이고 독립 실행 형으로 유지하여 다른 프로젝트에서 다시 사용할 수 있도록하고 싶습니다.

그러나이 아키텍처에서는 상위 계층의 클래스가 하위 계층의 개체에 액세스 할뿐만 아니라 관련 개체에 표시되지 않아야하는 메타 데이터를 저장해야하는 경우가 종종 발생합니다. 이것은 인접한 레이어에서만 발생하는 것이 아니라 도 레이어가 서로 떨어져있는 경우 발생합니다. 나는 지금 내가 사용하고있는 것이 가장 좋은 것이 아닌가하는 두려움 때문에 이것이 가능한 올바른 접근법이 무엇인지 궁금해하고 있었다. 나에게 마음에 와서

솔루션은 다음과 같습니다

각 클래스
  • 이 addictional 필요한 정보를 저장하는 래퍼를 만들 수 있습니다. 이것은 아마도 과도 할 것입니다 (우리는 단지 약간의 비트를 저장할 필요가 있습니다). 그리고 먼 레이어에이 개념을 적용하는 방법을 확신하지 못합니다.
  • 메타 데이터를 보유하는 별도의 구조를 만들고 개체 인스턴스와 메타 데이터 구조 인스턴스의 쌍을 유지합니다. 다시 말하지만 먼 레이어에서이 방법을 사용하는 방법에 대해서는 잘 모릅니다.
  • 낮은 수준의 클래스에서는 공개 멤버를 볼 수 없으며 상위 수준 클래스에서만 사용합니다. 이것은 문제를 해결하지만 극히 나쁜 습관이라고 생각하며, 외부 코드를 사용하여 메타 데이터에 "손을 대지 말고"크게 의존하지 않습니다.

다른 가능한 해결책은 무엇입니까?

중독성 정보처럼 나는 C++로 프로젝트를 코딩하고 있지만 이것은 내 질문과 관련이 없어야합니다.

편집

: 이 더 무슨 뜻인지 설명하는 예입니다

가정 해 우리는 클래스 A와이 완료 및 독립 실행 형 클래스된다 B. 그런 다음 우리는 클래스 A의 인스턴스 콜렉션의 매니저 인 클래스 C를 갖습니다. 그렇게하려면 관리하는 A의 각 인스턴스에 대한 중독 정보를 저장해야합니다.

또한 클래스 C의 인스턴스와 클래스 B의 객체 컬렉션을 모두 포함하는 클래스 D가 있습니다.이 마지막 클래스는 클래스 B의 각 인스턴스를 클래스 A의 인스턴스 중 하나와 연결할 수 있어야합니다 (C 클래스의 제어 된 인스턴스에 의해 관리 됨), 및 그 반대로.

어디에서 어떻게 C 및 D에 필요한 정보가이 예제에 저장됩니까?

+0

메타 데이터 란 무엇입니까? 그냥 텍스트? 속성을 가진 클래스? 메타 데이터 유형 *이 각 클래스마다 다른가요? –

+0

@BobHorn 상위 수준에서 하위 수준을 관리하는 데 필요한 정보가 될 수 있습니다. 부울, 문자열, 다른 유형의 데이터/목록 등이 있습니다. 예, 메타 데이터는 클래스뿐만 아니라 클래스를 사용해야하는 클래스에 따라 달라집니다 (클래스는 여러 상위 메타 클래스에 대해 여러 메타 데이터 구조와 연결될 수 있습니다. 상위 계층). 메타 데이터 유형은 동일한 클래스의 인스턴스간에 변경되지 않습니다. – Svalorzen

+0

OO 방식을 사용하여 각 객체에 대해 래핑 객체를 생성하는 것이 좋습니다 (메타 데이터, 깨끗하고 의미있는 API 및 코드 유지 관리에 대한 단일 비트 또는 다중 목록은 중요하지 않음). "관리자"(클래스 C, D) . 예를 들어 cObject.AddA (A aObject)는 래퍼 클래스를 생성하고 C 객체의 다른 목록에 저장합니다. dObject.AddB (B bObject)는 D의 C에 적절한 A 객체를 찾고 D와 결합 된 메타 데이터에 연결합니다. :) – Algirdas

답변

0

나는 일반적인 문제는 A의 인스턴스와 B의 인스턴스와 각각에 대한 추가 메타 데이터를 원한다고 생각하는 것입니다. 따라서 WrappedA 및 WrappedB 클래스에는 A에 대한 참조가 있고, 필요한 메타 데이터를 유지 관리합니다.

Public class A 
{ 
} 

public class WrappedA 
{ 
    private A _underlyingInstance; 
    public WrappedA(A instanceToWrap) 
    { 
      _underlyingInstance = instanceToWrap; 
      SetAdditionalMetaData(); 
    } 

    protected SetAdditionalMetaData() 
    { 
      //use _underlyingInstance to set meta data 
    } 
} 

그런 다음 유형 A의 목록 대신 유형 A의 목록이 있어야합니다.

public class C 
{ 
    private List<WrappedA> _myAs = null; 
    public C(A[] rawAs) 
    { 
      _myAs = new List<WrappedA>(); 
      foreach(A a in rawAs) 
      { 
       _myAs.Add(new WrappedA(a); 
      } 

    } 
} 

래핑 된 클래스에 추가해야하는 방법은 무엇입니까? AXB에 대한 특별한 정보를 저장해야한다면, Ds 책임이 될 것 같습니다. D는 [A_B]를 키로 사용하여 Dictionary를 생성 한 다음 그 값에 AXB의 해당 조합에 대해 원하는 데이터를 저장할 수 있습니다.

희망이 있습니다.

관련 문제