kkawahara.net

  • ホーム
  • 開発
  • 音楽
  • 日記
  • 自己紹介
  • Docs
  • 壁

日記

AtomRSS 2.0

アーカイブ

  • 275760
    • 275760-09 (1)
  • 2026
    • 2026-03 (1)
    • 2026-02 (2)
    • 2026-01 (1)
  • 2025
    • 2025-11 (1)
    • 2025-10 (1)
    • 2025-08 (1)
    • 2025-04 (1)
    • 2025-01 (2)
  • 2023
    • 2023-09 (2)
    • 2023-06 (4)
    • 2023-01 (1)
  • 2022
    • 2022-12 (2)
    • 2022-10 (2)
  • 2021
    • 2021-02 (1)
  • 2020
    • 2020-06 (1)
    • 2020-02 (1)
  • 2019
    • 2019-08 (1)
    • 2019-07 (1)
    • 2019-06 (1)
    • 2019-03 (1)
  • 2017
    • 2017-07 (1)
    • 2017-01 (1)
  • 2016
    • 2016-09 (1)
    • 2016-08 (1)
    • 2016-03 (1)
  • 2015
    • 2015-11 (1)
    • 2015-09 (1)
  • 2013
    • 2013-11 (2)
    • 2013-09 (1)
  • 2012
    • 2012-07 (2)
  • 0000
    • 0000-01 (1)

カテゴリー

  • 壊れた (6)
  • コンピュータ (1)
  • 生活 (20)
  • 音楽 (1)
  • プログラミング (8)
  • 読書 (13)
  • SF (2)
  • ログイン
  • スペシャルサンクス
  • ユーザーガイド
  • GitHub
  • X
  • Qiita
Webアプリケーション バージョン 4.7.16© 2026 Kazuki Kawahara

テスト駆動開発の第8章

2026年02月25日
プログラミング

Kent Beckのテスト駆動開発を日々読み進めている。

第8章に次のコードが登場した。

package money;

abstract class Money {
    protected int amount;
    abstract Money times(int multiplier);
    public boolean equals(Object object) {
        Money money = (Money) object;
        return amount == money.amount
            && getClass().equals(money.getClass());
    }
    static Money dollar(int amount) {
        return new Dollar(amount);
    }
    static Money franc(int amount) {
        return new Franc(amount);
    }
}

Moneyクラスがその子のDollarクラスやFrancクラスを生成している。

著者はこれでテストコードから2つの子クラスの存在が消えて良くなったと主張している。なるほどと思ったが、まもなく違和感がやってきた。やがてこの違和感はオープン・クローズドの原則に反していることによるものだと気がついた。

この設計だと、お金の単位を追加するという拡張を行うときに既存のコードを修正しないといけない。オープン・クローズドの原則に従うと、この設計は良くないと言える。

著者の設計方針やその合理性はわかる。オブジェクトを生成する責務をどこかに持たせる必要が出てきて、それを最小限の労力で済ませるために生成用クラスを新設するのではなく親クラスに責務を持たせることにしたのだろう。オブジェクトは数種類だからそれで十分だ。もし生成するオブジェクトが何十種類もあるなら、オブジェクト生成担当のクラスを設ける必要があるだろう。

XFacebookLINEB!はてなブックマーク
0

おたより

おたよりはまだありません。

新しい記事電球のフィラメントが切れた古い記事さくらももこ - もものかんづめ