2017-04-09 15 views
-1

사용자가 RGBA 바이트를 전달하여 생성자의 클래스에 대한 사용자 정의 색상을 지정하게하고 싶습니다. 사용자 지정 색을 지정하지 않으면 응용 프로그램 설정의 기본 색이 사용됩니다. 그러나 알파가 빠져 있다면 완전히 불투명하다고 가정합니다.선택적 바이트 인수가 전달되었는지 확인하십시오.

내가 좋아하는 것이 무엇 :

public MyClass(byte r_col = -1, byte g_col = -1, byte b_col = -1, byte a_col = 255) 
{ 
    if (r_col == -1 | g_col == -1 | b_col == -1) 
    { 
     // use default color 
    } 
    else 
    { 
     this.color = System.Windows.Media.Color.FromArgb(a_col, r_col, g_col, b_col); 
    } 
} 

그러나, "잘못된"값은 바이트에 대한이 없습니다 (-1 무효), 그래서 바이트 실제로 함수에 전달 된 경우 내가 감지 할 수 없습니까 . 어떤 옵션이 있습니까? 가능한 경우 함수 오버로딩을 피하고 싶습니다.

+2

사실 이것은 호출자가 무시할 일부 값을 전달할 수 있도록하기 때문에 잘못된 API 디자인입니다. 예 : 발신자가 R과 G 만 전달하면 어떻게됩니까? RGB 또는 RGBA 만 전달하면 안되며 오버로드가 필요합니다. –

+0

좋은 점 - 현재는 기본 색상을 사용하므로 오류가 발생하지 않습니다. 오버로드가 여기에서 가장 완벽한 방법이라고 생각합니다. – Michael

답변

1

기능 오버로드가 훨씬 더 아름다운이 경우입니다. 사용자가 허용하지 않는 매개 변수를 입력하게하면 버그를 추적하기가 어려워 질 수 있습니다. 더 큰 결과를 얻기 위해 더 많은 작업을하지 마십시오.이 경우 함수 오버로드를 사용하십시오.

0

이것이 C#에 null 허용 유형이있는 이유 중 하나라고 생각합니다. 다음 코드는 가능한 인수가 전달되었는지 확인하기 위해 nullable 형식을 사용하여 잘 작동

public MyClass(byte? r_col = null, byte? g_col = null, byte? b_col = null, byte a_col = 255) 
{ 
    if (r_col == null | g_col == null | b_col == null) 
    { 
     // use default color 
    } 
    else 
    { 
     System.Windows.Media.Color.FromArgb(a_col, 
              r_col.GetValueOrDefault(), 
              g_col.GetValueOrDefault(), 
              b_col.GetValueOrDefault()); 
    } 
} 

이 내 자신의 질문에 대한 답변입니다 -. 다른 제안도 감사합니다. (마이클은 분실물 센터로) 물론

public MyClass() 
{ 
    //Default color 
} 
public MyClass(byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(r_col, g_col, b_col); 
} 
public MyClass(byte a_col, byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(a_col, r_col, g_col, b_col); 
} 

이없이 그것을 할 수 있지만, 그렇지 좋은 API 디자인 (P.Kouverakis 언급)입니다 :

+1

사실 나는'GetCalueOrDefault()'메소드가 여기에 필요하다고 생각하지 않는다. -'.Value'는 이전에 그것을 검사 할 때 그것을해야한다. 하지만 정확히 왜 두 개가 아닌 하나의 수직 막대 만 사용하고 있습니까? 나는 이것이 더 잘 작동할지는 확신하지 못한다. – MetaColon

+0

어느 쪽이든 작동하지만, 제안 사항이 약간 더 빨리 실행되는 것으로 생각된다. – Michael