我想建立一个商店,其中的产品有一个小巫师,然后确定价格.在这种情况下,我在谈论打印产品.
因此,对于(一点点)例子,当你来到商店并想要打印名片时,你可以决定是否要打印黑白或彩色,如果你想选择厚纸或薄纸,如果你想打印100,200,500或1000件等.
毕竟会有一个价格让我们说:黑白,厚纸,200件=> 40, - $
实际上,您有更多选择可供选择.所以你可以认为有很多价格,没有公式.
所以我的问题是:我该如何处理价格?
我的第一个想法:装饰模式.
但是当我想到它时,这不是一个好主意.正如我所说,没有真正的公式,我也必须生成向导(如果你想打印贺卡,可能会有所不同).此外,我希望能够通过管理界面更改价格或添加产品或添加新的"决定",如"你想要光面纸吗?" 到产品或删除一个(仍然保持价格完整).
所以现在我正在考虑为每个产品使用一个树,我可以在其中添加一个级别(一个新的决定),度假级别等等.
另一个想法是通过决策构建某种键对象,并在价格表中查看价格.有点像字典,我在其中添加决定,毕竟我生成一个密钥来查找价格表中的价格.
所以在原型设计之前,我想知道我是不是只是盲目而且我没有看到明显的解决方案,或者可能还有另一种更优雅的方式我不知道呢?
嗯,我所拥有的想法相当复杂,但你的愿望也很复杂.
您所描述的向导的问题在于,在他们做出所有选择之后,他们可能想要回到#2并改变一件事来看看它如何改变价格 - 但是你构建向导的方式呢可能会影响是否可以进行后续选择,并导致必须为每个产品自定义一组相当复杂的代码 - 而不是将所有内容很好地存储在数据库中,以便代码可以执行所需的一切,并且任何产品更改都可以进入数据库,而不是代码更改.
首先,您需要了解您有定价逻辑,理想情况下,这将与演示分开.换句话说,您应该能够向一个客户呈现一步一步的向导,并将一个带有复选框选项和字段的页面呈现给另一个客户,并让它们以相同的限制构建相同的内容.
尽量避免设计数据库,这样你就不能做其中一个.换句话说,如果您执行"选择自己的冒险"样式向导,则可以限制将来的选项(以及客户灵活性).原因是,如果我经历了10个步骤,然后改变第2步,我必须经历8个步骤 - 如果你保证我没有复制我已经做过的选择,这可能没问题,但是如果我是只改变纸张颜色我不想再做出相同的8种选择.如果你选择这条路线,请确保你保持很多状态,这样他们之前做出的选择就会在下次显示为默认值.
我会考虑在数据库中再添加一个抽象级别.我不想指定用户可以选择的树的路径,而是希望看到一个矩阵,每个选项以及产品和流程都显示兼容性.
例如,我有三种纸张类型,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中的引用是指包含价格和第三维的另一个表.例如,组合"light/bound"的单元格将引用具有以下三个属性的表:
每页价格
每个绑定的商品价格
每个工作(设置)价格
这些将根据页数和绑定项进行求和,然后将每个作业成本添加到顶部.
这可能适合您的需求,但如果您的流程在某些更复杂的情况下不兼容,该怎么办?
现在我们可以涵盖一个过程或对象与另一个过程或对象冲突的一般情况.但是,我们不能处理更复杂的事情.
假设可以打印轻型纸,它可以折叠,但不能打印和折叠.我们不能对打印/折叠施加约束,因为其他纸张既可以打印也可以折叠.
你可以做一些事情:
添加第三个维度 - 但是如果将4个事物混合在一起,则可能会有一个无法完成的序列,这意味着另一个维度等
使用矢量(map/reduce)
添加一个抽象层
向量很好,但对于这个应用程序可能有点过分.它基本上是第一个项目,但没有定义您可以拥有多少维度 - 您拥有与对象一样多的维度,因此可以表示任何可能的组合.
额外的抽象层是两者之间的折衷.理想情况下,您将不会有比两个项更复杂的冲突,但是当您这样做时,您将定义一个表示组合的新对象.因此,在这种情况下,您可能有一个新的对象/进程,它是打印和折叠的组合,并且它在带有光纸的列上有一个约束.
您只能针对约束执行此操作,在这种情况下,它不会修改您的定价算法(即,定价仍然来自添加单个流程和对象.)
或者,您可以使用选择最大组合的算法 - 因此,不是在数据库中搜索Light,Red,Print,Fold,而是首先在数据库中搜索组合,这将返回Light,Red,PrintFold的最大组合,然后正常定价.
最后,您可以在数据库中搜索单个项目和组合项目,如果存在冲突(组合和单个项目的双重定价),则可以选择:
最大的成本
最大的组合
优先成本(即,每个成本都分配了优先级,并在冲突期间对它们进行比较并选择优先级成本)
-亚当