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 がどこにでも出てくる
決済・配送・通知の組み合わせを間違えて、金額や通貨がずれる
呼び出し側に具体クラスの名前を書きたくない
新しい国や地域を、既存コードを変えずに足したい
- 第7回 — EU 向けの製品クラスと Factory を新規ファイルで足す
部品の種類を足したら、直す箇所が一気に増えた
全話一覧
- 国内向けの注文フローを3クラスで作る(基本の実装)
- 海外向けを足して if/else が増える(条件分岐の増殖)
- 国内の注文に海外の決済が混ざる(製品ファミリの不一致)
- 市場ごとの Factory でセット生成する(Abstract Factory)
- 国内用・海外用の Factory を切り替える(ポリモーフィズム)
- Factory を外から渡す OrderProcessor(DI)
- EU 市場を既存コードの変更なしで足す(開放閉鎖原則)
- 返品処理で見えた限界と適用判断(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 だけです。
