オブジェクト指向?

週末の社内イベントに向けて_クラス設計における SOLID の原則_みたいなソレを若手が調べてきて発表とかしてるナニに同席。primitive obsession てどう幸せになるんスかみたいなやりとりがあったんですが、あまり上手くフォローが入れれなくて悔しいのでエントリ入れてみます。(誰

例えば

あ、primitive obsession の説明じゃなくなると思います。
前提として DataWriter みたいな抽象クラスの下に XMLDataWriter とか TextDataWriter とか DBDataWriter みたいな concrete なサブクラスが居るカンジで。
オブジェクト作るファクトリクラスがあるとしてある手続きの中で以下なカンジでオブジェクトを生成します。参照は抽象クラスで、がデフォ。

    DataWriter obj = DataWriterFactory.createObject();

本当はどの concrete なクラスのオブジェクトを作るのか、なソレが必要なはずなんですが、ここではスルーで。あとは出力、なメソドを使って

    obj.output(outputText);

みたいなカンジで出力、って仕様とします。

こんなコトして何がシアワセなのか

というのが primitive obsession な話で wrapper なオブジェクト作って云々が基本らしい、という話の中で出てきてました。例えば上のように何でも抽象クラス使ってヤりなさい云々というのも同様。
オブジェクト指向の基本的な目的として、「再利用」などという言葉がよく使われるんですがぼくはちょっと違うと思っていて、例えばこの SOLID なオブジェクト指向設計の原則によってシンプルに、あるいは変更に強い、変更に伴なうインパクトを最小限に抑える何か、を作ることができる、という事だと思っています。
例えば上のサンプルコードですが、実際に使われている concrete なクラスに修正が必要になった場合、それを継承するクラスを作って、該当するメソド (おそらくは output) を必要に応じて書きかえてあげれば良いはずです。
とにかくシンプルに作れだとか、抽象に依存せよ、とかあるいはもっと範疇を広げてデザイン・パターン云々 (リファクタリング云々)、というあたりは全て修正に伴なうインパクトに強い、という意味での再利用性を担保するためのものだと思っているのですが、どうなんでしょうかね。