質問: 一般的なオブジェクト指向言語全体に言えることに言えることで、言語ごとにこういうのあるとか聞けると良いかなと思ったのでタグは色々つけています --- ひとつめですが、 static method にするか、 instance method にするかについです 個人的には instance method は this のプロパティや他の instance method を参照するもののみで、インスタンスが持つデータへのアクセスが不要で引数だけから返り値が決まるもの(シンプルなものだと 2つの引数を足す add など)は static にしたいです プロパティを参照しないものは static に分かれていたほうが見やすく、知らないクラスを見たときにも、このメソッドはプロパティ参照しないことがわかるのはいいことだと思います しかし、知人から聞いたところテストを考えるとプロパティの参照がなくても instance method にした方がいいとのことでした その理由は、 static にするとそのメソッドが呼ばれることが決まってしまうが、instance method であればインスタンスをモックに置き換えることで、テストに都合が良いようにできるというものです add みたいなシンプルなものは不要ですが、返り値のデータが大きく(複雑な構造のオブジェクト)なりがちでそれを使う側のテストではシンプルなデータのほうが確認し易い場合、単に処理に時間がかかる場合、細かい仕様が決まってなく中身が未完成だけど使う側はテストしておきたいとき、などを考えると一理あるように思えます しかし、テストは作るアプリケーション単体には必要なものでなく、作る側が楽に確認するためのものであり、**テストだけのためにほぼ全てのメソッドを static method から instance method にするようなプログラムを見づらくすることは避けたい**です テストのしやすさをとるか、アプリのプログラム単体を見てわかりやすくなるようにするかどちらかをとるしかないものでしょうか? みんな仕方なく、static でいいものも instance method にしているのでしょうか --- 2点目です こっちはC#固有のものかと思います 上で書いたようなモックにインスタンスを置き換える場合です AクラスがBクラスのインスタンスをもつときに、BをBを継承したB2クラスに置き換えます Bクラスで各メソッドが virtual 指定されていなければ、override でなく new になり、Aクラス内のBがB2であろうと、Bクラスとしてメソッドが呼ばれるのでB2クラスでなくBクラスのメソッドが呼び出されます ほとんどのクラスはどこかのクラス内で保持される思うので、テストを考えるとほぼ全部のメソッドが**テスト以外に意味もなく** virtual になります 有名らしいMoqというライブラリも virtual つけないといけないそうですし、これについては他に方法はなさそうです テストのためだけに全部に virtual つけていくのが良い書き方とはとうてい思えないのですが、みんな諦めて書いてるものなのでしょうか ###### 謝辞 思った以上にたくさんの回答いただき驚きました オブジェクト指向って難しいですね いつまでもオープンのままにしておくのもどうかと思ったのでこのあたりで終了とします ベストアンサーはすごく迷ったので、一番高評価が多かった回答にしました ありがとうございました
回答: 「ひとつめ」 テストのためにインスタンスメソッド化するのではないのです。 疎結合にするためにインスタンスメソッド化し、疎結合化した結果としてテストもしやすくなるものなのです。 各クラスがスタティックメソッド群に依存しきってしまっていたら、クラスそれぞれを取り出して部品として扱うことは適わなくなります。それを * スタティックメソッド群をインスタンスメソッド化し * そのクラスはそれ用のインターフェースを実装した形にし * 利用する側のクラスはインターフェースへの参照だけ持ってそれに対してアクセスする という形にすることでクラスからメソッドへの結合を引きはがせる、という話です。これによりメンテナンス性、分業しやすさ、クラスの性質の把握しやすさが向上します。テストもしやすくなっています。 「ふたつめ」 AがB型の参照を持つのではいけません。BのインターフェースをIBへ抜き出し、B implements IBの形にします。AはIB型への参照を持ってアクセスします。そしてテスト用のモックはIBを実装する形で作るのです。