Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PurchaceFlowの実装 #2424

Conversation

chihiro-adachi
Copy link
Contributor

@chihiro-adachi chihiro-adachi commented Jul 20, 2017

概要(Overview・Refs Issue)

受注・受注明細を抽象化し、バリデーションや明細の丸め処理、集計処理を、カート/購入確認画面/受注登録・編集画面で共通して利用できるように整備しました

方針(Policy)

集計処理や、在庫チェックなどのバリデーションは、受注に関わる共通したロジックです。
従来は、CartServiceやShoppingServiceなど、利用される画面で個別に実装されており、カスタマイズ時の影響が読みづらい、再利用しにくいなどの課題がありました(たとえば、配送料の計算ロジックを変更する際には複数箇所を修正する必要があります)

集計フローを制御するPurchaseFlowと、各処理を行うProcessorに分離し、ロジックを差し替えたり、新たなバリデーションを追加したりなどが簡易に行えるように変更しました。

実装に関する補足(Appendix)

アクティビティ

全体のアクティビティは以下の通りです。

purchaseflow-activity

フローの制御の流れ

カートを例にすると、集計処理やバリデーションは以下のように実行されています。

  • セッションからカートをロードする
  • カート明細の、現在の状態をチェックする(明細単位で整合性を担保する)
    • 商品の販売制限数のチェック
    • 商品の在庫切れのチェック
    • 公開・非公開ステータスのチェック
    • ...
  • チェック結果に応じて、明細の丸め処理を行う
    • 販売制限数
      • 販売制限数まで明細の個数を減らす
    • 商品の在庫切れ
      • 明細を削除する(個数を0に設定)
    • 公開・非公開ステータス
      • 明細を削除する(個数を0に設定)
    • ...
  • 集計処理
    • 合計金額、配送料、手数料等の合計を集計する
  • カートの、現在の状態をチェックする(明細全体で整合性を担保する)
    • 商品種別に矛盾が生じていないか
    • 支払い方法に矛盾が生じていないか
    • 購入金額上限を超えていないかどうか
  • チェック結果に応じて、エラーを返す
  • 集計処理
    • 合計金額、配送料、手数料等の合計を集計する

default

クラス図

全体のクラス構成を以下に記載します。

default

主要なクラスの役割は以下の通りです。

ItemIHoldernterface

明細一覧(明細のサマリ)を表すインターフェース。
CartやOrderが実装クラスとなります。

ItemInterface

明細を表すインターフェース。
CartItemやShipmentItemが実装クラスとなります。

PurchaseFlow

明細処理や集計処理の全体のフローを制御するクラスです。
PurchaseFlowは、集計を行うcalculate()と完了処理を行うpurchase()メソッドを持っています。
メソッドが実行されると、ItemやItemHolderをProcessorに渡し、Processorを順次実行していきます。また、Processorの実行結果を呼び出し元に返却します。

ItemHolderProcessor

ItemHolder(OrderやCart)に対して処理を実行するProcessorです
支払方法の整合性チェックや、購入金額上限チェックが該当します。

ItemProcessor

Itemに対して処理を実行するProcessorです。
在庫チェックや販売制限数のチェックが該当します。

PurchaseProcessor

完了処理を行うタイミングで呼び出されるProcessorです。
ItemHolderに対して処理を行います。また、PurchaseContextを通じて、変更前のItemHolderを取得することもできます。

PurchaseContext

実行時の情報を持つクラスです。
呼び出し側のコントローラで、Contextに情報が追加すると、各Processorからアクセスすることができます。

PurchaseFlowResult

PurchaseFlowの実行結果を保持しています。
ItemProcessorで発生したエラーはWarning、ItemHolderProcessorで発生したエラーはErrorとして扱います。

Processorの拡張サンプル

Processorの拡張サンプルを以下にコミットしています。

e8faad2

chihiro-adachi and others added 30 commits July 20, 2017 15:53
@chihiro-adachi chihiro-adachi changed the title [WIP] PurchaceFlowの実装 PurchaceFlowの実装 Jul 21, 2017
@chihiro-adachi chihiro-adachi added this to the 3.1.0 milestone Jul 21, 2017
@chihiro-adachi chihiro-adachi merged commit 751c7ac into EC-CUBE:experimental/3.1 Jul 24, 2017
@chihiro-adachi chihiro-adachi deleted the experimental/purchase-flow branch August 31, 2017 01:40
@okazy okazy added the document Improvements or additions to documentation label Feb 7, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
document Improvements or additions to documentation experimental
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants