@nqounetです。
架空のECサイト「ペルマート」(Perl + Mart の造語)の決済審査を、Perl で書いて組み直していく全3回の連載です。金額上限と有効期限を if 文で確かめるところから始め、審査条件を5つに増やしてコードが手に負えなくなる様子を体験し、審査ごとのクラスを鎖でつなぐ Chain of Responsibility パターンで直します。
各回は前の回のコードを引き継ぐので、第1回から順に読むのが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で選んでください。
どこから読むか
- 第1回 — Perl で決済審査を if 文から書くなら。金額上限と有効期限の2条件を、早期リターンで書く
- 第2回 — 審査条件が増えて if 文がネストしてきたなら。第1回の2条件に3つ足して、何が困るかを確かめる
- 第3回 — 審査をクラスに分ける形から見たいなら。前提は第2回の、5条件が1つの関数に入った check_payment
困りごとから探す
- 第2回 — 審査条件を足すたびに if 文のネストが深くなる。早期リターンで平らにしても、1つの関数に責任が集まったまま
- 第2回 — 不正利用検知だけを試したいのに、前の4つの審査を通るテストデータを毎回用意している
- 第3回 — 新しい審査を足すときに、既存の審査コードを書き換えたくない
- 第3回 — 審査の順序を入れ替えたい
対象読者
- Perl入学式卒業程度の方
- 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方
- if文の複雑化に悩んだことがある方
- デザインパターンを実践的に学びたい方
前提知識
このシリーズは「Mooで覚えるオブジェクト指向プログラミング」シリーズの応用編です。まだ読んでいない方は、先にこちらをご覧ください。
技術スタック
- Perl v5.36以降(signaturesを使用)
- Moo(軽量オブジェクト指向フレームワーク)
- 外部依存なし(Moo以外)
記事一覧
第1回: カード決済の審査を、金額上限10万円と有効期限の2条件でif文から書く
- 決済審査の基本と条件分岐
- 金額上限チェック(10万円以上は拒否)の実装
- カード有効期限チェックの追加
- 早期リターンでコードを読みやすく
第2回: 審査条件を5つに増やしたら、if文のネストが5段になった
- if文ネストの問題点を体験
- ブラックリスト、残高確認、不正利用検知の追加
- 審査ルール5つ以上でコードが保守困難に
- テスト困難・新ルール追加困難の具体例
第3回: 審査条件を1つ足すたびに既存コードを触りたくない。審査をクラスに分けて鎖でつなぐ
- Chain of Responsibilityパターンの基本
- 各審査ロジックを独立したクラスに分割
- PaymentChecker基底クラスとチェーン構築
- ExpiryChecker, LimitChecker, BlacklistCheckerの実装
- 拡張性の高い決済審査システムの完成
学べること
| 回 | 学べること |
|---|---|
| 第1回 | 決済審査の基本、早期リターン、ハッシュリファレンス |
| 第2回 | コードスメルの認識、リファクタリングの必要性 |
| 第3回 | Chain of Responsibilityパターン、責任の分離、拡張性 |
注意事項
このシリーズで扱う決済システムは学習用の架空システムです。
実際の決済システムを開発する際は、以下の点に注意してください。
- PCI DSS などのセキュリティ基準を遵守する
- カード番号は本番環境では暗号化して保存する
- 審査ロジックは決済代行会社のAPIを利用する
関連シリーズ
同じChain of Responsibilityパターンを別のドメインで学べるシリーズです。
CLIアプリケーションでCommandパターンを学ぶシリーズもあります。
