2013-07-30 1 views
0

가이 코드를 (: https://codereview.stackexchange.com/questions/28990/fancy-pants-vs-cowboy-coding 뒤에 전체 이야기가 여기에있다) :공장에서 "none"을 기본 케이스로 반환하려면 어떻게해야합니까?

public class BeltPrinterFactory : IBeltPrinterFactory 
{ 
    public IBeltPrinter NewBeltPrinter() 
    { 
     switch (printerChoice) 
     { 
      case BeltPrinterType.ZebraQL220: 
       return new ZebraQL220Printer(); 
      case BeltPrinterType.ONiel: 
       return new ONielPrinter(); 
      default: 
       return new ZebraQL220Printer(); 
     } 
    } 
} 

...하지만 열거에 "없음"을 추가되지 않은, 많은 고객이 하나를 /이 사용되지 않습니다

public enum BeltPrinterType 
{ 
    None, 
    ZebraQL220, 
    ONiel 
    // add more as needed 
} 

컴파일러는 기본 케이스 ("모든 코드 경로가 값을 반환하지는 않음")를 허용하지 않습니다.

"None"옵션이 기본 경우 여야하지만, None이 printerChoice의 현재 값이면 공장을 호출해서는 안됩니다. ("None"일 때 공 굴림을 시작하는 GUI는 표시되지 않습니다. 값입니다), 컴파일러를 위해서 어떻게 구현해야합니까? 어떻게 든 돌려 줄 수 있을까요? null를 반환하지 않는,

. . . 
    default: 
     return new None(); 
    . . . 

public class None : IBeltPrinter 
{ 
    public void PrintLabel(string price, string description, string barcode) 
    { 
     ;// do nothing 
    } 
} 
+2

그것은 Null Object Pattern (http://en.wikipedia.org/wiki/Null_Object_pattern)이라고 불리우며 IMO는 Exceptions 또는 Null을 처리하는 것보다 훨씬 낫습니다. –

+0

공장 패턴은 (대부분의 경우) 폐기되었으며 IoC 및 Dependency Injection으로 대체되었습니다. –

+5

@HighCore, 그게 뭐죠? 나는 그 메모를 놓쳤을 것입니다. –

답변

4

공장에서 None 옵션을 사용할 수없는 경우 예외를 throw합니다.
None이 공장에서 유효한 경우 IBeltPrinter의 더미 구현을 반환합니다.
return null.

3

는 이러한 방법의 끝에 NotSupportedException을 던져 : 또는 내가 좋아하는 "이상한"뭔가를해야합니다.

1

나는 이것에 찔러 갈거야.

이 기능을 사용할 수 있습니까?

public class BeltPrinterFactory : IBeltPrinterFactory 
{ 
    public IBeltPrinter NewBeltPrinter() 
    { 
    BeltPrinter item = new BeltPrinter(); 
    switch (printerChoice) 
    { 
     case BeltPrinterType.ZebraQL220: 
     item.FunctionCall = ZebraCallback; 
     case BeltPrinterType.ONiel: 
     item.FunctionCall = ONielCallback; 
     default: 
     // do nothing; 
    } 
    return item; 
    } 
} 

당신은 콜백을 만들고 IBeltPrinter를 재 설계해야하지만 블룸버그 시장과 O.J. 것 심슨은 그것을 이해할 수 있어야합니다.

어느 쪽이든, 또는 나는 당신이 무엇을 요구하고 있는지 정말로 이해하지 못합니다.

관련 문제