辞書: 共通化

投稿日:

共通化とは

最も深刻なアンチパターンです。

アンチパターンである理由

もちろんコードのコピペは避けたほうがいいです。 しかし、それを避けるために共通化を使うことは、もっと深刻な問題を引き起こすことが多いです。

例えば、継承を使ってスーパークラスに実装を共有するのは以下の問題があります。

  • そのメソッドが使えないサブクラスがある場合、無駄になる。また、スーパークラスに別々の実装を作らないといけない。
  • 実装の共有をすると、コードが追いづらくなり、保守性に悪影響がある。

よく考えられたフレームワークを継承するのはまあ問題ないですが、 基本的に継承はアンチパターンと言ってもいいでしょう。 あと「ユーティリティクラス」も気をつけるべきです。

データベースではEAVというアンチパターンがありますが、 これも共通化によるアンチパターンの例です。

代わりに作るべきもの

オブジェクト指向ならまず取り入れるのはValue Objectですね。 その他DDDに書いてあるようなAggregatesとかいろいろ作ると、 ユーティリティクラスを作る例はかなり少なくなります。

例外

例えば以下の場合は例外だと思っています。 (他にあったかもしれませんが)

本来は元のクラスに加えるべきだが、言語の制限により不可能なもの

例えばJavaでStringクラスにメソッドを追加したいケースがあったとしても、これは不可能です。 なのでこういうときは、StringUtilsみたいなクラスを作っても問題ありません。 (「リファクタリング」にこの例の記載あり)

外部サイト