2011-01-26 2 views
0

는 다음과 같은 경우에 고려 염두에 SOLID 원칙과 테스트 용이성을 갖는 B하기 :OO 디자인 : 클래스 A에서 복사 된 데이터는

를 일부 중복되는 속성이 클래스 A와 클래스 B가 있습니다. 클래스 A의 공통 속성을 클래스 B로 복사 및/또는 변환하는 메서드가 필요합니다.이 메서드는 어디에 있습니까?

  1. 클래스 A를 B로 GetAsB()?
  2. 클래스 B를 생성자 B (A 입력)?
  3. 메서드로 클래스 B void FillWithDataFrom (A input)?
  4. 클래스 C를 정적 메서드 B ConvertAtoB (소스)?
  5. ???
+0

이것은 아마도 프로그래머에게 더 잘 맞을 것입니다 .stackexchange.com – beetstra

답변

1

서로 다른 상황에서 모두 의미가 있습니다. 자바에서 몇 가지 예 :

  1. String java.lang.StringBuilder.toString()
  2. java.lang.StringBuilder(String source)
  3. void java.util.GregorianCalender.setTime(Date time)
  4. ArrayList<T> java.util.Collections.list(Enumeration<T> e)

몇 가지 질문은 당신에게 도움이되는 결정 :

  • 어떤 의존성 MAK를 더 의미가 있니? A에 의존하는 B, B에 의존?
  • 항상 A에서 새로운 B를 만들거나, As를 사용하여 기존 Bs를 채워야합니까?
  • Bs의 데이터 공급자 또는 As 데이터의 대상으로 비슷한 공동 작업을하는 다른 클래스가 있습니까?
+0

네 개의 모든 전략이 .Java 프레임 워크에 적용된다는 것을 확인하는 것은 매우 흥미 롭습니다. .NET에는 매우 유사한 패턴이 있습니다. 한 방향으로 구현 된 이유와 다른 방식으로 구현 된 이유에 대해 많은 생각을 드렸습니다. 당신의 질문은 또한 매우 감사합니다. – Nilzor

1

getter 메소드를 피해야하기 때문에 (는 말하지 말고, 원칙을 묻지 않음).

나는 변환과 같아서 A와 B가 서로 공통점이있는 다른 클래스 인 경우 변환이 아니기 때문에 2를 배제 할 것입니다. 적어도 이것은 설명에서 보이는 것입니다. 그렇지 않은 경우 2가 너무 IMHO가됩니다.

4는 C가 B 및/또는 C의 내부 세부 사항을 알고 있음을 의미합니까? 그렇다면이 옵션도 배제 할 것입니다.

나는 3.에 투표 할 것입니다.

+0

예, 4는 C가 A와 B의 내부 세부 사항을 알고 있음을 의미합니다. 의견을 보내 주셔서 감사합니다. 생각에 음식을 좀주세요. – Nilzor

0

OOP 이론이 올바른지 여부는 논쟁의 여지가 있지만 상황에 따라 C를 매우 빨리 배제하지 않을 것입니다. ti는 다소 큰 종속성을 생성하지만, C의 특정 역할이 A에서 B 로의 상호 작용 (및 복사)을 관리하는 것이라면 용도를 가질 수 있습니다. 종속성은 A와 B의 종속성을 피하기 위해 C에서 생성됩니다 또한 C는 종속성을 관리하기 위해 특별히 존재하며이를 염두에두고 구현할 수 있습니다.

Ex. (vb.Net/Pseudocode에) :

, 말하는 AtoBConverterClass를 제작하는 구체적인 이유가있는 경우
Public Class C 
    Public Shared Function BClassFactory(ByVal MyA As A) As B 
     Dim NewB As New B 
     With B 
      .CommonProperty1 = A.CommonProperty1 
      .CommonProperty2 = A.CommonProperty2 
     End With 
     Return B 
    End Function 
End Class 

,이 방법은 유효 할 수 있습니다.

다시 말하지만, 이는 특별한 경우 일 수 있습니다. 그러나 나는 그것을 때때로 발견했다. 특히 A와 B가 서로에 대해 무지하게 유지해야하는 정말로 중요한 이유가있는 경우.