一般的なオブジェクト指向言語全体に言えることに言えることで、言語ごとにこういうのあるとか聞けると良いかなと思ったのでタグは色々つけています
ひとつめですが、 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 つけていくのが良い書き方とはとうてい思えないのですが、みんな諦めて書いてるものなのでしょうか
謝辞
思った以上にたくさんの回答いただき驚きました
オブジェクト指向って難しいですね
いつまでもオープンのままにしておくのもどうかと思ったのでこのあたりで終了とします
ベストアンサーはすごく迷ったので、一番高評価が多かった回答にしました
ありがとうございました
まだ回答がついていません
会員登録して回答してみよう