2010-07-27 4 views
6

두 가지 클래스 A와 B가 있습니다. B는 A를 알고 있고 A는 B를 모릅니다. B는 A와 B간에 공유 된 상속은 없지만 A에서 멋지게 설정할 수있는 속성을 가지고 있습니다. 여러 번 A에서 B의 속성을 할당해야하지만 코드를 어디에 두어야하는지 포인터를 찾고 있습니다.배정 코드 협약?

public class A 
{ 

} 

public class B 
{ 
    //constructor? 
    public B(A a) 
    { 
     //set b's properties from a 
    } 

    //factory method? 
    public static B FromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    //setter method? 
    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 

    //assignment method? 
    public void AssignFrom(A a) 
    { 
     //set b's properties from a 
    } 
} 

//static helper class? 
public static class BHelper 
{ 
    public static B GetBFromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 
} 

이들 중 어떤 것이 일반적인 방법일까요? 그들 중 누구도 그들의 서명에 근거한 함의를 가지고 있습니까? 예를 들어, 생성자를 사용하면 일반적으로 B가 전달 된 A에 대한 참조를 보유하고 있음을 알 수 있습니까? 이것들은 제가 생각하고있는 고려 사항들입니다.

감사합니다.

답변

2

언급 한 모든 옵션이 유효합니다. 어떤 상황을 선택 하느냐에 따라 선택할 수 있습니다.

//constructor? 
public B(A a) 
{ 
    //set b's properties from a 
} 

생성자 패턴 B를 얻는 값의 값에 의존 할 때 공장에있어서 선택의 패턴 것

//factory method? 
public static B FromA(A a) 
{ 
    B b = new B(); 
    //set b's properties from a 
    return b; 
} 

B는 A.에서 데이터 없이는 존재할 수 선택 될 A 또는 B 특히 B가 자손을 가지고있는 경우 A의 값은 구성 선택을 제공합니다. A와 B는 서로 모르는 제 3자가 중재해야 할 경우이 사용하는 것처럼

//setter method? 
public static void SetBFromA(B b, A a) 
{ 
    //set b's properties from a 
} 

setter 메소드는 시나리오에 적용되지 않을 것입니다.

//assignment method? 
public void AssignFrom(A a) 
{ 
    //set b's properties from a 
} 

이것은 본질적으로 방문자 패턴입니다. A는 B를 방문하고 그 자체로 무언가를 남깁니다 (학사일을 생각합니다). A의 데이터가 B에 대해 선택적인 경우이 패턴이 선택됩니다.

+0

우수한 응답. 나는 각각의 제안에 대한 해설은 물론, 각각에 대한 엄지 손가락 규칙을 좋아한다. 이것은 내가 바라는 바로 그 것이다. 감사! – bwerks

+0

* blush * - 감사합니다. –

3

나는 생성자 방법이나 명시 적 변환을 사용합니다.

public static explicit operator B(A typ) 
{ 

} 

일반적으로 이것은 매우 주관적인 것 같습니다. 우리는 모두 다른 방법으로 답변을 게시 할 수 있으며 어느 쪽이 가장 많은 표를 얻었는지 확인하지만 실제로는 각 방법마다 다른 이점과 결함이 있습니다. 문맥에 더 의존하고이 패턴이 나머지 코드 전반에 어떻게 의존 할 것인가.

+0

명시 적 변환은 정확히 내가 생각한 것입니다. –

+0

이 방법이'A' 또는'B'로되어 있습니까? –

+0

@Steven Sudit B –

0

저는 그러한 일반적인 관행이 있다고 생각하지 않습니다. 이 작업을 완료하면 팩토리 또는 생성자 메서드를 사용했습니다. 나는 아마 공장을 좋아할 것이다.

public static B CreateFromA(A a) { } 

이것은 당신이 A 주어진 B을 흔들 수 있다는 것을 제안, 공장 구문을 사용하지만 아무것도 피하는 것은 변환처럼 보이는 :

+0

나는 캐스팅의 모양을 피하려고 노력하고 있기 때문에 주로 생성자를 넘어서는 공장을 선호합니다. –

3

나는 대안을 던져 것입니다.

+0

그는 이미 질문에서 팩토리 메서드를 제안했습니다. 그러나 +1에 이름에'Create'가있다. –

+0

@ 마크 : 그것은 Yuriy의 추천에 대한 대안으로 의도되었다. 나는 이것이 완전히 독창적이지 않다는 것을 알고 있습니다. bwerks 외에도, 그랜트는 나를 때렸다. –

+0

그래,하지만 내가 한 것보다 더 잘 쓴거야! 여전히 당신에게 대리인을주지는 못합니다 .. –

관련 문제