고객 결제를 처리하는 데 사용되는 클래스가 있습니다. 이 클래스의 메소드 중 하나를 제외한 모든 메소드는 고객의 사용자 부담 정도를 계산하는 메소드를 제외하고 모든 고객에 대해 동일합니다. 이는 고객마다 크게 다를 수 있으며 사용자 지정 요인이 많을 수 있으므로 속성 파일과 같은 계산 논리를 쉽게 캡처 할 수있는 방법이 없습니다.
customerID를 기반으로 전환하는 못생긴 코드를 작성할 수 있습니다.
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
그러나 새로운 고객을 확보 할 때마다 수업을 재건해야합니다. 더 좋은 방법은 무엇입니까?
[편집] "중복"기사는 완전히 다릅니다. 나는 스위치 문장 을 피하는 방법을 묻지 않고 , 이 경우에 가장 적합한 현대적인 디자인을 요구하고 있습니다. 공룡 코드를 작성하려면 스위치 문장으로 해결할 수 있습니다. 기본적으로 "이 스위치는 다른 경우가 아니라 일부 경우에는 꽤 잘 작동합니다."라고 말했기 때문에 일반적이고 도움이되지 않는 예제가 제공됩니다.
[편집] 다음과 같은 이유로 최상위 답변 (표준 인터페이스를 구현하는 각 고객에 대해 별도의 "고객"클래스 만들기)으로 가기로 결정했습니다.
일관성 : 다른 개발자가 작성한 경우에도 모든 고객 클래스가 동일한 출력을 수신하고 리턴하도록하는 인터페이스를 작성할 수 있습니다.
유지 관리 성 : 모든 코드는 동일한 언어 (Java)로 작성되므로 다른 사람이 간단한 코딩 기능을 유지하기 위해 별도의 코딩 언어를 배울 필요가 없습니다.
재사용 : 코드에서 비슷한 문제가 발생하면 Customer 클래스를 재사용하여 "사용자 정의"논리를 구현하기 위해 여러 메소드를 보유 할 수 있습니다.
친숙 함 :이 작업을 수행하는 방법을 이미 알고 있으므로 신속하게 처리하고 더 시급한 다른 문제로 넘어갈 수 있습니다.
단점 :
새로운 고객마다 새로운 고객 클래스를 컴파일해야하므로 변경 사항을 컴파일하고 배포하는 방법이 다소 복잡해질 수 있습니다.
각각의 새로운 고객은 개발자가 추가해야합니다. 지원 담당자는 속성 파일과 같은 것에 로직을 추가 할 수 없습니다. 이것은 이상적이지 않지만 ...하지만 지원 담당자가 필요한 비즈니스 로직을 작성할 수있는 방법을 확신하지 못했습니다. 특히 많은 예외로 인해 복잡한 경우가 많습니다.
많은 신규 고객을 추가하면 확장 성이 떨어집니다. 이것은 예상되지 않지만, 발생하는 경우 코드의 다른 많은 부분과이 부분을 다시 생각해야합니다.
관심있는 사람들을 위해 Java Reflection을 사용하여 이름으로 클래스를 호출 할 수 있습니다.
Payment payment = getPaymentFromSomewhere();
try {
String nameOfCustomClass = propertiesFile.get("customClassName");
Class<?> cpp = Class.forName(nameOfCustomClass);
CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();
payment = pp.processPayment(payment);
} catch (Exception e) {
//handle the various exceptions
}
doSomethingElseWithThePayment(payment);