matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 26: シグネチャの変更

2012-12-30 18:17:12

元記事

31日間ReSharper一周」の26日目にようこそ。

3つの関数が同じ引数を持つんだけど、それぞれ順序が違う、なんてことが今までにあった?もしあったなら、「シグネチャの変更」はぴったりの機能だ。

ReSharperの「シグネチャの変更」ダイアログは、メソッドのシグネチャに関するどんなものでも変えることができる。ReSharperの他の機能にもメソッドのシグネチャを特定の手段で変更するものはある。たとえば「パラメータの導入」とか。でもこれにはショートカットが無い。以下のことができる。

  • メソッドのリネーム。「メソッドをオーバーロードして委譲」を選んだら、前の名前のメソッドを挿入するが、それは単に新しいメソッドを呼び出すだけしかしない。もしかしたらまだ使うかもしれないから。
  • 戻り値の型を変更。
  • パラメータの追加。デフォルト値を指定する必要があり、その値がすべての呼び出し元から渡されるようになる。でも固定値を毎回渡したくないときだってあるだろう。その場合は次の章を見ること。
  • パラメータの削除。ReSharperはパラメータが使われていないかどうか確認しないから、コンパイルできないコードになってしまうかもしれまない。(パラメータを安全に削除する機能もある。他のとあわせてDay 31で扱おうと思って残してある。)
  • パラメータ名のリネーム。残念、ReSharperはここでは変数名の提案をしてくれない。Ctrl+Spaceを押したとしてもね。
  • パラメータの並べ替え。

どの場合でも、ReSharperは全部の呼び出し元をちゃんと更新してくれる。

新しいパラメータに非固定の値を

新しいパラメータを追加するとき、コードをコンパイル可能に保つために、ReSharperはすでにこのメソッドを呼んでいるすべての呼び出し元を修正する必要がある。つまり、何かを渡す必要があるということだ。これは必須フィールドであり、すべての呼び出し元から渡される何かを指定しないといけない。

じゃあ、すべての呼び出し元からまったく同じ値を渡すのが嫌なら、どうすればいい?それにはいくつか選択肢がある。

  • 「シグネチャの変更」を使わないこと。その代わりに手でパラメータを追加する。そうすればコンパイラが全ての呼び出し元に移動させてくれるだろう――たぶんね(他にもオーバーロードがあると分かって痛い目にあったことがある)。ごく単純な場合以外推奨はできない。だからこういうツールが必要になるんだけど。
  • とりあえずデフォルト値を使い、忘れずに戻って変更すること。これもお勧めはできない。人の記憶力ってそんなにいいもんじゃない。だからそもそもReSharperを使っているんだし。nullのようなデフォルト値は、それを渡すことが一番理にかなったときだけ使うべきだ。
  • どの呼び出し元にも存在しない、asdfjklみたいな意味の無い式を使うこと。ReSharperは止めたりしないけど、(当然)コンパイルできないコードになる。これが実際に役立つのは次のような点だ――コンパイラはすべての呼び出し元に確実に移動させてくれるので、そこで何を渡すべきなのか、ケースバイケースの判断をすることができる。
  • ほとんどの場所で機能すると思われる式を使うこと。もしFooオブジェクトを渡しているのならデフォルト値としてFooとだけ入力してもいい。ほとんどの呼び出し元にはFooプロパティを持ったクラスがいくつかあることを期待してね。僕らはこの手でうまくいったことも多かった。
  • 代わりに「パラメータの導入」を使うこと。もし「パラメータの導入」を使えるのなら、そっちの方が「シグネチャの変更」よりいい。「パラメータの導入」は正しいことを為してくれるからだ。ただし、新しいパラメータをメソッドが知っている形で表すことができるときしか機能しない。

31日間ReSharper一周 インデックスへ戻る