web-dev-qa-db-ja.com

自動化されたリファクタリングはどの程度保守可能ですか?

Resharperは私のループを変えることを申し出ました:

foreach (JObject obj in arr)
{
    var id = (string)obj["Id"];
    var accountId = (double)obj["AccountId"];
    var departmentName = (string)obj["DeptName"];
    i++;
}

... LINQステートメントに。私は黙認しました、そしてそれはこれを生み出しました:

int i = 1 + (from JObject obj in arr let id = (string) obj["Id"] let accountId = (double) obj["AccountId"] select (string) obj["DeptName"]).Count();

Gee whillikers、jumpin'Jehoshaphat、Heavens to Murgatroid!

これは、ロボットが私よりも賢くなるのは良いことなのだろうかと思います。それはどれくらい維持可能ですか?答え:私には理解できないので、そうではありません。 R#は、それをマシンコードに変換したのかもしれません。

とはいえ、それは「かっこいい」と認めざるを得ません。

この種のシナリオでは、どの時点で完璧が善の敵になりますか?

更新

2回目のパススルーで、R#はLINQのその行について、「ローカル変数「i」は使用されない」と通知します。

削除すると、次のようになります。

var arr = JsonConvert.DeserializeObject<JArray>(s);

うーん!今ではそれはグロッキーです。以前に要素を個々の変数に分解していた理由は、それらに何が含まれているかを確認できるようにするためでした。

MessageBox.Show(string.Format("Object {0} in JSON array: id == {1}, accountId == {2}, deptName == {3}", i, id, accountId, departmentName));

...しかし、そのメッセージボックスがコメントアウトされているので、結局のところ、上記の方が優れていると思います。

1
B. Clay Shannon

LINQは非常に強力です。しかし、私たちは常にそれに飛びつくことに注意する必要があります。誤解しないでください。私はLINQが大好きで、多くの場合、それは美しいツールです。あなたの場合、あなたのコードは完全に読み取り可能でしたが、それでもLINQバージョンはあなたの意図を難読化し、突然プログラマーは何が起こっているのかを正確に理解しなければなりません。

あなたのバージョンは明確で、簡潔で、意図に満ちています。

比較すると、LINQバージョンは忌まわしいものです。

4
Moo-Juice

私が使用する経験則の1つは、「このコードは読みやすいですか?」です。

リファクタリングは最初はかっこよく見えるかもしれませんが、通常行うものとは異なるものを使用する場合があります。ただし、結局のところ、コンピューターが提供する「熱さ」よりも理解しやすいコードを使用したほうがよいでしょう。

ですから、もしコンピューターが私にすぐに理解するのが難しいコードを与えてくれたら、私はその提案を拒否するでしょう。

3
David Weiser

自動化されたリファクタリングツールは、自動化された思考ツールではありません。コードの一部にリファクタリングを適用できるからといって(いつでも可能です)、そうする必要があるとは限りません。ツールが提案したからといって、何かをすべきだと決して考えないでください。あなたとあなたのチームは、何が維持可能で何が維持不可能かを決定する責任があります。

そうは言っても、自動化されたリファクタリングは素晴らしく、ReSharperは私が使用した中で最高のツールかもしれません。リファクタリングツールは多くの時間を節約できますが、思考から解放されるわけではありません:)

3
simoraman