2008年10月03日

リファクタリング?

  
システムが大きくなると、単体テストの環境を整えるのが面倒になるときがありますよね。
あるクラスXが Sampleクラスを利用していた場合に、このSampleクラスがテストに邪魔になるときがあります。
そんなときに、

class Sample : ISample { .. }
class NullSample : ISample { .. }

という構造にし、一時的にNullSampleというスタブをつかうことで、クラスXそのものの動作を確認できるようにすることがあります。

でも、システムが安定してくると、ISampleや NullSampleは不要になります。
そうなると、複雑さを軽減したくなってきます。
こんなときは、ISample, NullSampleは、そのまま残しておくべきなのでしょうか。それともこれもリファクタリングと考えて、ISample, NullSampleは消してしまったほうがよいのでしょうか。
結構悩みます。


この記事へのコメント
リファクタリングの目的は複雑さを取り除くことなので、それを実現するために不要なクラスを消すことは立派なリファクタリングになるんじゃないでしょうか?
存在する理由が本当になくなったのなら、消してしまった方がいいと思います

(ちょっと深読みしてみますが) もし、それを残すことで何らかのメッセージ (例えば「この過去の関連コード見れば今のコードが最適だとわかるよね?」とか) を伝えたいということならば、素直にコメントなりドキュメントなりに書き出した方がいいと思います (動作するコードとして残すことに意味があるなら残した方がいいですが)
Posted by よこけん at 2008年10月04日 00:28
2度目のコメントです。
質問口調だとついしゃべりたくなってしまいます。


クラス構造の見方として「(適切な粒度で)テストが行いやすいか」
という観点もあるそうです。
(疎結合であればテストもしやすいはず)

その見方で言えばNullSampleは要らないことになりますが、
ISampleは必要ということになります。

もちろん、クラスXのテストスイートがスタブテストが無くても
十分な程充実しているのであれば両方とも要らないかもしれません。
疎結合といってもすべての依存クラスをインターフェース経由で操作していたらキリがないですし。

結局のところ、今後の修正、拡張時にもスタブテストが必要かどうか
に拠るって事でしょうか。

雑文失礼しました。
Posted by satoshi at 2008年10月04日 02:54
よこけんさん

> 存在する理由が本当になくなったのなら、消してしまった方がいいと思います

結局、「存在する理由」があるのかが、ポイントということですね。
せっかく作ったんだし、残して置いてもいいかなーという考えは捨てたほうが
よいですね。

Posted by gushwell at 2008年10月04日 23:19
satoshiさん

> クラス構造の見方として「(適切な粒度で)テストが行いやすいか」

テストをやりやすくするために、作ったクラスなわけで、
必要だったし、役にたったわけですが、
NullSampleは使われる可能性は、もうほとんどない。だから
削ってもいいかなと思うわけです。

> 疎結合といってもすべての依存クラスをインターフェース経由で操作していたらキリがないですし。

そうなんですよね。
どっちにしろ具象クラスが一つならば、ISampleインターフェースも
必要ないかなーと思うのですが、インターフェースを削ると、
修正が面倒なので、ちょっと悩むわけです。
これこそ、IDEがやってくれると楽なんですが。。。



Posted by gushwell at 2008年10月04日 23:31
 

この記事へのトラックバックURL