2013-12-18 1 views
0

나는 USB HID와 통신하기위한 기능을 제공 할 클래스 라이브러리를 작성 중이다.복잡한 런타임 객체 생성을위한 메소드

  • UsbHid (모델의 USB HID)
  • UsbHidReport (보고서 인코딩/디코딩 제공)
  • UsbHidReportStream은 (메커니즘을 제공한다 : 상기 통신 메커니즘을 제공하는 서로 긴밀히 협력 특히 세 가지 종류가있다 읽기/쓰기 작업의 경우)

이러한 클래스의 인스턴스는 관심있는 USB HID가 감지되면서 만들어지며 작성을 용이하게하기 위해를 구현했습니다.패턴. 이 부분은 합리적으로 행복합니다.

내 문제는 내가 UsbHidReportUsbHidReportStream에 의존성을 가지고있는 UsbHid 최종 빌드를 어떻게 깔끔하게 관리하는지에 관한 것입니다.

public class UsbHid(string str, UsbHidReport report, UsbHidReportStream stream) 

내가 이상적으로 그들은 내가 다음 반환을 결정하는 데 사용에 필요한 정보 내 라이브러리를 제공 의미, 가능한 한 client에서 작성 과정의만큼을 제거하고 싶습니다.

예를 들어 :

var usbStream = streamFactory.Create(parameters); 
var usbReport = reportFactory.Create(parameters); 
var usbHid = hidFactory.Create(parameters, usbReport, usbStream); 

선호겠습니까 나는 client가 공급 것이라고하는 이는 builder 패턴을 사용하여 고려하고 그래서

var usbHid = creationalObject.GetHid(parameters); 

회피하는 것을 선호 필수 매개 변수. UsbHidReportUsbHidReportStream의 인스턴스를 구성하여 개체를 만드는 데 사용하기 때문에 나중에 client으로 반환됩니다.

오브젝트 생성의 구현을 client에서 숨기는 개념과 비슷하지만 많은 시간 동안 오브젝트 생성을 하나의 builder 오브젝트로 래핑하는 것이 불안 스럽습니다.

나는 소프트웨어가 단순히 흑백이 아니며 모든 것이 프로와 콘을 가지고 있다는 것을 깨닫는다. 그것은 내가 이것을 스스로 숙고하고 있다고 말하면 다른 사람들이 더 적절한 해결책이라고 생각하는 것을 알고 싶다.

  • 기타 builder 객체를 사용하여 client는 객체 생성
  • 을 구현하기 위해 허용 하시겠습니까?
+0

왜 공장에서 UsbHid를 만들고 'UsbHid'가'UsbHidReport'와'UsbHidReportStream'을 만들지 않습니까? 정말로 공장이 필요합니까? 팩토리의 요점은 클라이언트가 객체를 생성 할 수있는 능력을 부여한다는 것입니다. – Euphoric

+0

@ 유포러스 - 'UsbHid'가 의존성을 만드는 방법에 신경 쓰지 말고 단지 소비 할 수 있으므로 우려 원칙을 깨뜨리는 것처럼 보입니다. 팩토리는 객체를 생성하는 능력을 '클라이언트'에 제공합니다. 구체적인 구현은 '클라이언트'보다는 팩토리에 의해 결정됩니다. –

+0

그들은 정말로 의존성입니까? 예를 들어, usbStream과 usbReport가 완전히 다른 usbHid를 동일한 매개 변수로 만들 수 있습니까? – Euphoric

답변

0

당신은 내가 너무 많은 포장에서 불안한 느낌 USBHID 클래스는 단지 같은 시간에 속성을

0

를 오버라이드 (override) 상속 때 나는 당신에게 잘

public class UsbHid 
{ 
... 
    public UsbHid(string str) 
    { 
     ... 
    } 

    // replace virtual with abstract when the property is required 

    public virtual UsbHidReport report 
     { 
      get{ 
       //do whetever you want or return your default value 
       return MyDefaultReposrt; 
       } 
     } 

    public virtual UsbHidReportStream stream 
     { 
      get{ 
       //do whetever you want or return your default value 
       return MyDefaultReportStream; 
       } 
     } 



... 
} 

다음 번에 이해 않은 경우 객체 단일 빌더 객체로 작성

? 여러 빌더 객체

작성자 패턴은 복잡한 개체 생성을 캡슐화하기위한 것입니다. 구성이 단순하면 객체의 생성자에 넣기 만하면됩니다.

빌더가 어셈블하기 위해 5 가지 이상의 종속성이 부풀어 오르기 시작하면 빌더가 너무 많은 책임을 가지고 있다는 신호 일 수 있습니다. 그러나 여기서는 그렇지 않습니다. 그래서 빌더는 완벽하다고 생각합니다.

+0

필자는 이전에'builder' 패턴을 사용 해본 적이 없으며''복잡한 ''객체 생성을위한 메소드를 조사하는 동안 만 발견했습니다. 내 불안은 그것이 나의 시나리오에 "적합"한 것인지, 아니면 내가 추가하는 "복잡성"에 비해 약간의 이점을 제공하는 무언가를 구현하고 있는지 여부를 확실하게 알지 못하기 때문이다. –