3

我想建立一个商店,其中的产品有一个小向导,然后通过它来确定价格。在这种情况下,我说的是印刷产品。

因此,对于(一个小)示例,当您来到商店并想要打印名片时,您可以决定是否要打印黑白或彩色,如果您想选择厚纸还是薄纸,如果您愿意打印 100、200、500 或 1000 件等。

毕竟会有一个价格让我们说:黑白,厚纸,200张=> 40,-$

实际上,您有更多选择可供选择。因此,您可以认为有很多价格,没有公式

所以我的问题是:我该如何处理价格?

我的第一个想法:装饰器模式。

但是当我想到它时,这不是一个好主意。正如我所说,没有真正的公式,我还必须生成向导(如果您想打印贺卡,可能会有所不同)。此外,我希望能够通过管理界面更改价格或添加产品或添加新的“决定”,例如“你想要光面纸吗?” 到产品或删除一个(并且仍然保持价格不变)。

所以现在我正在考虑为每个产品使用一棵树,我可以在其中添加一个级别(一个新的决定)、度假村级别等等。

另一个想法是通过决策构建某种关键对象并在价格表中查找价格。有点像字典,我在其中添加决策,毕竟我从中生成一个键来查找价格表中的价格。

所以在原型设计之前,我想知道我是否只是盲人,我没有看到明显的解决方案,或者也许还有另一种我不知道的更优雅的方法?

4

1 回答 1

8

嗯,我的想法很复杂,但你的愿望也很复杂。

您所描述的向导的问题是,在他们做出所有选择之后,他们可能想回到#2并更改一件事以查看它如何改变价格 - 但是您构建向导的方式可能会影响以后是否可以做出选择,并导致您必须为每个产品自定义一组相当复杂的代码 - 而不是将所有内容都很好地存储在数据库中,以便代码可以完成所需的一切,并且任何产品更改都会进行进入数据库,而不是代码更改。

首先,您需要了解您有定价逻辑,理想情况下这将与演示分开。换句话说,您应该能够向一个客户展示一步一步的向导,向另一个客户展示带有复选框选项和字段的单个页面,并让他们以相同的限制构建相同的东西。

尽量避免设计数据库,这样你就不能做其中之一。换句话说,如果您执行“选择您自己的冒险”风格的向导,您将限制未来的选择(和客户的灵活性)。原因是如果我经过 10 个步骤,然后更改第 2 步,我必须再经过 8 个步骤 - 如果您保证我没有重复我已经做出的选择,这可能会很好,但如果我是只改变纸张颜色我不想再做同样的 8 个选择。如果您确实走这条路,请确保您保留很多状态,以便他们之前所做的选择在下次显示为默认值。

我会考虑在数据库中再增加一层抽象。我不想指定用户可以选择的树中的路径,而是希望看到一个矩阵,其中每个选项、产品和流程都显示出兼容性。

例如,我有 3 种纸张类型、3 种颜色和 3 种工艺:

    • 常规的
    • 卡片
  • 颜色

    • 红色的
    • 蓝色的
    • 绿
  • 过程

    • 打印
    • 折叠
    • 绑定

然后我会为每场比赛定价:

        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 美元的装订操作安装费)

考虑到你拥有的东西数量之多,你可以做其他事情,这将很快变得相当复杂。

但是一旦输入数据,它将为您提供无限的灵活性来指定成本并将其呈现给用户。例如,您可能会发现,值得将每种不同型号的打印机放在自己的列中(而不是将它们都称为打印机),并根据纸张类型、颜色和打印​​操作为客户找到最低的打印价格.

您还可以用劳动力(时间)填写矩阵,以便您可以在与价格估算相同的地方给出时间估算。

无论您是制作向导,还是一次显示页面上的所有内容,这个后端都将支持它。看看戴尔为笔记本电脑配置做了什么——你不能用其他东西来获得某些东西。因此,如果您在页面上显示所有选项,那么当它们从普通纸变为卡片纸时,您可以提醒他们:“您还选择了折叠,这与卡片纸不兼容。您确定要这样做吗?改变?”

但首先也是最重要的 - 编写用例并首先将系统设计为一个整体。如果您现在开始编写如此复杂的东西,您现在将做出决定,以后将很难撤消,但您稍后会发现您必须进行重大更改,或者在功能上妥协。

当然,选择你自己的冒险风格设计和开发要容易得多,唯一的问题是如果你添加一个新的流程或论文,你可能需要更新 200 棵树,并添加 50 棵新树。商店的每一次变化都需要推出新的数据库(可能还有软件),这会延迟资本支出的回报。如果您预先使其非常灵活,那么现在会更难,以后会更容易/更快。

此外,您不会将客户限制在树形选项中 - 如果他们真的想通过 4 色印刷机在一侧打印,而在另一侧使用廉价复印机进行打印,如果工艺和材料兼容,他们可以探索该选项。过去 20 个产品/流程,您无法真正完全填写树。

最后,它可以让您非常非常精细地控制成本。如果您的业务流程在细粒度级别跟踪机器使用和成本(维护等),您可以降低竞争对手的出价,因为您知道您的机器成本准确每页 0.00234,而他们坚持一般的猜测。如果您开始使用该系统进行跟踪并让员工跟踪问题、维护等,您可能会发现非常奇怪的相关性,例如红卡库存在折叠机上的成本更高,因为它比蓝卡更频繁地卡纸(无论出于何种原因)。您可以调整您的定价(在此系统中为第 n 级),与纸张制造商交谈,停止提供该选项,或采取其他一些策略来挤压系统。如果您的某些机器需要熟练的操作员,您可以将员工及其工资率添加到矩阵中,并开始安排工作,以便他们更高效地工作。

更新

因此,假设我选择 Light Paper、Red Color、Print。如何获得合适的价格?在二维表中,我有三对可能的红色/打印、红色/浅色、打印/浅色。遗憾的是,我无法在一个不断发展的公式中计算价格,在做出所有选择之后,我只有一个最终价格。

好吧,我已经简化了上面的内容,但让我们先假设一个简单的情况。

我没有在上表中提到每个价格代表什么。一切的成本都是每页,除了装订。绑定成本是每个绑定项目。

因此,在您的示例中,您选择浅色纸,红色,打印。每张红纸是 0.05 美元(昂贵的纸!),每张印刷是 0.001 美元(便宜的印刷),所以每张印刷纸的成本是 0.051 美元。如果您制作 300 份,则总费用为 15.30 美元。

由于装订是按装订的项目列出的,因此您可以将装订添加到上述订单中,并且您可能将 50 页装订在一起,总共 6 个装订项目,300 页。我们已经知道前面所有的成本,因此 6 件装订物品的额外成本(每件 0.50 美元)是 3.00 美元,新的总计 18.30 美元。

除了我上面指定的简化之外,您还需要做一些事情:

在矩阵中,我将许多单元格留空。在某些情况下,这是因为进程/对象不兼容(例如,无法绑定折叠项),但在其他情况下,没有冲突,但它不需要任何成本。因此,您的红色/常规与常规/红色示例-由于我们将价格加在一起,因此备用组合无需任何费用。

让我们看看我是否可以更清楚地说明这一点......

选择浅色纸、红色、印刷、装订(300 页,6 个装订项目)遍历表格并找到落在该集合内的所有价格:

定价矩阵显示选项发生冲突以提供定价信息的单元格

您搜索表中的所有元素(红色/浅色和浅色/红色),然后获取价格并分别乘以数量,然后将它们相加。所有这些选择的交集以绿色显示。(弄乱了浅色纸/浅色纸的颜色——也应该是绿色的)

我删除了打印/打印组合,因为它不适用于这种方法(我希望简化事情,但它实际上使事情变得更难)如果你想指定双面打印,你需要表格中的另一个项目(打印例如,反向),您将同时选择打印和反向打印。交替有两个项目,“打印单面”和“打印双面”。

请记住,虽然我在每个单元格中列出了每个价格,但实际上每个单元格实际上描述了几种情况:

  1. 参考定价表
  2. 免费
  3. 约束(不能组合)

#1 中的参考引用了另一个包含价格和第三个维度的表。例如,组合“light/bound”的单元格将引用具有以下三个属性的表:

  • 每页价格
  • 每个绑定项目的价格
  • 每个作业(设置)价格

这些将根据页数和装订项目数相加,然后将每个作业成本添加到顶部。

更复杂!哇!

这可能满足您的需求,但如果您的流程仅在某些更复杂的情况下不兼容怎么办?

现在我们可以涵盖一个进程或对象与另一个冲突的一般情况。然而,我们无法处理更复杂的事情。

假设轻纸可以打印,也可以折叠,但不能同时打印和折叠。我们不能对打印/折叠施加限制,因为其他纸张既可以打印也可以折叠。

您可以做几件事:

  • 添加第三个维度 - 但是如果将 4 件事混合在一起,您可能会有一个无法完成的序列,这意味着另一个维度等
  • 使用向量(map/reduce)
  • 添加抽象层

向量很好,但对于这个应用程序来说可能有点矫枉过正。它基本上是第一项,但没有定义您可以拥有多少维度 - 您拥有与对象一样多的维度,因此可以表示任何可能的组合。

额外的抽象层是两者之间的折衷。理想情况下,您不会有很多比两个项目更复杂的冲突,但是当您这样做时,您定义了一个表示组合的新对象。所以在这种情况下,您可能有一个新的对象/过程,它是打印和折叠的组合,并且它在使用轻纸的列处有一个约束。

您只能针对约束执行此操作,在这种情况下,它不会修改您的定价算法(即,定价仍然来自添加单独的流程和对象。)

或者,您可以使用选择最大组合的算法 - 因此,您无需在数据库中搜索 Light、Red、Print、Fold,而是首先在数据库中搜索组合,这将返回 Light、Red、PrintFold 的最大组合,然后正常定价。

最后,您可以在数据库中搜索单个商品和组合商品,如果存在冲突(组合商品和单个商品的双重定价),您可以选择:

  • 最大的代价
  • 最伟大的组合
  • 优先成本(即,每个成本都有一个优先级,您在冲突期间比较它们并选择优先的成本)

-亚当

于 2009-02-05T18:28:29.403 回答