시아로 개체 매개 변수로 가능한가요?
-
12-09-2019 - |
문제
우리가 말하자면 나는 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){}