Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オブジェクト指向による変更容易性の高いソフトウェア設計技法

 オブジェクト指向による変更容易性の高いソフトウェア設計技法

Avatar for Ryosuke Fujii

Ryosuke Fujii

December 06, 2021

Other Decks in Technology

Transcript

  1. 良いコードとは • 良いコードは、正しく動作することに加えて「変更がかんたん」である • 変更がかんたんとは ◦ 見通しが良い ▪ 変更箇所の特定がかんたんにできる ▪

    変更による影響範囲をかんたんに特定できる ◦ 合理的である ▪ 要件の変更が小さければ、コードの変更も相応して小さい ◦ 再利用性 ▪ 既存のコードはかんたんに 再利用できる
  2. なぜ変更がかんたんである必要があるのか • システムの最終形である外部仕様が決まっていない • 変更の要求は絶えず発生する ◦ ビジネス要件の追加 ◦ バグ修正 ◦

    UI改善 ◦ パフォーマンス改善による DBスキーマ・DBの変更 プロダクトの成長=事業の成長である我々にとって 「変更がかんたんである」ことが事業成長の鍵を握る
  3. 単一責任にクラスを分割する • 人間は複雑で大きな問題をそのまま解決することはできない ◦ 様々な関心ごとが絡み合い複雑で大きな問題となる ▪ レイアウトしたい ▪ 業務ロジックを組み立てたい ▪

    データを加工したい ▪ 計算したい ▪ 通信したい ▪ 永続化したい • 関心の分離 ◦ 解決すべき複雑で大きな問題を単純で小さな問題に分解する ◦ 単純で小さな問題を個別に解決する=部品(モジュール) ◦ 部品(モジュール)を組み合わせて、複雑で大きな問題を解決する。
  4. 依存とは • モジュールAがBについて「知っている」時 AはBに依存していると言える • 「知っている」ことが多いほど密結合 • 例 ◦ OrderControllerクラスは

    注文が注文明細を持っていることを知っている ▪ 不要な依存と言える ▪ 注文金額を計算するために注文 IDさえ 伝えれば良い
  5. 疎結合にする技法 • 具象ではなく抽象に依存する ◦ 内部詳細を隠蔽する ◦ インタフェースに依存する 日本の課税計算クラス アメリカの課税計算クラス カナダの課税計算クラス

    注文金額クラス switch (国区分) case JP: 日本の課税計算クラス .calcTax case US: アメリカの課税計算クラス .calcTax case CAN: カナダの課税計算クラス .calcTax calcTax calcTax calcTax
  6. 費用対効果の高いテスト • テストコードの目的 ◦ バグを検知することはもちろんだが、 ◦ テストコードを書かない時に比べて、 開発の生産性を上げること • テストの種類

    ◦ ユニットテスト ▪ モジュールの動作試験 ◦ 結合テスト ▪ サブシステムレベルの動作確認 細かいテストはユニットテストで行う
  7. 副作用のあるオブジェクト呼び出しのテスト • クラス内に副作用のあるオブジェクト呼び出しがある場合、ユニットテストとしてどこまでテストすべき か ◦ 例) ▪ 注文作成クラスで通知オブジェクトを呼び出しているが、 ユニットテストとして通知テーブルにレコードが作成されたことまで確認する必要があるのか ◦

    個人的には、モックを使って、「オブジェクトの呼び出しが適切に行われたこと」あるいは「戻り値の確認」をテストする だけで良いと考えている。 ▪ 理由 • テーブルにレコードを適切に作成することは、通知オブジェクトのユニットテストの範囲であり、アクショ ン作成クラスのテストではない。 • もしオブジェクトの呼び出し自体に問題があれば、結合テストで検知できる • 通知オブジェクトの内部処理変更時に、呼び出し側クラスのテストコードまで変更しなければならない。