第3回まで無料

設計とリファクタリング入門コース

命名・関数の分け方・早期リターンから、SOLID・依存性注入・ポートとアダプタ・特性テスト・ADR まで。全30レッスンで「動くコード」を「読めて、変えやすいコード」に直せるところまで進みます。どの回も悪い例と直した例を Python と Java で並べ、同じ入力に同じ答えを返すことをテストで確かめています。

カリキュラム

全30レッスンを6つの章に分けています。第1章から順に進めるのがおすすめですが、 気になるところだけ拾い読みしてもかまいません。 ※ コードは Python 3.14 + pytest 9 と Java 21 で実際に動かしたものです。標準ライブラリだけで動く回は、ブラウザ内で before と after を実行して見比べられます。pytest と Java のテストは手元で試してください。

Chapter 1 — 読みやすさから始める(第1〜5回)

名前・関数の長さ・コメント・入れ子の深さといった、読んだ瞬間に引っかかるところを直します。最後はマジックナンバーと重複を「コードの臭い」として見分け、直しどころの一覧を手に入れます。

Chapter 2 — 関数とデータの整理(第6〜10回)

関数の抽出・重複の除去・引数オブジェクトで、処理とデータのまとまりを作り直します。最後は副作用と問い合わせ・更新を切り分け、テストしやすい関数の形まで進みます。

Chapter 3 — オブジェクト指向設計の原則(第11〜16回)

単一責任・開放閉鎖・リスコフの置換・インターフェース分離・依存性逆転の 5 つを、1 回に 1 つずつ悪い例と直した例で確かめます。最後は 5 つを 1 本のコードに重ねて、原則どうしがどう支え合うかを見ます。

11

単一責任の原則(SRP)

集計・CSV 化・通知の 3 つの理由で変わる Report を、責任ごとのクラスに分ける直し方。「誰の都合で、いつ変わるか」で責任を見つける、SOLID の 1 つめ。

🔒 ベーシック
12

開放閉鎖の原則(OCP)

図形が増えるたびに elif を書き足す area を、図形ごとに area() を持つクラスへ置き換える直し方。新しい種類は「クラスを足すだけ」で、既存のコードには触らない設計。

🔒 ベーシック
13

リスコフの置換原則(LSP)

「正方形は長方形の一種」と継承したら、幅を変えると高さまで変わってしまう例。継承は言葉の分類ではなく、振る舞いの約束で決めるという SOLID の 3 つめ。

🔒 ベーシック
14

インターフェース分離の原則(ISP)

印刷しかできない機種に scan と fax まで書かせる大きなインターフェースを、Printer・Scanner・Fax に分ける直し方。使う側が必要とする単位で割る、SOLID の 4 つめ。

🔒 ベーシック
15

依存性逆転の原則(DIP)

注文の処理が MySQL の保存クラスを中で直接作っている形を、抽象 OrderRepository を挟んで逆転させる直し方。テストでは DB 無しのメモリ版に差し替え。

🔒 ベーシック
16

SOLID を組み合わせる

宛先ごとの if・メッセージ作り・送信を 1 つで抱えた notify を、SOLID を重ねて部品に分ける第3章の総まとめ。新しい通知先はクラスを足すだけ、テストは偽の Channel を渡すだけ。

🔒 ベーシック

Chapter 4 — 依存を切る(第17〜22回)

依存性注入・ポートとアダプタ・レイヤで、本体のロジックを DB や時計やネットワークから切り離します。最後はそれらを組み合わせたミニアプリを、演習として自分で組み立てます。

17

依存性注入(時計を外から渡す)

中で datetime.now() を呼ぶ挨拶の関数を、Clock を外から受け取る形に直す手法。テストでは固定の時計を渡し、18 時ちょうどの境目も待たずに確認。

🔒 ベーシック
18

ポートとアダプタ(中心のルールを外から守る)

在庫を引く業務ルールに、グローバルの辞書と print が直に混ざった buy を、中心・ポート・アダプタに分ける直し方。中心は偽のアダプタだけで単体テスト。

🔒 ベーシック
19

レイヤの分け方(entity・usecase・gateway)

検証・業務ルール・保存を 1 つで抱えた register を、entity・usecase・gateway の 3 つの層に分ける直し方。依存は内向き、層は必要になってから増やすのが原則。

🔒 ベーシック
20

テストしやすい設計(継ぎ目を作る)

中で乱数を引くくじ引きを、数を返す関数を外から渡せる形に直す手法。既定値は本物の乱数のまま、テストでは 5 と 6、30 と 31 の境目を狙い撃ち。

🔒 ベーシック
21

グローバル状態を避ける

テストの順番で値が変わるグローバルのカウンターを、IdGenerator のインスタンスに閉じ込める直し方。持っている人だけが触れる状態にして、後始末の reset() も不要に。

🔒 ベーシック
22

【実践】依存を切ったミニアプリ

保存・ID 採番・一覧をグローバル変数で抱えた TODO アプリを、entity・usecase・gateway に分けて組み直す演習。第17〜21回の原則を 1 本のアプリに重ねる総合課題。

🔒 ベーシック

Chapter 5 — テストに守らせる(第23〜27回)

テストの無いコードの今の動きを写し取り、継ぎ目を見つけて、小さな一歩ずつ安全に直す手順を身につけます。最後はレガシーな関数を、テストで守りながら演習として作り直します。

23

特性テスト(今の答えを写し取る)

仕様書の無いレガシーな成績関数の「今の答え」を、そのまま期待値にして 84 通り写し取るテスト。皆勤の加点のような変な仕様もまず保ち、構造だけを整える進め方。

🔒 ベーシック
24

レガシーの継ぎ目(送信を引数で受け取る)

延滞者へのメール送信を直に呼んでいて、テストすると本当に送ってしまう関数に、送る手段を引数で受け取る継ぎ目を作る直し方。誰に送るかの判断だけを、1 通も送らずに確認。

🔒 ベーシック
25

小さく安全に変える(1 手ごとに緑を確かめる)

距離・年齢・休日が絡んだ運賃計算を、名前付け → 関数の抽出 → 関数の抽出 → ガード節の 4 つの小さな手で直す進め方。各ステップの直後にテストを走らせるのが肝。

🔒 ベーシック
26

説明変数と問い合わせ(条件式に名前を付ける)

and と or が入り組み、合計の計算を 2 回くり返す can_checkout を、説明変数と 1 つの問い合わせで読める形に直す手法。最後の return が、ほぼ日本語で読める条件式。

🔒 ベーシック
27

【実践】テストで守りながら直す

クーポン・ポイント・送料・税が変数 t の使い回しで絡まった価格計算を、特性テストで守りながら段階ごとの関数に分ける演習。第23〜26回の手順を 1 本で通す総合課題。

🔒 ベーシック

Chapter 6 — チームで続ける(第28〜30回)

コードレビューの観点、技術的負債の見える化、設計判断の記録(ADR)で、良い設計を 1 人の努力からチームの習慣に変えます。最後は ADR とコードを対応づけて、全30回を締めくくります。

全30レッスンを終えたら、設計の判断を開発の工程に乗せる システム開発入門コース や、レビューと振り返りをチームで回す アジャイルスクラム入門コース へ。テストの書き方を深めるなら テスト技法入門コース も。メンバーシップで全コースが解放されます。