レジの会計を保留する機能の実装について。
- 評価
- クリップ 1
- VIEW 1,946
プログラミングの勉強として、レジの会計機能を作っております。
コンビニで勤務しているため、それを模倣したいと思っております。
レジの機能の中で、実装方法がイメージしづらいと感じているのが
「会計保留」機能です。
この機能は、お客様の会計途中で別のお客様の会計をしたい時に使用します。
(財布を忘れて、取りに行った場合など)
お客様として、Aさん、Bさんがいるとした場合。
Aさんの会計途中。
「保留」。
Bさんの会計へ。
Bさんの会計を済ます。
「保留解除」。
Aさんの会計へ戻る。
Aさんの会計を済ます。
の様な流れになります。
保留機能には、制約があります。
「保留」は、一度しかできません。
そのため、Bさんの会計での「保留」はできません。
自分で作ってみている中では、
保留使用前と使用後の2つの状況に分けて
会計に関する全てのデータを
2つの状況別に持てばいいのではないか、と考えております。
例えば、合計金額データの場合、
const goukeiKingaku = {
beforeHoryu:0,
afterHoryu:0,
}
ただ、少し、実装方法が冗長なのではないかと考えております。
もし複数回「保留」が可能になった場合を考えた場合、
const goukeiKingaku = {
horyu_1:0,
horyu_2:0,
horyu_3:0,
.
.
.
}
の様になってしまいます。
実際の開発だと、どのようにしてるのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
会計システム全体で言うと、POSで全国の店舗から集計する部分とかで、
大規模なサーバ管理が絡むため、非常に難しくなるかと思いますが、
ここではそういう実務的な話は考慮せず、練習で組むだけの前提で、
ご質問のレジの会計保留の部分にだけ言及する、とお断りしておきます。
さて、前置きが長くなりましたが、
何かの処理を保留したいというのは、プログラミングでよく出てきます。
これは、アルゴリズムを勉強すれば、そんなに難しくないと思います。
具体的にはどんなアルゴリズムでしょうか。
初歩的な内容ではたとえば、キューやスタックなどです。
発展的な内容では、OOPでのコマンドやメメントパターン、
関数型での遅延評価や継続、あるいは非同期処理などがあります。
それらの解説はアルゴリズムの本に譲るとします。
たとえば、『新・明解 Javaで学ぶアルゴリズムとデータ構造』に、
キューやスタックが載ってます。図解が多くて理解を助け、たしかに明解です。
さて、視野を広げるために、レジからは離れますが、
プログラミングでの関数やメソッドの呼び出しを考えてみます。
JavaScriptを始め、メジャーな言語ではたいてい、
関数の途中で別の関数を呼び出せます。
言語処理系側では、これをどうやって実装しているのでしょうか?
ここで、「スタックオーバーフロー」というエラーを、
どこかで聞いたことがあるかと思います。
再帰などで呼び出し階層が深いと起こったりします。
エラーが起こるからには、スタックを使っていたのです。
const goukeiKingaku = {
horyu_1:0,
horyu_2:0,
horyu_3:0,
}
だから、ご質問のサンプルコードのように、
あらかじめ変数を一個ずつ書いておく必要はありません。
新しい処理が来るたびに、データをスタックに積んで待避していけば、
処理の割り込みに対応できます。
このスタックにはいろいろな実装方法がありますが、
たとえば配列で実現できます。詳細は本に譲ります。
ただし、現実のレジでは、バーコードで読み取るとかレジの機械操作、
そういう機械系の状態遷移の制御を考慮する必要があるでしょうが、
冒頭で言ったように、ここではそうした部分は完全に捨象しています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
会計でいうと、複数の商品を組み合わせた場合に割引かれる(おにぎりとペットボトル飲料とか)というのもありますね。それらも踏まえて、レジが何をするか順に考えてみましょう。
- お客から商品を一つ受け取る
- 商品の情報を「会計待ち」のリストに入れる(このとき、賞味期限切れとか酒類など販売制限があるものなどをチェックするでしょうかね)
- 上記1,2を商品がなくなるまで繰り返す
- 総金額を計算して提示する(このとき、商品の組み合わせによる割引だとか、特典カードによる割引などを行う)
- 代金を受け取り、お釣りを返す
今回のお題はこの途中で割り込んで別の会計処理をすることになりますが、「会計待ち」のリストを保持さえできれば、割り込まれても問題ないことに気付けるかと思います。会計途中の情報は、すべてこのリストから計算できるものだからです。
割り込み時の手順としては、
- 現時点の「会計待ち」リストを、「保留会計待ち」リストにコピーする
- 「会計待ち」リストを空にする
- 割り込み処理を行う
- 「保留会計待ち」リストから「会計待ち」リストにコピーする
という形になればいいはずです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/11/14 08:40
スタックに積むことで、一時的に待避させることは、想像外でした。
ご提示頂いたデザインパターンを見てみて、考えを練り直したいと思います。