Featured image of post DBが要るテストに30分、CIが毎回タイムアウトする。データアクセスを分ける【Repository】

DBが要るテストに30分、CIが毎回タイムアウトする。データアクセスを分ける【Repository】

コード探偵ロックの事件簿:注文クラスに業務ロジックと SQL が同居し、テストに DB が要る。30分かかって CI が毎回タイムアウトする。データアクセスを差し替え可能に分ける(Repository)。

Featured image of post 種別を足して分岐を1か所書き忘れ、未受講の200名に修了証が出た。漏れを防ぐ【Visitor】

種別を足して分岐を1か所書き忘れ、未受講の200名に修了証が出た。漏れを防ぐ【Visitor】

コード探偵ロックの事件簿:型判定の分岐が4つの関数に散らばり、種別を足したとき修了判定だけ書き忘れて、未受講の200名に修了証が出た。漏れをロード時のエラーにする(Visitor)。

Featured image of post ツリーの構造を変えたら、15部署のスクリプトが全滅した。たどり方だけを公開する【Iterator】

ツリーの構造を変えたら、15部署のスクリプトが全滅した。たどり方だけを公開する【Iterator】

コード探偵ロックの事件簿:文書管理の children 配列を15部署のスクリプトが直接たどり、構造を変えたら全部壊れた。走査をイテレータに閉じ込め、たどり方だけ公開する(Iterator)。

Featured image of post 条項の削除を戻せず、免責条項の抜けた契約書が締結された。操作前の状態を残す【Memento】

条項の削除を戻せず、免責条項の抜けた契約書が締結された。操作前の状態を残す【Memento】

コード探偵ロックの事件簿:契約書を組み立てる SaaS で、条項の追加・削除・並べ替えが上書きで、前の状態がどこにも残らない。誤って消した免責条項に気づかないまま契約が締結された。操作の前に状態をスナップショットに保存し、任意の時点に戻す(Memento)。

Featured image of post コピペで作った提案書に、請求書の消費税欄が出た。文書の種類と出力形式を分ける【Bridge】

コピペで作った提案書に、請求書の消費税欄が出た。文書の種類と出力形式を分ける【Bridge】

コード探偵ロックの事件簿:文書3種×出力形式3種で9クラス。提案書を足すときに請求書のクラスをコピペし、消費税の欄まで出た。文書の種類と出力形式を分けて組み合わせる(Bridge)。

Featured image of post 砂漠にクラーケン、海底にサボテン。地形と生物の組み合わせが混ざる。セットで作る【Abstract Factory】

砂漠にクラーケン、海底にサボテン。地形と生物の組み合わせが混ざる。セットで作る【Abstract Factory】

コード探偵ロックの事件簿:ゲームの世界生成で、地形・生物・天候を別々のメソッドが $type を見て作るため、引数の取り違えで砂漠にクラーケンが出た。バイオームごとに1つのファクトリーが3つをまとめて作り、組み合わせの混在を防ぐ(Abstract Factory)。

Featured image of post 5つのモジュールが互いを直接呼び、どこを触っても他が壊れる。仲介役に集める【Mediator】

5つのモジュールが互いを直接呼び、どこを触っても他が壊れる。仲介役に集める【Mediator】

コード探偵ロックの事件簿:EC の受注・在庫・決済・通知・監査ログの5モジュールが互いを直接参照し、クーポン機能を足すには5つ全部に手を入れることになる。モジュール間のやり取りを仲介者1つに集め、各モジュールは仲介者だけを知る(Mediator)。

Featured image of post サブタスクを入れたら、階層が深いと進捗率の計算がバグる。個と集まりを同じに扱う【Composite】

サブタスクを入れたら、階層が深いと進捗率の計算がバグる。個と集まりを同じに扱う【Composite】

コード探偵ロックの事件簿:サブタスクを入れてから、進捗率・工数・完了数の関数すべてに「タスクかグループか」の if が入り、階層が深いとバグる。個と集まりを同じに扱う(Composite)。

Featured image of post 通知のサブクラスが30個超、SMSを足せばまた増える。機能を重ね着で組み合わせる【Decorator】

通知のサブクラスが30個超、SMSを足せばまた増える。機能を重ね着で組み合わせる【Decorator】

コード探偵ロックの事件簿:メール・Slack に「リトライ」「ログ」を組み合わせるたびにサブクラスを作り、30個を超えた。SMS を足せば組み合わせの数だけクラスが増える。通知の本体に機能を包みとして重ね、組み合わせは実行時に作る(Decorator)。

Featured image of post 帳票に項目を1つ足したら、17種類の出力が次々に壊れた。原型を複製して作る【Prototype】

帳票に項目を1つ足したら、17種類の出力が次々に壊れた。原型を複製して作る【Prototype】

コード探偵ロックの事件簿:17種類の帳票テンプレートを毎回ゼロから組み立てていたため、全帳票に項目を1つ足したら、ある帳票で部署名が空欄になり、別の帳票の機密フラグまでおかしくなった。完成済みの原型を深くコピーし、違う部分だけを変える(Prototype)。

Featured image of post 引数12個のコンストラクタで1個ずれ、10万円の本番事故。名前を付けて組み立てる【Builder】

引数12個のコンストラクタで1個ずれ、10万円の本番事故。名前を付けて組み立てる【Builder】

コード探偵ロックの事件簿:広告キャンペーンの設定オブジェクトは属性が12個あり、コンストラクタに順番で渡していたら1個ずれて10万円の本番事故になった。名前付きのメソッドで1つずつ設定し、build() でまとめて検証する(Builder)。

Featured image of post 新旧システムでメソッド名もデータの形も違い、if分岐が溜まる。変換役を挟む【Adapter】

新旧システムでメソッド名もデータの形も違い、if分岐が溜まる。変換役を挟む【Adapter】

コード探偵ロックの事件簿:新システムと買収先の古いシステムをつなぐため、呼び出し側でメソッドを if で呼び分け、データも手で揃えていた。古いクラスを包んで同じ形で呼ぶ(Adapter)。

Featured image of post ステータスを1つ足したら、無関係な出荷処理でバグが続発。状態ごとにクラスを分ける【State】

ステータスを1つ足したら、無関係な出荷処理でバグが続発。状態ごとにクラスを分ける【State】

コード探偵ロックの事件簿:未払い・支払い済み・出荷準備中・発送済み・キャンセルの遷移を1つの if-elsif で管理していたため、「返品処理中」を足しただけで無関係な出荷処理にバグが続発した。状態ごとのクラスが自分の振る舞いと遷移先を持つ(State)。