문제

우리가 말하자면 나는 textbox 또는 다른 형태의 입력을 요구하는 사회보장 번호입니다.라는 SSN 은 순수한 예제는 단순히 저의 생각으로 지금이다.이 자연스럽게 입력될 문자열로 저장되었습니다.

string s = Console.ReadLine();

우리가 말하고 싶을 수 있는 방법을 확인하는 SSN 고 그것을 사용할 수 있습 통해 코드에서는 모든 종류의 장소입니다.지옥은,나는 심지어 방법에는 변수 결정되지 않은 사용자 입력이 있습니다.

이것이 가능한가요?

public bool IsValidSSN(Object SSN)
{
int mySSN;
    if(Int.Parse(SSN == false)
    {
    mySSN = Convert.toInt32(SSN);
    }
...
}

또는 당신은 사람이 는 요청이 특정 데이터 형식,e.g

public bool IsValidSSN(int SSN)
{
...
}

고 그 때문에 나는 필요한 변환 입력하여 정확한 데이터 유형을 하기 전에 나는 방법에습니다.

BTW:이제까지 어떻게 적절한 IsValidSSN 코드:)I just wanted to give 의 예 때 나는 무엇을 의미하는 말했다:Can I accept the 개체 데이터 유형 매개변수로 하거나 내가 해야 그것을 피하려고?

도움이 되었습니까?

해결책

객체를 수락 해야하는 경우 적어도 강력하게 입력 한 매개 변수를 취하는 메소드의 과부하가 있습니다. 그런 다음 객체 변형이 이러한 방법으로 피드되도록하십시오.

public bool IsValidSSN(object ssn) {
  ...
  IsValidSSN(Convert.ToInt32(ssn));
  ...
}

public bool IsValidSSN(int ssn) {
  ...
}

다른 팁

그것은 당신의 디자인과 당신의 검증이 발생하기를 원하는 곳에 완전히 달려 있습니다. 실제로는 근본적으로 전체 아키텍처와 클래스 계층에 따라 다릅니다. 어느 쪽이든 그렇게하는 것은 잘못이 아닙니다. 건축 디자인에 맞는 방식인지 확인하십시오.

이 경우 객체를 수락하는 데 가치가 없습니다. 그 기능이 어떻게 작동하기를 기대하는지 생각해보십시오. (당신이 게시 한 코드가 작동하지 않기 때문에 분명히하지 않았습니다). 나는 당신이 다음과 같은 것을 계획하고 있다고 생각합니다.

if (SSN is string)
    SSN = Convert.toInt32(SSN);
else if (SSN is TextBox)
    SSN = Convert.toInt32(SSN.Value);
else /* etc */

어떻게 더 나은지 :

 bool isValidSSN(int SSN) { /* real valuation code */ }
 bool IsValidSSN(String SSN)  { return isValidSSN(Convert.toInt32(SSN)); }
 bool IsValidSSN(TextBox SSN)  { return isValidSSN(Convert.toInt32(SSN.Value)); }

과부하 된 방법은 런타임에서 컴파일 시간까지 무엇을 해야하는지에 대한 결정을 더 많이하기 때문에 더 간단하고 빠릅니다.

위의 예에서는 입력 된 Isvalidssn을 만드는 것이 훨씬 쉽습니다. 일반적으로 타이핑하면 버그와 유연성이 줄어 듭니다.

객체를 사용하는 것이 가장 적합한 경우 유연성이 가장 좋은 선택 일지 모르지만 로그에서 몇 가지 캐스트 충돌 예외에 직면 할 것으로 예상됩니다.

다른 모든 경우에 타이핑에 엄격하거나 파이썬으로 작성하십시오.

개인적으로, 나는 SSN 수업을 만들고 SSN이 유효한지 여부를 물어볼 수 있습니다. 비즈니스 논리에서 교장을 대표하는 수업을 갖는 것이 중요합니다. 예를 들어, 신용 카드 클래스와 같은 더 많은 검증이 필요한 무언가로 할 수있는 일입니다. 객체 주위를 건네주는 것이 가장 좋지 않습니다. 원시가 나쁘기 때문에 비즈니스 논리의 주요 원칙적 인 것을 주변에 건네면 (아키텍처가 SSN1 + SSN2 = SSN3은 비즈니스 로직에서도 완벽하게 유효합니다. ).

이 예에서 나는 것이었다고 말하지 않습니다.어떤 경우에 입력 있는 대시,또는 다른 분리하는 문자(예를 들어:###-##-####)?당신은 분명히 있지 않을 것을 구문 분석할 수 있는 값이 정수로만 하는 것이 여전히 유효합니다.는 방법에 대해 정규표현식을 사용하여는 대신 가치를 보장하는 것은 무엇을 원합니다.

의 관점에서 사용 유형""개체 매개변수로,이것은 완전히 유효에서 많은 인스턴스가 있습니다.사실,그것은 전체에서 사용됩니다.NET Framework(보고에서는 이벤트 대표):

public void Control_MouseOver(object sender, MouseEventArgs e){}

이 간단한 케이스의 복싱/Unboxing,는 방법으로 수행하는"일반적인"작업에 변수까지.NET2.0.

사용할 수도 있습니다 제네릭 이 문제를 해결하기 위해 필요없이 캐스팅.을 만드는 경우 인터페이스를 구현하는 무언가 다음과 같 INumeric(내가 알지 못하는 경우 실제적인 인터페이스)또는 IComparable 할 수 있어야 합서 작업을 수행하는 더 우아한 패션:

공공 bool IsValidSNN(INumeric SSN){}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top