8

質問

私の質問は、コードの整理とリファクタリングの方法と重要性をどのように教えられるかということです。

バックグラウンド

私は最近、同僚のコードレビューに取り組んでいました。彼らは、昔の同僚の仕事にいくつかの変更を加えていました。新しい変更の間、私の同僚はアイテムをリファクタリングしようとしましたが、クラッシュやその他の問題に遭遇するとすぐにあきらめました (問題の根本を見つけるためにウサギを追いかけるのではなく)、問題のコードを再実装し、その上にさらに構築しました。これにより、コードは回避策と魔法の番号のもつれに陥ったため、私は彼らと一緒に座ってリファクタリングを行いました。

リファクタリングできる場所を特定する方法と、各リファクタリングで新しい領域がどのように強調されるかを説明しようとしました。たとえば、同じ情報を格納する 2 つの変数があったとします。なぜでしょうか? より大きな問題の回避策だと思ったので、変数を 1 つ取り出してウサギを穴に追い込み、他の問題を発見しました。これにより、最終的に、同じことを何度もループしているという問題が見つかりました。これは、行われていることを難読化するマジック ナンバー サイズの配列の使用が少なからず原因でした。最初の「二重変数」の問題を修正することで、この発見 (およびその他の発見) につながりました。

このリファクタリングの旅を同僚と一緒に行ったとき、特定の変更を行った理由と、新しい機能が元の機能と一致していることを確認する方法を彼女が常に理解できていないことが明らかになったので、時間をかけて説明し、証明しました以前のバージョンと比較し、紙の上で変更を段階的に確認することで、各変更を確認します。また、リファクタリングの選択が悪い考えかどうかを判断する方法、コードの変更ではなくコメントを選択する場合、および適切な変数名を選択する方法について、例を挙げて説明しました。

一緒に座ってこれを行うプロセスは、私自身 (他の人に物事を説明する最善の方法についてもう少し学ぶ必要がありました) と同僚 (彼らは私たちのコードとコーディングの実践をより理解するようになりました) の両方にとって価値があると感じました。しかし、この経験から、リファクタリング プロセスを教えるより良い方法はないかと考えるようになりました。

...そして最後に...

リファクタリングが必要なものと不要なもの、およびそれをリファクタリングする方法は非常に主観的なものであることを理解しています。ここでは、似たような経験をし、彼らから何を学んだか (教師または生徒のいずれかとして)。

4

9 に答える 9

3

ほとんどのプログラミングと同様に、リファクタリングのスキルには練習と経験が伴います。教えることができると考えるのは良いことですが、学ぶ必要があります。異なる環境で達成できる学習量には大きな違いがあります.

あなたの質問に答えるために、教育的な方法でリファクタリングの方法と優れた設計を教えることができます。それで問題ありません。しかし、最終的には、あなたも私も、特定のレベルに到達するには長く厳しい経験を積む必要があることを知っています.

于 2008-10-23T18:06:25.053 に答える
2

私はあなたの質問を 100% 理解できるわけではありませんが、リファクタリングが必要なCode Smellを参照できると思います。他の人に示すことができる多くの例が含まれています。

リファクタリングを使用する必要がある場合のリストを次に示します (コードの匂いのリスト)。

于 2008-10-23T17:50:53.090 に答える
2

まだ読んでいない場合は、Martin Fowler がRefactoring: Improving the Design of Existing Codeというテーマに関する優れた本を出版しています。彼は、特定のコードをリファクタリングする方法と理由について、かなり詳しく説明しています。

リファクタリングについて尋ねる人がこの本の知識を前提としているのではないかと恐れ、言及することさえ躊躇しまし。しかし、どうした、そこに行く。:-)

于 2008-10-23T17:59:34.490 に答える
2

あなたはテストについて言及していません。リファクタリングが既存の機能を壊さないことを「証明」するには、リファクタリングを行う前に、既存のテストを用意するか、テストを作成する必要があります。

于 2008-10-23T18:00:24.677 に答える
1

リファクタリングを考える簡単な方法の1つは、名前の中にあります。これは、方程式から一般的な変数を因数分解する場合と同じです。

xy + xz

になります

x(y + z)

xは因数分解されています。コードのリファクタリングは、重複するコードまたはロジックを見つけてファクタリングするという点で同じです。

于 2008-10-23T18:13:56.350 に答える
1

あなたのアプローチはとても良いもののようです。プロセスの最後に、多くの問題を発見して修正する方法を示しました。教育目的のために、新しい変更/拡張/修正を発明することは興味深いかもしれません。次に、メンターに、古い新しいコードベースでその変更をどのように実施するかを尋ねることができます。うまくいけば、リファクタリングされたコードを使用して新しい変更を行う方がはるかに簡単であることがわかります(または、より多くのリファクタリングを行うことが、仮想的な変更に備えるための最も簡単な方法です)。

于 2008-10-23T18:16:27.560 に答える
1

自然でない人にリファクタリングを教えるのは大変な仕事です。私の経験では、オフィスで彼らと一緒に座ってコードをリファクタリングするのが最善の策です。あなたがこれをしている間、「意識の流れ」の対話を続けてください。あなたが見たもの、コードが正しくない理由、リファクタリングするオプションなどについて話してください。また、それらが同じことをしていることを確認する必要があります。最も重要なことは、コードを変更する方法ではなく、理由を伝えることです。まともなプログラマなら誰でも変更を加えて機能させることができますが、新しいソリューションが以前のソリューションよりも優れている理由を説明するには、スキルと経験が必要です。

于 2008-10-23T18:23:24.677 に答える
1

ペアプログラミングは、これを理解するための最良の方法のようです. このように、実際の製品コードに取り組んでいるときに、どちらも正しくないコードに遭遇したときに、一緒にコードのリファクタリングに取り組みます。このペアはドライバーの良心のように機能し、迅速な修正ではなく正しいことを行うように指示し、その過程で適切なコードがどのように見えるかを学習します。

リファクタリングは芸術であり、練習が必要です。やればやるほど上手になります。Martin Fowler の Ractoring の本に記載されている方法を引き続き研究し、ツールを使用してください (Visual Studio フォーク用の Resharper)。

于 2008-10-23T17:53:06.517 に答える
1

リファクタリングを教えるには、いくつかの方法があると思います。

教科書のような例が与えられました。ここでの欠点は、リファクタリングが有用である理由が必ずしも他の場合と同様に際立っているとは限らない、不自然または単純な例を持っている可能性があることです。

既存のコードのリファクタリング。この場合、クリーンアップする既存のレガシー コード、または開発中の独自のコードを使用して、さまざまなビットを実行する前と実行した後を表示し、読みやすさとメンテナンスの容易さの点で、実行後がどれほど優れているかを確認できます。これはライブ コードであり、ある程度改善および拡張されているため、より適切な演習になる可能性があります。

コードが何らかの方法で最適に実行されるためではなく、個人的な好みのために一部のリファクタリングが行われる可能性があるため、時間、練習、努力、忍耐が必要です。

于 2008-10-23T18:22:33.260 に答える