문제

나는 제품의 가격이 결정되는 작은 마법사가 있는 상점을 만들고 싶습니다.이 경우에는 인쇄 제품에 대해 이야기하고 있습니다.

따라서 (조금) 예를 들어 상점에 와서 명함을 인쇄하려고 할 때 흑백으로 인쇄할지 컬러로 인쇄할지, 두꺼운 종이를 선택할지 얇은 용지를 선택할지, 원하는 경우에 결정하게 됩니다. 100, 200, 500 또는 1000개 등을 인쇄합니다.

결국 다음과 같은 가격이 있을 것입니다.흑백, 두꺼운 종이, 200장 => 40,-$

실제로는 선택할 수 있는 선택이 더 많습니다.그래서 당신이 생각할 수 있듯이 많은 가격이 있습니다. 공식 없음.

그래서 내 질문은 다음과 같습니다가격은 어떻게 처리할 수 있나요?

내 첫 번째 아이디어:데코레이터 패턴.

그런데 곰곰이 생각해 보니 별로 좋은 생각은 아니었습니다.실제 수식이 없다고 말했듯이 마법사를 생성해야 합니다(인사말 카드를 인쇄하려는 경우에는 다를 수 있음).또한 가격 통로를 관리자 인터페이스로 변경하거나 제품을 추가하거나 "Glossy Paper를 원하십니까?"와 같은 새로운 "결정"을 추가 할 수 있기를 원합니다. 제품에 또는 하나를 제거하십시오 (그리고 여전히 가격을 그대로 유지하십시오).

그래서 이제 나는 레벨(새로운 결정), 리조트 레벨 등을 추가할 수 있는 각 제품에 대해 트리를 사용하는 것에 대해 생각하고 있습니다.

또 다른 아이디어는 결정을 통해 일종의 핵심 개체를 구축하고 가격표에서 가격을 조회하는 것입니다.결정 사항을 추가하고 결국 가격표에서 가격을 조회하기 위해 키를 생성하는 사전과 비슷합니다.

그래서 프로토타입을 만들기 전에 저는 제가 눈이 멀었고 확실한 해결책을 찾지 못하는 것인지, 아니면 제가 모르는 더 우아한 다른 방법이 있는지 궁금했습니다.

도움이 되었습니까?

해결책

글쎄요, 제가 생각하는 생각은 다소 복잡하지만 당신의 욕구도 복잡합니다.

당신이 설명하는 마법사의 문제점은 모든 선택을 마친 후 #2로 돌아가서 한 가지를 변경하여 가격이 어떻게 변하는지 확인하려고 할 수 있다는 것입니다. 그러나 마법사를 구축하는 방식은 나중에 선택할 수 있는지 여부에 영향을 미칠 수 있으며, 결과적으로 각 제품에 대해 사용자 정의해야 하는 다소 복잡한 코드 세트가 생성될 수 있습니다. 코드가 필요한 모든 작업을 수행할 수 있도록 모든 것을 데이터베이스에 잘 저장하는 대신 제품 변경 사항이 발생하지 않습니다. 코드 변경이 아닌 데이터베이스에 추가됩니다.

먼저, 가격 책정 논리가 있다는 점을 이해해야 하며 이상적으로는 이는 프레젠테이션과 분리됩니다.즉, 한 고객에게는 단계별 마법사를 제공하고 다른 고객에게는 확인란 옵션과 필드가 포함된 단일 페이지를 제공하여 동일한 제한 사항을 적용하여 동일한 것을 구축하도록 할 수 있어야 합니다.

둘 중 하나를 수행할 수 없도록 데이터베이스를 설계하지 마십시오.즉, "자신만의 모험 선택" 스타일 마법사를 수행하면 향후 옵션(및 고객 유연성)이 제한됩니다.그 이유는 10단계를 거친 다음 2단계를 변경하면 8단계를 더 거쳐야 하기 때문입니다. 이미 선택한 선택이 중복되지 않는다고 보장하면 괜찮을 수 있지만 종이 색깔만 바꾸는 것만으로는 똑같은 8가지 선택을 다시 하고 싶지 않습니다.이 경로를 선택하는 경우 이전에 선택한 항목이 다음 번에는 기본값으로 표시되도록 많은 상태를 유지해야 합니다.

데이터베이스에 추상화 수준을 한 단계 더 추가하는 것을 고려해 보겠습니다.사용자가 선택할 수 있는 트리를 통해 경로를 지정하기보다는 각 옵션과 제품 및 프로세스에 대한 호환성을 보여주는 매트릭스를 보고 싶습니다.

예를 들어, 세 가지 용지 유형, 세 가지 색상, 세 가지 프로세스가 있습니다.

  • 종이

    • 정기적인
    • 카드
  • 색상

    • 빨간색
    • 파란색
    • 녹색
  • 프로세스

    • 인쇄
    • 묶다

그런 다음 각 경기에 대한 가격을 결정합니다.

        Light   Regular Card    Red     Blue    Green   Print   Fold    Bind
Light                           0.05    0.05            0.001           0.50
Regular                         0.06    0.05    0.07    0.001   0.02    0.80
Card                                    0.06            0.002           0.90
Print                                                   0.002   
Fold                                                            
Bind                            

공백은 혼합할 수 없는 항목을 나타냅니다.
주목할만한 항목:

  • 인쇄와 인쇄 결합 - 양면 인쇄는 기계를 더 자주 마모/걸림시킵니다.
  • 접지기에 항목을 두 번 이상 넣을 수 없습니다(접기 작업은 비어 있음). 그러나 다양한 접기 유형과 적용되는 용지를 나열할 수 있습니다.
  • 접힌 항목은 묶을 수 없습니다.
  • 매트릭스의 항목을 복제하지 않았습니다. 즉, 가벼운 종이 인쇄는 가벼운 종이 인쇄와 동일합니다. 쿼리를 작성하는 방법에 따라 이를 표시하거나 중요하지 않은 방식으로 테이블을 구성할 수 있습니다. )

이는 단순한 구현의 샘플일 뿐입니다. 각 가격은 실제로 수량이 특정 범위 내에 있는 경우(즉, 100이 10보다 저렴할 수 있음) 각 가격을 제공하는 다른 테이블에 대한 링크입니다.또한 요금이 종이 조각당, 작업당 또는 주문당인지 여부를 유지하며 이는 누적될 수 있습니다(따라서 절단기의 마모를 고려하여 종이 조각당 0.001의 구속력 있는 요금을 가질 수 있고 0.50 책 한 권당 조각 가격을 지불하고 제본 작업에 대한 설치 비용은 모두 $5입니다.)

당신이 다른 일을 할 수 있는 일의 양이 너무 많다는 점을 고려하면 이는 매우 복잡해질 것입니다.

그러나 일단 데이터가 입력되면 비용을 지정하고 이를 사용자에게 제시하는 데 무한한 유연성이 제공됩니다.예를 들어, 서로 다른 인쇄 기계 모델을 자체 열에 배치하고(단순히 모든 프린터라고 부르는 대신) 용지 유형, 색상 및 인쇄 작업을 기반으로 고객을 위한 최저 인쇄 가격을 찾는 것이 가치가 있다는 것을 알 수 있습니다. .

가격 견적과 같은 곳에서 시간 견적을 낼 수 있도록 노동(시간)으로 매트릭스를 작성할 수도 있습니다.

마법사를 수행하든, 페이지의 모든 것을 한 번에 표시하든, 이 백엔드는 이를 지원합니다.Dell이 노트북 구성에 대해 수행하는 작업을 살펴보십시오. 다른 작업으로는 특정 작업을 수행할 수 없습니다.따라서 페이지에 모든 옵션을 표시한 다음 일반 용지에서 카드 용지로 변경할 때 "카드 용지와 호환되지 않는 접지도 선택하셨습니다.정말로 이렇게 변경하시겠습니까?"

그러나 무엇보다도 먼저 사용 사례를 작성하고 시스템 전체를 설계하십시오.지금 당장 뛰어들어 이렇게 복잡한 코딩을 시작하면 나중에 실행 취소하기가 매우 어려운 결정을 지금 내리게 됩니다. 그러나 나중에는 크게 변경하거나 기능을 타협해야 한다는 것을 알게 될 것입니다.

물론 자신만의 모험 스타일을 선택하는 것이 설계 및 개발이 훨씬 쉽습니다. 유일한 문제는 새로운 프로세스나 문서를 추가하는 경우 200개의 나무를 업데이트하고 50개의 새 나무를 추가해야 할 수도 있다는 것입니다.작업장을 변경할 때마다 새로운 데이터베이스(및 소프트웨어) 출시가 필요하므로 자본 비용에 대한 회수가 지연됩니다.매우 유연하게 만들면 지금은 더 어려워지고 나중에는 더 쉽고 빨라집니다.

또한 고객을 트리 옵션으로 제한하지 않습니다. 한쪽은 4색 인쇄기로 인쇄하고 다른 쪽은 값싼 복사기로 인쇄하려는 경우 프로세스와 재료가 호환된다면 해당 옵션을 탐색할 수 있습니다.지난 20개의 제품/프로세스로 인해 트리를 완전히 채울 수는 없습니다.

마지막으로 비용을 매우 세밀하게 제어할 수 있습니다.귀하의 비즈니스 프로세스가 기계 사용 및 비용(유지보수 등)을 세밀한 수준에서 추적하는 경우 기계 비용을 알고 있으므로 경쟁사보다 낮은 가격으로 입찰할 수 있습니다. 정확히 페이지당 0.00234이지만 일반적인 추측에 갇혀 있습니다.이 시스템을 사용하여 추적을 시작하고 직원들이 문제, 유지 관리 등을 추적하도록 하면 빨간색 카드 재고와 같은 매우 이상한 상관관계를 발견할 수 있습니다. 접는 기계는 파란색보다 더 자주 걸리기 때문입니다(이유가 무엇이든).가격을 조정하거나(이 시스템에서는 n단계까지), 용지 제조업체에 문의하거나, 해당 옵션 제공을 중단하거나, 시스템을 압박하기 위한 기타 여러 가지 전술을 사용할 수 있습니다.일부 기계에 숙련된 작업자가 필요한 경우 직원을 급여와 함께 매트릭스에 추가하고 작업 예약을 시작하여 보다 효율적이고 효과적으로 작업할 수 있습니다.

업데이트

라이트 페이퍼, 붉은 색, 인쇄를 선택한다고 가정 해 봅시다.올바른 가격은 어떻게 받습니까?2 차원 테이블에는 3 개의 가능한 쌍 빨간색/인쇄, 빨간색/조명, 인쇄/조명이 있습니다.슬프게도 진화하는 공식으로 가격을 계산할 수는 없습니다.

글쎄, 위의 내용을 단순화했지만 먼저 간단한 경우를 가정해 보겠습니다.

위 표에서는 각 가격이 무엇을 나타내는지 언급하지 않았습니다.제본을 제외한 모든 비용은 페이지당 비용입니다.제본 비용은 제본 항목당이었습니다.

따라서 귀하의 예에서는 Light paper, red, print를 선택합니다.빨간 종이 한 장의 가격은 $0.05(비싼 종이!)이고 인쇄 한 장당 $0.001(저렴한 인쇄)이므로 인쇄된 종이 한 장당 비용은 $0.051입니다.300개를 복사하는 경우 총 비용은 $15.30입니다.

제본은 제본된 항목별로 나열되므로 위 순서에 제본을 추가하고 50페이지를 함께 제본하여 총 6개의 제본 항목, 300페이지를 제본할 수 있습니다.우리는 이전의 모든 비용을 이미 알고 있으므로 6개 바인딩 항목의 추가 비용(항목당 $0.50)은 $3.00이므로 새로운 총액은 $18.30입니다.

위에서 지정한 단순화 외에도 수행해야 할 몇 가지 작업이 있습니다.

행렬에서 많은 셀을 비워 두었습니다.어떤 경우에는 프로세스/객체가 호환되지 않기 때문이지만(예를 들어 접힌 항목을 바인딩할 수 없음) 충돌이 없지만 비용이 전혀 들지 않는 경우도 있습니다.따라서 빨간색/일반 대 일반/빨간색의 예 - 가격을 합산하므로 대체 조합에는 비용이 들지 않습니다.

좀 더 명확하게 설명할 수 있는지 살펴보겠습니다.

선택 밝은 종이, 빨간색, 인쇄됨, 제본(300페이지, 6개 제본 항목)이 테이블을 통과하여 해당 세트에 속하는 모든 가격을 찾습니다.

Pricing matrix shows cells where options collide to provide pricing information

표에서 모든 요소(빨간색/밝은색 및 밝은/빨간색 모두)를 검색한 다음 가격을 구하고 개별적으로 수량을 곱한 다음 합계를 냅니다.이러한 모든 선택 사항의 교차점은 녹색으로 표시됩니다.(가벼운 종이/가벼운 종이 색칠이 엉망입니다. 녹색도 되어야 합니다)

이 방법에서는 작동하지 않기 때문에 인쇄/인쇄 조합을 제거했습니다(일을 단순화하고 싶었지만 실제로는 일이 더 어려워졌습니다). 양면 인쇄를 지정하려면 테이블에 다른 항목이 필요합니다(인쇄 예를 들어 반전) 인쇄와 반전 인쇄를 모두 선택합니다.또는 "단면 인쇄"와 "양면 인쇄"라는 두 가지 항목이 있습니다.

각 셀에 각 가격을 나열했지만 실제로는 각 셀이 실제로 몇 가지 상황을 설명한다는 점을 명심하세요.

  1. 가격표 참조
  2. 비용 없음
  3. 제약사항(조합 불가)

#1의 참조는 가격과 세 번째 차원이 포함된 다른 테이블을 참조합니다.예를 들어 "light/bound" 조합의 셀은 다음 세 가지 속성을 가진 테이블을 참조합니다.

  • 페이지당 가격
  • 바운드당 아이템 가격
  • 작업당(설정) 가격

이는 페이지 수와 제본된 항목 수에 따라 합산된 다음 작업당 비용이 맨 위에 추가됩니다.

더 복잡해졌습니다!우!

이는 귀하의 요구 사항에 적합할 수 있지만 보다 복잡한 특정 상황에서만 호환되지 않는 프로세스가 있는 경우에는 어떻게 됩니까?

지금 우리는 한 프로세스나 개체가 다른 프로세스나 개체와 충돌하는 일반적인 경우를 다룰 수 있습니다.그러나 우리는 더 복잡한 것은 처리할 수 없습니다.

가벼운 종이를 인쇄하고 접을 수 있지만 인쇄와 접기를 동시에 수행할 수는 없다고 가정해 보겠습니다.다른 용지는 인쇄와 접기가 모두 가능하므로 인쇄/접기에 제한을 둘 수 없습니다.

수행할 수 있는 작업은 다음과 같습니다.

  • 3차원을 추가하세요. 하지만 4가지가 함께 혼합되면 다른 차원 등을 의미하는 시퀀스를 수행할 수 없게 될 수도 있습니다.
  • 벡터 사용(맵/축소)
  • 추상화 계층 추가

벡터는 훌륭하지만 이 응용 프로그램에는 과도할 수 있습니다.기본적으로 첫 번째 항목이지만 가질 수 있는 차원 수를 정의하지 않고 개체 수만큼 차원을 가지므로 가능한 조합을 표현할 수 있습니다.

추가 추상화 계층은 둘 사이의 절충안입니다.이상적으로는 두 항목보다 더 복잡한 충돌이 많지 않지만 충돌이 발생하면 조합을 나타내는 새 개체를 정의합니다.따라서 이 경우 인쇄와 접지가 결합된 새로운 개체/프로세스가 있을 수 있으며, 이는 가벼운 용지를 사용하는 열에 제약이 있습니다.

제약 조건에 대해서만 이 작업을 수행할 수 있으며, 이 경우 가격 책정 알고리즘이 수정되지 않습니다(즉, 가격 책정은 여전히 ​​개별 프로세스 및 개체를 추가하여 발생합니다).

또는 가장 큰 조합을 선택하는 알고리즘을 사용할 수 있습니다. 따라서 데이터베이스에서 Light, Red, Print, Fold를 검색하는 대신 먼저 데이터베이스에서 조합을 검색하면 Light, Red, PrintFold, 그런 다음 정상적으로 가격을 책정합니다.

마지막으로 데이터베이스에서 개별 품목과 결합 품목 모두를 검색할 수 있으며 충돌이 있는 경우(조합 품목과 개별 품목의 이중 가격) 다음 중 하나를 선택할 수 있습니다.

  • 가장 큰 비용
  • 최고의 조합
  • 우선순위 비용(즉, 모든 비용에는 우선순위가 할당되어 있으며 충돌 중에 이를 비교하여 우선순위가 높은 항목을 선택함)

-아담

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