문제

두 개의 생성자가있는 Person 개체가 있습니다. 하나는 int (personId), 다른 하나는 문자열 (logonName)을 사용합니다.문자열 (badgeNumber)을받는 다른 생성자를 원합니다.나는 이것이 할 수 없다는 것을 알고 있지만 그것이 일반적인 상황 인 것 같다.이것을 처리하는 우아한 방법이 있습니까?이것이 오버로드 된 메서드에 적용될 것이라고 생각합니다.코드 : 라코 디스

... 등

도움이 되었습니까?

해결책

맞춤 유형 사용을 고려할 수 있습니다.

예를 들어 LogonName 및 BadgeNumber 클래스를 만듭니다.

그러면 함수 선언은 다음과 같습니다. 라코 디스

이러한 솔루션은 이러한 문자열의 형식과 사용을 관리하는 비즈니스 로직을 유지할 수있는 좋은 장소를 제공 할 수 있습니다.

다른 팁

대신 팩토리 메소드를 사용할 수 있습니까? 라코 디스

제 생각에 네 가지 옵션이 있으며 그 중 세 가지는 이미 다른 사람이 이름을지었습니다.

  1. 다른 사람들이 제안한대로 여기에서 공장 경로로 이동합니다. 이것에 대한 한 가지 단점은 오버로딩을 통해 일관된 이름을 지정할 수 없다는 것입니다 (그렇지 않으면 동일한 문제가 발생할 것입니다). 따라서 표면적으로 덜 깨끗합니다. 또 다른 더 큰 단점은 스택에 직접 할당 할 수 없다는 것입니다. 이 방법을 사용하면 모든 것이 힙에 할당됩니다.

  2. 사용자 지정 개체 래퍼. 이것은 좋은 접근 방식이며 처음부터 시작하는 경우 권장하는 방법입니다. 예를 들어 배지를 문자열로 사용하는 코드가 많은 경우 코드를 다시 작성하면 실행 불가능한 옵션이 될 수 있습니다.

  3. 문자열 처리 방법을 지정하여 메서드에 열거를 추가합니다. 작동하지만 새 열거를 포함하도록 모든 기존 호출을 다시 작성해야합니다 (원하는 경우 일부를 방지하기 위해 기본값을 제공 할 수 있음).

  4. 두 과부하를 구별하기 위해 사용되지 않는 더미 매개 변수를 추가합니다. 예 : 방법에 유전자 코디스 태그 코드를 붙입니다. 이 접근 방식은 몇 군데의 표준 라이브러리에서 사용됩니다. boolstd::nothrow에 대한 더미 매개 변수입니다. 이 접근 방식의 단점은보기 흉하고 확장되지 않는다는 것입니다.

    기존 코드의 기반이 이미 큰 경우 열거 형 (아마도 기본값 사용)을 추가하거나 더미 매개 변수를 추가하는 것이 좋습니다. 둘 다 아름답지는 않지만 둘 다 개조하기가 상당히 간단합니다.

    처음부터 시작하거나 코드의 양이 적은 경우 맞춤 개체 래퍼를 권장합니다.

    원시 operator new / badge 문자열을 많이 사용하지만 logonName 클래스를 많이 사용하지 않는 코드가있는 경우 팩토리 메소드가 옵션이 될 것입니다.

아니요.

플래그 필드 (가독성을위한 열거 형)를 고려한 다음 생성자가 htat를 사용하여 의미를 결정하도록 할 수 있습니다.

작동하지 않습니다.이러한 모호함을 피하기 위해 문자열을 감싸는 BadgeNumber라는 클래스를 만드는 것을 고려할 수 있습니다.

동일한 서명을 가진 두 개의 다른 생성자 / 메소드를 가질 수 없습니다. 그렇지 않으면 컴파일러가 실행할 메서드를 어떻게 결정할 수 있습니까?

Zack이 말했듯이 "옵션사용자 정의 유형에 포함 된 매개 변수를 실제로 전달할 수있는 클래스입니다.즉, 원하는만큼 많은 매개 변수를 전달할 수 있고 옵션을 사용하여 원하는 작업을 수행 할 수 있습니다. 모든 작업을 시도하는 모 놀리 식 메서드를 만들지 않도록주의하세요.

그것 또는 공장 패턴 에 투표하십시오 ..

정적 팩토리 방법을 사용할 수 있습니다. 라코 디스

제안 된대로 맞춤 유형이이 경우에 적합합니다.

당신이하고자하는 일을 처리하기 위해 제가 생각할 수있는 유일한 것은 param 유형 (LogonName, BadgeNumer 등이있는 열거 형)을 설명하는 매개 변수를 갖는 것입니다. 두 번째는 매개 변수 값입니다.

공장 스타일 패턴으로 전환 할 수 있습니다. 라코 디스

또는 제안 된대로 맞춤 유형을 사용하세요.제네릭을 사용하여 해킹 할 수도 있지만 가독성을 위해 권장하지 않습니다.

어떻게 ... 라코 디스

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