2010-01-26 3 views
3

고객이 구매에 대한 할인을 받기 위해 쿠폰을 사용할 수있는 시스템을 구현 중입니다. 바우처가 특정 구매에 사용될 수있는 경우에는 여러 가지 상황에 따라 다릅니다. 예를 들어복잡한 제한이있는 작업의 실패를 설명하는 방법

:

  • 적절한 쿠폰 코드 - 코드가 정확한지?
  • 유효 기간 - 유효 기간은 여전히 ​​유효합니까?
  • 바우처를 구매 유형과 함께 사용할 수 있습니까?
  • 조합 허용 - 바우처를 다른 바우처와 함께 사용할 수 있습니까?
  • 더 많은 ...

도 확인해야 할 몇 가지 더 복잡한 제한 사항이 있습니다. 하나 이상의 제한 사항이 충족되지 않으면 고객이 바우처를 사용할 수 없으며 "WHY"라는 설명과 함께 실패에 대해 알리고 싶습니다. 예를 들어

" 이 바우처는 오래되어 사용하지 마십시오. "

내 질문의 현재 : 수표를 어떻게 구현합니까?
각 제한을 자체 클래스에 구현하고 해당 제약을 체인화하고 예외를 throw합니까? (문제는 여러 개의 동일한 데이터베이스 쿼리가 실행될 수 있음) 하나의 단일 메서드로 모든 제한 사항을 구현합니까? (실제로, 왜?) 일반적으로 작업에 복잡한 제한이 적용되는 경우 클라이언트에게 실패의 세부 정보를 알려야하는 메커니즘을 어떻게 구현합니까?

감사합니다.

답변

2

개인적으로 한 가지 방법으로 수표를 구현합니다. 바우처가 들어가면 오류 메시지가 표시됩니다 (있는 경우).

이렇게하면 모든 코드가이 메서드 뒤에 숨겨져 유지 관리가 쉬워집니다. 무언가가 잘못되었는지 확인하는 곳, 새로운 것을 추가 할 때 수정하는 곳 등

우리가 많은 수의 테스트를하고 있다면, 그 방법을 클래스로 변경하는 것입니다 (그러나 다시 한 번 책임은 한 곳에서 이루어집니다. 복잡성이 곳곳에 퍼지지 않고).

그냥 내 두 센트.

0

의도가 추상화되어 있으므로 은 어떻게 구현 되었습니까? 또는 소스 코드가 어떻게 구성되었는지는 중요하지 않습니다. 기본적인 수준에서 당신이 가지고있는 것은 실패 설명 모음을 생성하는 체커 모음입니다.

들의 유사 코드는 기본적으로 다음과 같습니다

장소에서이 논리와
let reasons be a new, empty collection of failure reasons 
let checkers be the list of relevant checkers 

for each checker in checkers 
    if checker passes, continue 
    if checker fails, add explanation to reasons 

if number of reasons is zero, 
    voucher is valid, success 
if number of reasons > zero, 
    the voucher is invalid, format each element in reasons for display to the user 

,이 코드의 일부가 아니라 그들이 얻을 수로, 체커가 어떻게 구성되어 있는지 중요하지 않습니다 목록. 당신은 수표가 많은 단일 방법을 사용할 수 있으며, 아마도 여러 가지 이유가있을 수 있습니다. 검사기 목록에 각각 하나의 인스턴스가있는 많은 클래스를 가질 수 있습니다. 결정적으로 실제 체커는이 논리에서 분리되며 언제든지 다른 체커를 사용할 수 있습니다 (비즈니스 규칙 변경 또는 다른 지역의 다른 규칙).

언어에 따라 최소한 체커에 사용 된 유형을 추상화해야합니다.

시작하기. 동일한 데이터베이스 쿼리를 발견하면 체커 컬렉션 실행을위한 캐시를 고려해야합니다.

소스 레벨에서 체커를 구성하는 방법은 중요하지 않습니다. 오직 추상화가 있습니다. 세부 사항은 일단 숨겨진 추상 수준을 제공하면 상당히 유연합니다.

장점 :

  • (아마도 비즈니스 규칙에 따라 변경됩니다) 실제, 구체적인 검사에 대해 걱정하지 않는 검사를 수행하는 비트.
  • checker는 다음과 같이 구성 할 수 있습니다. 하나의 소스 파일에 함께 정의되거나 다른 구성표에 따라 펼쳐집니다. 또한 테스트를 위해 단일 체커를 자유롭게 분리 할 수 ​​있습니다.
  • 컬렉션 및 예쁜 서식은 검사 유형이나 수에 관계없이 한 번만 구현하면됩니다.

단점 :

  • 그것은 추상화를 설계하는 괜찮은 일을 할 선행 시간이 걸립니다. 이것은 아마도 나중에 지불 할 것입니다.
  • 간접 참조의 계층은 이해하기 어렵게 만들고 실제 확인을 추적합니다. 유연성은 이해하기 쉽지 않습니다. 이러한 시나리오를 고려해야합니다. 제 생각에는 바우처 에 대한 규칙은으로 시간이 지남에 따라 변경 될 가능성이 있으며 여기 추상화는 이해하기 어렵지 않으므로 그만한 가치가 있다고 말하고 싶습니다.

예를 Java로 작성하는 데 시간을 할애했지만 실제로 많이 추가하지 않았습니다. 당신이 추상화의 관점에서 생각하고 시도한다면, 실제 메커니즘은 덜 중요합니다.

0

최근 한 단계 체크 아웃 페이지를 사용하여 주문 한 유사한 문제를 처리했습니다. 결국 우리는 모든 관련 "문제"의 배열을 생성하는 것이 훨씬 더 유용하다는 것을 알았습니다 (발생 된 첫 번째 문제를 설명하는 문자열이 아닌 코드, 표시 메시지 등을 사용하여 간단한 클래스로 래핑했습니다).

관련 문제의 배열을 반환하는 단일 검사기 메서드와 함께 작동합니다. 기본 검사 메소드는 배열을 빌드하는보다 구체적인 검사 메소드를 호출합니다. 다른 사람이 이미 실패한 경우 일부 수표를 건너 뛸 수도 있습니다.

관련 문제