【ワールドクラスのオンサイト(一社)研修】
デザインパターン・リファクタリング研修

コース番号:519Q
標準学習時間:6日間
形態:ワークショップ

研修コースの概要

デザインパターン、リファクタリング(ユニットテストを含む)の知識・技術を身に付ける目的は、①洗練された設計が施されたコードを記述できるようになること、②バグが入りにくい高品質なコードを記述できるようになること、③読みやすくメンテナンスしやすいコードを記述できるようになることです。一方、実際に現場で生産されるコードは、(基本設計レベルでは堅牢な設計であるにもかかわらず、ソースコードレベルでは)上記3点が満たされないカオスなコードになりがちです。
そこで、この研修ではデザインパターン、リファクタリング(+ユニットテスト)の技法を用いて、高品質なコードを記述する方法と、既存のコードを高品質なコードに改善していく方法を、ハンズオンを通して習得します。

Project Management Institute

この研修では次のスキルが習得できます(使用言語はC#)

  • デザインパターンの習得がなぜ重要かを理解する
  • 30個程度のデザインパターンの概要を理解する
  • その中で使用頻度が高いと思われるパターンの適切な使用方法を説明できる
  • リファクタリングの意義、及び適用する場所と時期を説明できる
  • カオスなコードを適切にリファクタリングできる
  • リファクタリングとユニットテストによって読みやすいコードを記述できる
  • ユニットテストによってソースコードの品質を向上できる(バグの余地を減少させられる)
  • ユニットテストによって却って開発スピードが鈍化しないことを理解し、それを実践できる

この研修の対象者

ソフトウェア開発者。オブジェクト指向に基づいたプログラムコードを記述できる経験2年以上の方。

コース内容

デザインパターン概要

  • デザインパターンを習得する意義
  • GoFの23個のパターン、Grand(1998)のパターン、その他のパターン

ソフトウェア(ソースコードレベル)の設計原則とSOLIDの原則

  • SOLIDの原則(SRP、OCP、LSP、ISP、DIP)
  • その他の原則(重複排除、関心の分離、最小知識の原則)

全ての基本となるパターン

  • インターフェースパターン
  • デリゲーション(委譲)パターン
  • イミュータブル、シングルトンなど

実務でよく使用するデザインパターン

  • ファクトリーメソッド、アダプター、ファサード
  • テンプレート・メソッド、アブストラクト・ファクトリー
  • リポジトリーパターン、ディペンデンシー・インジェクション

概念として知っておくとよいバターン

  • ステート、コンポジット、コマンド、メメントなど

もはや重要度が低くなったパターン

  • マーカー・インターフェース、イテレーター

リファクタリング概要

  • リファクタリングの意義、時期、場所
  • 主なリファクタリングの技術(メソッドの抽出、プッシュダウン、プルアップなど)

ユニットテスト概要

  • テスト全般の理論(Boris Beizer等)とユニットテストの意義
  • 設計手法としてのユニットテスト(テスト駆動開発)
  • テストダブル(ダミー、モック、スパイ、フェイク、スタブ)

演習の内容

リファクタリングとユニットの基本的な演習(1)

  • カオスな状態のコードを提示し、メソッドの抽出とメソッドの移動を適用して、より洗練されたオブジェクト指向のコードに改善する
  • 同時にユニットテストを記述し、バグが発生しないか確認しながらリファクタリングを行う

リファクタリングとユニットテストの演習(2)

  • ベアメタル状態のアプリケーションに機能を追加しながら、その機能が正しく実装されているか確認するユニットテストを作成し、アプリケーションを完成させていく
  • ユニットテストを作成するごとに、プロダクションコードとテストコードをリファクタリングする
  • 同時にバグを含むコードを記述し、バグに対処する方法を述べる

リファクタリングとユニットテストの演習(3)

  • 外部アクセス(DBアクセスやWebAPI呼び出し)を行うアプリケーションに対し、テストダブルの手法を用いて、ビジネスロジックと外部アクセスを個別に検証するユニットテストを記述する
  • 既存のコードに対し、テストダブルを適用しやすいコードに改善するリファクタリング方法を学ぶ

実践的演習1

  • 類似する多数のswitch-case文をオブジェクト指向化する
    →共通インターフェースを定義し、case部をその実装となるようなリファクタリングを実施する

実践的演習2

  • 機能の類似点が多いのに細部の仕様が異なるオブジェクトを共通仕様にまとめる
    →アダプターパターンを適用し、「既存実装を、目標仕様に合わせる」ようにリファクタリングする

実践的演習3

  • アルゴリズム(ロジック)は同じなのに、細部のコードが異なる
    →テンプレートメソッドパターンを適用し、全体をフレームワーク化するリファクタリングを行う

実践的演習4

  • 変化しにくいコード(ビジネスロジック等)が変化しやすいコード(外部アクセス等)を参照している
    →依存性の逆転、あるいはディペンデンシー・インジェクション・パターンを適用して、変化しにくいコードが変化しやすいコードに依存しないようにリファクタリングする