Featured image of post 国別の注文フローで決済・配送・通知の組み合わせが狂う。PerlとMooのAbstract Factoryで組み直す全8回【目次】

国別の注文フローで決済・配送・通知の組み合わせが狂う。PerlとMooのAbstract Factoryで組み直す全8回【目次】

Perl と Moo で ECサイトの注文フローを作り、国内向けに海外向けを足したところで if/else が増え、組み合わせミスの事故に行き着き、Abstract Factory で組み直す全8回の連載の目次です。困りごとからも選べます。

Perl と Moo で、ECサイトの注文フローを作る全8回の連載です。国内向けの決済・配送・通知を3クラスで作るところから始め、海外向けを足して if/else で切り替えます。やがて国内の注文に海外の決済が混ざり、手数料が狂う事故が起きます。そこで、決済・配送・通知を市場ごとのセットで作らせる Abstract Factory パターンに組み替え、DI で注文処理から具体クラスを切り離し、EU 市場を足し、最後に返品処理を足してパターンの限界と使いどころを確かめます。

各回は前の回のコードに手を足していく作りなので、通して読むなら第1回からが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。

どこから読むか

  • 第1回 — 最初から順に作るなら。国内向けの決済・配送・通知を3クラスで作る。前提は Moo のクラス定義の基礎
  • 第3回 — なぜパターンが要るのかを先に見たいなら。国内の注文に海外の決済が混ざり、手数料が3%でなく5%で計算される
  • 第4回 — Abstract Factory の組み方だけ知りたいなら。Moo::Role で Factory の約束事を決め、製品をセットで作る

困りごとから探す

国別の分岐が増えて、if/else がどこにでも出てくる

  • 第2回 — 海外向けを足すと、クラスが6つになり市場の判定が広がる
  • 第5回 — 国内用・海外用の Factory を差し替えるだけで、判定を呼び出し側から消す

決済・配送・通知の組み合わせを間違えて、金額や通貨がずれる

  • 第3回 — 国内の注文に海外の決済が混ざる事故を再現する
  • 第4回 — 1つの Factory から3つをセットで作り、混ざらない形にする

呼び出し側に具体クラスの名前を書きたくない

  • 第5回 — 同じ Factory のインターフェースで、国内用でも海外用でも同じ呼び出しにする
  • 第6回 — Factory をコンストラクタで外から渡す(DI)

新しい国や地域を、既存コードを変えずに足したい

  • 第7回 — EU 向けの製品クラスと Factory を新規ファイルで足す

部品の種類を足したら、直す箇所が一気に増えた

  • 第8回 — 返品処理を足すと、ロールと3つの Factory の4ファイルを直すことになる
  • 第8回 — Abstract Factory を使う条件と、他のパターンとの使い分け

全話一覧

  1. 国内向けの注文フローを3クラスで作る(基本の実装)
  2. 海外向けを足して if/else が増える(条件分岐の増殖)
  3. 国内の注文に海外の決済が混ざる(製品ファミリの不一致)
  4. 市場ごとの Factory でセット生成する(Abstract Factory)
  5. 国内用・海外用の Factory を切り替える(ポリモーフィズム)
  6. Factory を外から渡す OrderProcessor(DI)
  7. EU 市場を既存コードの変更なしで足す(開放閉鎖原則)
  8. 返品処理で見えた限界と適用判断(OCP と SRP の衝突)

前提知識

  • Perl v5.36 以降の基本文法(signatures など)
  • Moo によるクラス定義の基礎(has)と Moo::Role(第4回から使う)
  • Moo が初めてなら、先に「Mooで覚えるオブジェクト指向プログラミング」シリーズを読むとスムーズに進みます
  • 生成を別のクラスに任せる考え方は、「PerlとMooでAPIレスポンスシミュレーターを作ってみよう」(Factory Method)で触れています

完成するもの

国内・海外・EU の3市場に対応した注文処理です。市場ごとの Factory が決済・配送・通知をセットで作り、OrderProcessor は渡された Factory で注文を処理します。市場を足しても OrderProcessor と既存の Factory は書き換えません。追加の CPAN モジュールは Moo だけです。

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。