3

価格を決める小さな魔法使いが商品に付いているお店を作りたいです。この場合、私は製品の印刷について話しています。

したがって、(少し)例として、名刺を印刷したい場合は、白黒またはカラーのどちらを印刷するか、厚紙または薄紙を選択するか、必要に応じて決定することができます。 100、200、500、1000枚などを印刷します。

結局のところ、たとえば、黒と白の厚い紙、200枚=> 40、-$の価格があります

実際には、さらに多くの選択肢があります。ですから、ご想像のとおり、多くの価格があり、そのための公式はありません

だから私の質問は:どうすれば価格を処理できますか?

私の最初のアイデア:デコレータパターン。

しかし、私がそれについて考えたとき、それはあまり良い考えではありません。実際の数式はないと言ったように、ウィザードも生成する必要があります(グリーティングカードを印刷する場合は異なる場合があります)。また、管理インターフェースを介して価格を変更したり、製品を追加したり、「光沢紙が必要ですか?」などの新しい「決定」を追加したりできるようにしたいと思います。製品に追加するか、製品を削除します(それでも価格はそのままにしておきます)。

そこで、レベル(新しい決定)やリゾートレベルなどを追加できるツリーを製品ごとに使用することを考えています。

もう1つのアイデアは、決定を通じてある種のキーオブジェクトを作成し、価格テーブルで価格を調べることです。決定を追加し、結局、価格表で価格を検索するためにそれからキーを生成する辞書に少し似ています。

それで、プロトタイピングの前に、私はただ盲目で、明白な解決策が見当たらないのか、それとも私が知らないよりエレガントな別の方法があるのだろうかと思っていました。

4

1 に答える 1

8

ええと、私が持っている考えはかなり複雑ですが、あなたの欲求も複雑です。

あなたが説明しているウィザードの問題は、彼らがすべての選択をした後、#2に戻って、それが価格をどのように変えるかを見るために1つのことを変更したいと思うかもしれないということです-しかし、あなたがウィザードを構築する方法後で選択できるかどうかに影響する可能性があり、コードが必要なすべてを実行できるようにすべてをデータベースに適切に保存するのではなく、製品ごとにカスタマイズする必要のあるかなり複雑なコードのセットが生成される可能性があります。コードの変更ではなく、データベースに追加します。

まず、価格設定ロジックがあることを理解する必要があります。理想的には、これはプレゼンテーションとは別のものになります。つまり、ステップバイステップのウィザードを1人の顧客に提示し、チェックボックスオプションとフィールドを含む単一のページを別の顧客に提示して、同じ制限で同じものを作成できるようにする必要があります。

どちらか一方を実行できないように、データベースの設計は避けてください。つまり、「きみならどうする?」スタイルのウィザードを実行すると、将来のオプション(および顧客の柔軟性)が制限されます。その理由は、10ステップを実行してから、ステップ2を変更する場合、さらに8ステップを実行する必要があるためです。これは、すでに行った選択を複製しないことを保証する場合は問題ないかもしれませんが、紙の色を変えるだけ私は同じ8つの選択を二度としたくありません。このルートを使用する場合は、以前に行った選択が次回のデフォルトとして表示されるように、多くの状態を維持するようにしてください。

データベースにもう1つのレベルの抽象化を追加することを検討します。ユーザーが選択できるツリーを通るパスを指定するのではなく、互換性を示す各オプションと製品およびプロセスを含むマトリックスを表示したいと思います。

たとえば、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                            

空のスペースは、混合できないアイテムを示します。
注目すべきエントリ:

  • 印刷と印刷の組み合わせ-両面印刷は、マシンをより頻繁に摩耗/妨害します。
  • 折り機にアイテムを2回以上通すことはできません(折り畳み操作は空白です)-ただし、さまざまな種類の折り畳みとそれらが適用される用紙をリストすることができます
  • 折りたたまれたアイテムをバインドすることはできません
  • マトリックス内のアイテムを複製しませんでした(つまり、ライトペーパープリントはライトペーパーの印刷と同じです-クエリの作成方法に応じて、これを示したり、問題にならない方法でテーブルを作成したりします)。

これは単純な化身の単なるサンプルです。各価格は、実際には、数量が特定の範囲内にある場合(つまり、100は10よりも安い場合があります)にそれぞれの価格を示す別のテーブルへのリンクになります。また、料金が1枚の紙ごと、操作ごと、または注文ごとのいずれであるかを保持します。これは積み重なる可能性があります(したがって、カッターの摩耗を考慮して、1枚の紙あたり0.001の拘束力があり、0.50製本された本ごとに1枚の価格で、製本操作のセットアップ料金は合計で5ドルになります)

あなたが他のことをすることができるあなたが持っているもののせん断数を考えると、これはすぐにかなり複雑になります。

ただし、データを入力すると、コストを指定してユーザーに提示する際に無制限の柔軟性が得られます。たとえば、印刷機のさまざまなモデルをそれぞれ独自の列に配置し(単にすべてのプリンターと呼ぶのではなく)、用紙の種類、色、および印刷操作に基づいて顧客の最低印刷価格を見つけることは価値があることに気付くかもしれません。 。

また、マトリックスに労力(時間)を入力して、価格の見積もりと同じ場所で時間の見積もりを出すこともできます。

ウィザードを実行する場合でも、ページ上のすべてを一度に表示する場合でも、このバックエンドはそれをサポートします。デルがラップトップ構成に対して何をしているのかを見てください。特定のものを他のもので取得することはできません。したがって、ページにすべてのオプションを表示すると、通常の紙からカードストックに変更されたときに、「カードストックと互換性のない折りたたみも選択しました。これを作成してもよろしいですか?変化する?"

しかし、何よりもまず、ユースケースを作成し、システム全体を最初に設計します。今すぐ飛び込んで、この複雑なもののコーディングを開始すると、後で元に戻すのが非常に難しい決定を下すことになりますが、後で大きな変更を加えるか、機能に妥協する必要があります。

もちろん、独自のアドベンチャースタイルを選択する方が、設計と開発がはるかに簡単です。唯一の問題は、新しいプロセスや紙を追加する場合、200本のツリーを更新し、50本の新しいツリーを追加する必要があることです。ショップでの変更はすべて、新しいデータベース(および場合によってはソフトウェア)の展開が必要であり、これにより資本的費用の回収が遅れます。前もって非常に柔軟にすると、今は難しくなり、後で簡単/速くなります。

さらに、顧客をツリーオプションに限定することはありません。一方の面で4色の印刷機を使用して印刷し、もう一方の面で安価なコピー機を使用したい場合は、プロセスと材料に互換性がある場合は、そのオプションを検討できます。過去20の製品/プロセスでは、ツリーを完全に埋めることはできません。

最後に、それはあなたにコストの非常に非常に細かい制御を与えます。ビジネスプロセスがマシンの使用量とコスト(メンテナンスなど)をきめ細かく追跡している場合、マシンのコストが正確にわかっているため、競合他社を低く抑えることができます。1ページあたり0.00234ですが、一般的な推測に固執しています。このシステムを使用して追跡を開始し、従業員に問題やメンテナンスなどを追跡させると、(何らかの理由で)青よりも頻繁に詰まるため、折り機で赤のカードストックのコストが高くなるなど、非常に奇妙な相関関係が見つかる場合があります。価格を調整するか(このシステムではn度まで)、製紙会社に相談するか、そのオプションの提供を停止するか、またはシステムを圧迫するための他の多くの戦術を使用できます。一部のマシンに熟練したオペレーターが必要な場合は、従業員を給与率とともにマトリックスに追加し、ジョブのスケジュールを開始して、より効率的かつ効果的に作業できるようにすることができます。

アップデート

それで、私がライトペーパー、レッドカラー、プリントを選んだとしましょう。適切な価格にするにはどうすればよいですか?2次元のテーブルには、赤/印刷、赤/光、印刷/光の3つの可能なペアがあります。残念ながら、進化する数式で価格を計算することはできません。すべての選択が行われた後、最終価格が1つだけになります。

さて、私は上記を単純化しましたが、最初に単純なケースを想定しましょう。

上記の表では、各価格が何を表しているかについては触れていません。製本を除いて、すべての費用はページごとです。製本の費用は製本アイテムごとでした。

したがって、あなたの例では、明るい紙、赤、印刷を選択します。赤い紙1枚あたり0.05ドル(高価な紙!)で、印刷1枚あたり0.001ドル(安い印刷)なので、印刷された紙1枚あたりのコストは0.051ドルです。300部を作成する場合、合計料金は$15.30です。

バインディングはバインドされたアイテムごとにリストされるため、上記の順序にバインディングを追加し、50ページをまとめてバインドすると、合計6つのバインドされたアイテム(300ページ)になります。先行するすべてのコストはすでにわかっているので、6つのバインドされたアイテムの追加コスト(アイテムあたり$ 0.50)は$ 3.00で、新しい合計は$18.30になります。

ただし、上記で指定した単純化以外に、実行する必要のあることがいくつかあります。

マトリックスでは、多くのセルを空のままにしました。プロセス/オブジェクトに互換性がない(たとえば、折りたたまれたアイテムをバインドできない)ための場合もありますが、競合がない場合もありますが、コストはかかりません。つまり、赤/レギュラーとレギュラー/赤の例です。価格を合計しているので、代替の組み合わせは無料です。

これをもっと明確にできるかどうか見てみましょう...

選択ライトペーパー、赤、印刷、製本(300ページ、製本6アイテム)がテーブルを通過し、そのセットに含まれるすべての価格を見つけます。

価格マトリックスは、オプションが衝突して価格情報を提供するセルを示しています

テーブル内のすべての要素(赤/光と光/赤の両方)を検索し、価格を取得して数量を個別に乗算し、それらを合計します。これらすべての選択の交点は緑色で示されています。(薄紙/薄紙の色にめちゃくちゃ-緑もする必要があります)

この方法では機能しないため、印刷と印刷の組み合わせを削除しました(単純化したかったのですが、実際には難しくなります)両面印刷を指定する場合は、テーブルに別の項目が必要になります(印刷たとえば、反転)を選択すると、印刷と印刷反転の両方が選択されます。交互に「片面印刷」と「両面印刷」の2つの項目があります。

各セルに各価格をリストしましたが、実際には、各セルは実際にはいくつかの状況を説明していることに注意してください。

  1. 価格表への参照
  2. 無償
  3. 制約(組み合わせはできません)

#1の参照は、価格と3番目のディメンションを含む別のテーブルを参照しています。たとえば、「ライト/バウンド」の組み合わせのセルは、次の3つの属性を持つテーブルを参照します。

  • ページあたりの価格
  • バインドされたアイテムの価格あたり
  • ジョブ(セットアップ)あたりの価格

これらはページ数と製本アイテムに応じて合計され、ジョブごとのコストが上に追加されます。

もっと複雑に!ウー!

これはニーズに合っているかもしれませんが、特定のより複雑な状況でのみ互換性のないプロセスがある場合はどうでしょうか。

今のところ、あるプロセスまたはオブジェクトが別のプロセスまたはオブジェクトと競合する一般的なケースをカバーできます。ただし、これ以上複雑なものを処理することはできません。

軽い紙は印刷でき、折りたたむことはできますが、印刷と折り畳みの両方を行うことはできません。他の用紙は印刷と折り畳みの両方が可能であるため、印刷/折り畳みに制約を課すことはできません。

できることがいくつかあります。

  • 3番目の次元を追加します-しかし、4つのものが一緒に混合されている場合は実行できないシーケンスがある可能性があります。つまり、別の次元などです。
  • ベクトルを使用する(map / reduce)
  • 抽象化レイヤーを追加する

ベクトルは素晴らしいですが、このアプリケーションにはやり過ぎかもしれません。これは基本的に最初の項目ですが、持つことができる次元の数を定義することなく、オブジェクトと同じ数の次元を持っているため、可能な組み合わせを表すことができます。

抽象化の追加レイヤーは、2つの間の妥協点です。理想的には、2つのアイテムよりも複雑な競合があまり発生しないようにしますが、発生する場合は、組み合わせを表す新しいオブジェクトを定義します。したがって、この場合、印刷と折り畳みを組み合わせた新しいオブジェクト/プロセスがあり、薄い紙で柱に制約があります。

これは制約に対してのみ実行できます。この場合、価格設定アルゴリズムは変更されません(つまり、価格設定は引き続き個々のプロセスとオブジェクトの追加によって行われます)。

または、最大の組み合わせを選択するアルゴリズムを使用することもできます。データベースでLight、Red、Print、Foldを検索する代わりに、まずデータベースで組み合わせを検索します。これにより、Light、Red、PrintFold、の最大の組み合わせが返されます。その後、通常の価格を設定します。

最後に、データベースで個別アイテムと組み合わせアイテムの両方を検索し、競合がある場合(組み合わせアイテムと個別アイテムの2倍の価格設定)、次のいずれかを選択します。

  • 最大のコスト
  • 最大の組み合わせ
  • 優先順位の高いコスト(つまり、すべてのコストに優先順位が割り当てられており、競合中にそれらを比較して、優先順位の高いコストを選択します)

-アダム

于 2009-02-05T18:28:29.403 に答える