문제
두 개의 생성자가있는 Person 개체가 있습니다. 하나는 int (personId), 다른 하나는 문자열 (logonName)을 사용합니다.문자열 (badgeNumber)을받는 다른 생성자를 원합니다.나는 이것이 할 수 없다는 것을 알고 있지만 그것이 일반적인 상황 인 것 같다.이것을 처리하는 우아한 방법이 있습니까?이것이 오버로드 된 메서드에 적용될 것이라고 생각합니다.코드 : 라코 디스
... 등
해결책
맞춤 유형 사용을 고려할 수 있습니다.
예를 들어 LogonName 및 BadgeNumber 클래스를 만듭니다.
그러면 함수 선언은 다음과 같습니다. 라코 디스
이러한 솔루션은 이러한 문자열의 형식과 사용을 관리하는 비즈니스 로직을 유지할 수있는 좋은 장소를 제공 할 수 있습니다.
다른 팁
대신 팩토리 메소드를 사용할 수 있습니까? 라코 디스
제 생각에 네 가지 옵션이 있으며 그 중 세 가지는 이미 다른 사람이 이름을지었습니다.
-
다른 사람들이 제안한대로 여기에서 공장 경로로 이동합니다. 이것에 대한 한 가지 단점은 오버로딩을 통해 일관된 이름을 지정할 수 없다는 것입니다 (그렇지 않으면 동일한 문제가 발생할 것입니다). 따라서 표면적으로 덜 깨끗합니다. 또 다른 더 큰 단점은 스택에 직접 할당 할 수 없다는 것입니다. 이 방법을 사용하면 모든 것이 힙에 할당됩니다.
-
사용자 지정 개체 래퍼. 이것은 좋은 접근 방식이며 처음부터 시작하는 경우 권장하는 방법입니다. 예를 들어 배지를 문자열로 사용하는 코드가 많은 경우 코드를 다시 작성하면 실행 불가능한 옵션이 될 수 있습니다.
-
문자열 처리 방법을 지정하여 메서드에 열거를 추가합니다. 작동하지만 새 열거를 포함하도록 모든 기존 호출을 다시 작성해야합니다 (원하는 경우 일부를 방지하기 위해 기본값을 제공 할 수 있음).
-
두 과부하를 구별하기 위해 사용되지 않는 더미 매개 변수를 추가합니다. 예 : 방법에 유전자 코디스 태그 코드를 붙입니다. 이 접근 방식은 몇 군데의 표준 라이브러리에서 사용됩니다.
bool
는std::nothrow
에 대한 더미 매개 변수입니다. 이 접근 방식의 단점은보기 흉하고 확장되지 않는다는 것입니다.기존 코드의 기반이 이미 큰 경우 열거 형 (아마도 기본값 사용)을 추가하거나 더미 매개 변수를 추가하는 것이 좋습니다. 둘 다 아름답지는 않지만 둘 다 개조하기가 상당히 간단합니다.
처음부터 시작하거나 코드의 양이 적은 경우 맞춤 개체 래퍼를 권장합니다.
원시
operator new
/badge
문자열을 많이 사용하지만logonName
클래스를 많이 사용하지 않는 코드가있는 경우 팩토리 메소드가 옵션이 될 것입니다.
C # 3.0을 사용하는 경우 개체 이니셜 라이저 : 라코 디스
아니요.
플래그 필드 (가독성을위한 열거 형)를 고려한 다음 생성자가 htat를 사용하여 의미를 결정하도록 할 수 있습니다.
작동하지 않습니다.이러한 모호함을 피하기 위해 문자열을 감싸는 BadgeNumber라는 클래스를 만드는 것을 고려할 수 있습니다.
동일한 서명을 가진 두 개의 다른 생성자 / 메소드를 가질 수 없습니다. 그렇지 않으면 컴파일러가 실행할 메서드를 어떻게 결정할 수 있습니까?
Zack이 말했듯이 "옵션사용자 정의 유형에 포함 된 매개 변수를 실제로 전달할 수있는 클래스입니다.즉, 원하는만큼 많은 매개 변수를 전달할 수 있고 옵션을 사용하여 원하는 작업을 수행 할 수 있습니다. 모든 작업을 시도하는 모 놀리 식 메서드를 만들지 않도록주의하세요.
그것 또는 공장 패턴 에 투표하십시오 ..
정적 팩토리 방법을 사용할 수 있습니다. 라코 디스
제안 된대로 맞춤 유형이이 경우에 적합합니다.
당신이하고자하는 일을 처리하기 위해 제가 생각할 수있는 유일한 것은 param 유형 (LogonName, BadgeNumer 등이있는 열거 형)을 설명하는 매개 변수를 갖는 것입니다. 두 번째는 매개 변수 값입니다.
공장 스타일 패턴으로 전환 할 수 있습니다. 라코 디스
또는 제안 된대로 맞춤 유형을 사용하세요.제네릭을 사용하여 해킹 할 수도 있지만 가독성을 위해 권장하지 않습니다.
어떻게 ... 라코 디스