Pergunta

Eu quero construir uma loja em que os produtos têm um pouco de assistente através do qual o preço, então é determinado. Neste caso, eu estou falando sobre a impressão de produtos.

Assim, para (um pouco) exemplo, quando você vem para a loja e quiser imprimir um cartão de visita, você começa a decidir se quer imprimir em preto e branco ou a cores, se você quiser escolher o papel grosso ou fino, se você deseja imprimir 100, 200, 500 ou 1000 peças e assim por diante.

Depois de tudo, haverá um preço para dizer Vamos: preto e branco, papel grosso, 200 pedaço => 40, - $

Na verdade você tem muitas mais opções para escolher. Então, como você pode pensar há muitos muitos preços, para o qual existe nenhuma fórmula .

Então, minha pergunta é: Como posso lidar com os preços

?

A minha primeira ideia:. Decorator Pattern

Mas quando eu pensei sobre isso, não é uma idéia muito boa. Como eu disse não existe uma fórmula verdadeira, também eu tenho que gerar o assistente (que pode ser diferente se você deseja imprimir cartões). Também quero ser capaz de mudar o preço vale a interface de administração ou adicionar um produto ou adicionar uma nova "decisão" como "você quer papel brilhante?" a um produto ou remover um (e ainda manter os preços intacta).

Então agora eu estou pensando em usar uma árvore para cada produto em que posso adicionar um nível (a nova decisão), os níveis de resort e assim por diante.

Outra idéia é construir algum tipo de-chave Objects através das decisões e procurar o preço-se em uma tabela de preços. Um pouco como um dicionário em que eu adicionar as decisões e depois de tudo que eu gerar uma chave de fora a olhar para cima o preço de uma tabela de preços.

Portanto, antes de prototipagem eu estava me perguntando se eu sou apenas cega e não vejo a solução óbvia ou talvez não há outra maneira que é mais elegante que eu não sei sobre?

Foi útil?

Solução

Bem, a idéia que estou tendo é bastante complexo, mas seu desejo é complexo também.

O problema com o assistente que você está descrevendo é que depois de terem feito todas as suas escolhas, eles podem querer voltar para # 2 e mudar uma coisa para ver como ele muda o preço - mas a forma como você está construindo seu assistente isso poderá afetar as escolhas posteriores podem ser feitas em tudo, e resultar em um conjunto bastante complexo de código que você tem que personalizar para cada produto - em vez de armazenar tudo muito bem em um banco de dados de tal forma que o código pode fazer tudo o necessário, e qualquer mudanças de produto ir para o banco de dados, não alterações de código.

Em primeiro lugar, você precisa entender que você tenha preços lógica, e, idealmente, esta será separada da apresentação. Em outras palavras, você deve ser capaz de apresentar um assistente passo a passo para um cliente, e uma única página com opções de caixa de seleção e campos para outra e têm-los a construir a mesma coisa com as mesmas restrições.

Tente evitar projetar o banco de dados para que você não pode fazer uma coisa ou outra. Em outras palavras, você restringir as opções futuras (e flexibilidade ao cliente) se você fizer uma "escolha sua própria aventura" assistente de estilo. A razão é que se eu passar por 10 etapas, em seguida, mudar o passo 2, eu tenho que passar por mais 8 etapas - isso pode ser bom se você garantir que não vou duplicar escolhas que eu já fiz, mas se eu sou mudando apenas a cor do papel Eu não quero cometer os mesmos 8 opções novamente. Se você vai fazer esta rota, certifique-se de manter um monte de estado em torno de modo que as escolhas que fizeram anteriormente mostrar-se como o padrão da próxima vez através de.

Gostaria de considerar a adição de mais um nível de abstração para o banco de dados. Em vez de especificar o caminho através de uma árvore que o usuário pode selecionar, eu gostaria de ver uma matriz com cada opção e produto e processo, mostrando compatibilidade.

Por exemplo, eu tenho três tipos de papel, 3 cores e 3 processos:

  • Papel

    • Luz
    • regular
    • Cartão
  • Cor

    • Red
    • Blue
    • Verde
  • Processo

    • Imprimir
    • Dobre
    • Bind

Então eu teria preços para cada jogo:

        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                            

Os espaços vazios denotar itens que não podem ser misturados.
As entradas notáveis:

  • Imprimir e imprimir combinado -. Dupla impressão frente e verso usa / atola a máquina com mais frequência
  • Você não pode colocar itens através da máquina de dobrar mais de uma vez (uma operação de dobra vezes está em branco) - mas você pode listar diferentes tipos de dobras e os papéis a que se aplicam
  • Você não pode vincular itens dobrado
  • Eu não fiz itens duplicados na matriz (isto é, de impressão de papel luz é a mesma impressão de papel luz - dependendo de como você criar suas consultas você vai querer para denotar isso, ou formar a mesa de uma maneira que ele doesn 't matéria)

Esta é apenas uma amostra de uma encarnação simples - cada preço seria realmente um link para outra tabela que dá o preço por cada um, se a quantidade está dentro de um determinado intervalo (ou seja, 100 pode ser mais barato do que 10). Ele também iria realizar se a carga é cada pedaço de papel, por operação, ou por pedido - e esta pilha poder (de modo que você pode ter uma carga de ligação de 0,001 por pedaço de papel para a conta para uso e desgaste sobre os cortadores, e 0,50 per livro encadernado para o preço pedaço, então $ 5 taxa de instalação para a operação de ligação ao todo)

Isto irá rapidamente tornar-se bastante complexo, dado o número de cisalhamento de coisas que você tem que você pode outras coisas a.

Mas uma vez que os dados são inseridos que lhe dará flexibilidade ilimitada em especificar os custos e apresentá-los ao usuário. Você pode encontrar, por exemplo, que vale a pena colocar cada modelo diferente de máquina de impressão em sua própria coluna (ao invés de apenas chamando-os de todas as impressoras) e encontrar o menor preço de impressão para o cliente com base no tipo de papel, cor e impressão de operações .

Você também pode preencher a matriz com o trabalho (tempo) para que você possa dar estimativas de tempo no mesmo lugar, como estimativas de preços.

Se você faz um assistente, ou mostrar tudo na página de uma vez, esta infra-estrutura irá apoiá-lo. Olhe para o que a Dell faz para configurações de laptop - você não pode' ficar certas coisas com outras coisas. Então, se você exibir todas as opções em uma página, em seguida, quando eles mudam de papel regular para cartolina pode alertá-los com dobrável, "Você também optou, que é incompatível com o cartão. Tem certeza de que deseja fazer isso mudança? "

Mas, antes de tudo - escrever casos de uso e projetar o sistema como um todo em primeiro lugar. Se você entrar em cena agora e começar a programar algo tão complexo, você está indo para tomar decisões agora que vai ser muito difícil de desfazer mais tarde, mas você encontrará mais tarde você tem que quer fazer grandes mudanças, ou compromisso sobre um recurso.

É claro, a escolher o seu próprio estilo de aventura é muito mais fácil de projetar e desenvolver, o único problema é que se você adicionar um novo processo ou papel, você pode ter que atualizar 200 árvores, e adicionar 50 novas árvores. Toda mudança na loja exige uma nova implementação de banco de dados (e, possivelmente, software), que atrasa retorno em despesas de capital. Se você torná-lo frente-se muito flexível, é mais difícil agora, e mais fácil / mais rápido mais tarde.

Além disso, você não limitar os seus clientes com as opções de árvores - se eles realmente querem para imprimir via 4 imprensa cor de um lado, e copiadora barato por outro eles podem explorar essa opção se os processos e materiais são compatíveis. Passado 20 produtos / processos, você não pode realmente preencher totalmente fora da árvore.

Lasty, dá-lhe um controle muito, muito fino sobre o custo. Se o seu uso de faixas máquina de processos de negócios e custos (manutenção, etc) em um nível de grão fino, você pode underbid seu concorrente, porque você sabe que seus custos de máquina exatamente 0,00234 por página, enquanto eles estão presos com o palpite genérico. Se você começar a controlar a utilização deste sistema e tornar os funcionários rastrear problemas, manutenção, etc, você pode encontrar correlações muito estranhas, tais como custos de estoque cartão vermelho você mais no máquina de dobrar, porque atola com mais frequência do que o azul (por qualquer motivo). Você pode ajustar o seu preço (à enésima potência, neste sistema), fale com o fabricante de papel, oferecendo parada essa opção, ou uma série de outras táticas para espremer o sistema. Se algumas das suas máquinas requerem operadores qualificados você pode adicionar os funcionários da matriz com sua taxa de pagamento, e iniciar trabalhos de agendamento de modo que eles estão trabalhando de forma mais eficiente e eficaz.

Atualização

Então, digamos que eu escolho Papel Luz, Vermelho Cor, imprimir. Como faço para chegar ao preço certo? Em um bidimensional mesa Eu tenho três pares possíveis Red / Imprimir, Vermelho / Luz, Imprimir / Luz. Infelizmente eu não posso calcular o preço no uma fórmula evoluindo Tenho apenas uma preço final, após todas as escolhas têm sido feita.

Bem, eu simplificou o acima, mas vamos supor que o caso simples em primeiro lugar.

Eu não mencionei na tabela acima que cada preço representados. O custo de tudo é por página, a não ser vinculativo. O custo para a ligação foi por item vinculado.

Assim, no seu exemplo a escolher o papel Luz, vermelho, impressão. Cada pedaço de papel vermelho é de R $ 0.05 (papel caro!) E cada impressão é de US $ 0,001 (impressão barata) para que o custo por pedaço de papel impresso é de R $ 0,051. Se você estiver fazendo 300 cópias, em seguida, a carga total é de R $ 15,30.

Uma vez que a ligação é listado por item limite, então você pode adicionar a ligação com a ordem acima, e você pode ser vinculativo 50 páginas juntos, para um total de 6 itens vinculados, 300 páginas. Nós já sabemos o custo de everythign anterior, de modo que o custo adicional de 6 itens encadernados (US $ 0,50 por item) é de US $ 3,00, para um novo total de US $ 18,30.

Há algumas coisas que você vai ter que fazer além da simplificação eu especificado acima, porém:

Ema matriz Deixei muitas células vazias. Em alguns casos isso é porque os processos / objetos são incompatíveis (não pode vincular itens dobrado, por exemplo), mas em outros casos não há nenhum conflito, mas não custa nada. Portanto, o seu exemplo de vermelho / regulares vs regulares / vermelho -. Já que estamos adicionando preços junto a custos combinação alternativo nada

Vamos ver se eu posso tornar isso mais claro ...

O papel selecção luz, vermelho, impresso, encadernado (300 páginas, 6 itens encadernados) passar pela mesa e encontra todos os preços que caem dentro desse conjunto:

preços células mostra matriz onde as opções colidem para fornecer informações sobre preços

Você procurar todos os elementos na tabela (ambos vermelho / luz e luz / vermelho) e, em seguida, tomar os preços e multiplicar pela quantidade individualmente, em seguida, soma-los. A intersecção de todas essas seleções é mostrado em verde. (Sujou acima no papel light / coloração luz papel - deve ser verde também)

Eu removi o / combinação de impressão de impressão, porque não vai funcionar com este método (eu estava esperando para simplificar as coisas, mas ele realmente faz as coisas mais difíceis) Se você quiser especificar duplos de impressão que você vai precisar de outro item na mesa (impressão inversa, por exemplo) e você selecionar impressão e imprimir inversa. Alternadamente tem dois itens, "imprimir único lado" e "imprimir dos dois lados".

Tenha em mente que, enquanto eu listei cada preço em cada célula, a realidade é que cada célula na verdade descreve algumas circunstâncias:

  1. A referência a uma tabela de preços
  2. Não há custo
  3. A restrição (combinação não é possível)

A referência em # 1 refere-se a uma outra tabela que contém os preços e uma terceira dimensão. Por exemplo, a célula em combinação "luz / ligado" ia fazer referência a uma tabela que apresenta as seguintes três atributos:

  • Per preço página
  • Por preço do item ligado
  • Per trabalho (setup) preço

Estes seriam somados de acordo com o número de páginas e itens vinculados, e em seguida o por trabalho custo é adicionado no topo.

Mais complexidade! Woo!

Isso pode funcionar para suas necessidades, mas que se você tem processos que só são incompatíveis em determinadas situações mais complexas?

Agora podemos cobrir o caso geral de um processo ou objeto em conflito com outro. Não podemos, no entanto, lidar com qualquer coisa mais complexa.

Suponha que a luz papel pode ser impresso, e ele pode ser dobrado, mas não pode ser impresso e dobrado. Não podemos colocar uma restrição no impressão / Dobre porque outros documentos podem ser impressos e dobrados.

Existem algumas coisas que você pode fazer:

  • Adicione uma terceira dimensão - mas então você pode ter uma sequência que não pode ser feito se 4 coisas estão juntos mista, o que significa uma outra dimensão, etc
  • Use vetores (map / reduce)
  • Adicione uma camada de abstração

Os vetores são bons, mas pode ser um exagero para esta aplicação. É basicamente o primeiro item, mas sem definir quantas dimensões que você pode ter - você tem tantas dimensões como você tem objetos, portanto, qualquer combinação possível pode ser representado.

A camada adicional de abstracção é um compromisso entre os dois. Idealmente, você não terá muitos conflitos que são mais complexos do que dois itens, mas quando o fizer, você define um novo objeto que representa uma combinação. Portanto, neste caso você pode ter um novo objeto / processo que é a combinação de impressão e dobrar, e tem uma restrição na coluna com papel fino.

Você pode fazer isso apenas por constrangimentos, caso em que ele não modificar seu algoritmo de preços (ou seja, os preços ainda vem da adição de processos e objetos individuais.)

Como alternativa, você pode usar um algoritmo que seleciona o maior combinação - Então, ao invés de procurar o banco de dados para a Light, Vermelho, Imprimir, Dobre você primeiro procurar o banco de dados paracombinações, que voltaria a maior combinação de luz, vermelho, PrintFold, e então o preço-lo normalmente.

Por fim, você pode pesquisar o banco de dados para ambos os itens individuais e combinatórias, e onde há um conflito (dupla fixação de preços de combinação e itens individuais), então você quer selecionar:

  • O maior custo
  • A maior combinação
  • Os custos priorizados (ou seja, cada custo tem uma prioridade atribuído, e você comparou-os durante os conflitos e escolher aquele que tem prioridade)

-Adam

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top