2009-08-30 9 views
4

TDD円は次のとおりです。ステップは、我々は単に失敗テストを修正するために、できるだけ簡単なコードを記述すると想定されている「コーディング」でテスト - >コード - >リファクタリング、いつリファクタリングを開始する必要がありますか?

"Write failing Test" -> "Write Code to fit a Test" -> "Refactor" 

。実際に必要となるまで複雑なコードを書くべきではありません。

次のステップはリファクタリングです。私たちは単にコードを書き直すべきでしょうか?テストが合格するまではコードに満足しているはずだから、本当の意味はないと思う。

恐らく、リファクタリングの活動は、コードの書き込みが失敗したテストによって引き起こされるように、何かによって強制されるべきです。ここではいくつかの可能な要因:

  1. 書き込まれる次のテストは、システム内のいくつかの変更(リファクタリング)が必要です
  2. パフォーマンスが悪いです。機能を無効にすることなく改善する必要があります
  3. コードレビューでは、記述されたコードは理解しにくいことが明らかになりました。

リファクタリングを開始する他の理由は何ですか?

また、この方式は正しいです:

"Write failing Test" -> "Code" -> "Refactor" -> "Write failing Test" 

またはそれが

"Write failing Test" -> "Code/Refactor" -> "Write failing Test" 
+ 
"External factor (like bad performance)" -> "Refactor". 

答えて

5

TDDは、あなたの作業を軌道上に維持するのに最適なツールです。問題:

"テストに失敗書く" - - > "コード/リファクタリング">、あなたが提案する

を "テストに失敗書く" は、それが簡単になることができています"テストを失敗書く" - > "リファクタリングは、" - > "コード" - > "テストを失敗書く"

又はその後

"テストに失敗書く" - > "リファクタリング" - > "リファクタリング" - > "リファクタリング" - > "コード" - >あなたは避けたいものである

を "テストに失敗書きます"。実装の初めにリファクタリングすることで、あなたは投機的な開発に夢中であり、コーディングセッションの目標を達成していません。接線を避け、必ずしも必要でない物を作るのは簡単です。機能が動作し、テストに合格した場合は、リファクタリングを停止する時期をいつでも簡単に判断できます。あなたのテストは合格しているので、いつでも停止することができます。

また、テストが緑色でないときは、リファクタリングしたくありません。

カップル他の小さなPTS:

  1. 私は文学のほとんどは、どのようなリファクタリングで、わずかに異なる定義を持っていると思います。 「システムへのいくつかの変更」やパフォーマンスの向上ではなく、動作を変更せずにデザインを改善する特定の変更です。定義を受け入れると、パフォーマンスの改善は実際には受け入れられません。それは、独自の受け入れテストを必要とする通常の開発タスクです。私は通常、これをエンドユーザが直面しているストーリーの枠組みに入れようとしています。理にかなっている?

  2. TDDの練習では、コードレビューで明らかになったデザイン上の問題に特に言及していないと思います。 (これについては、リフレクションとペアプログラミングを参照してください。)これらは、「コード債務」として構築された、より大きなクロスストーリーの問題であり、定期的にクリーンアップするには時間がかかることがあります。これは別のプロジェクトでも構いませんが、個人的には、これを別の「本当の」話の一部として常にやりたいと思います。これを最後にして、問題があると判断しましたが、関連するストーリーが出てくるまで数週間待ってしまいました。私たちは、それが間違っていることは分かっていましたが、最初に新しい機能を実装するTDDのプラクティスに従いました。しかし、その後、何が起きているのか、それがなぜ乱雑であったのかを理解してから、リファクタリング段階で通常よりも長く過ごしました。うまくいった。

+0

'Refactor-> Refactor-> Refactor'セクションが膨大な量の開発時間を吸収する無限の変更につながることを強調したいだけです。また** **コードが変更されるたびに、そのコードの変更が新しい機能であるかリファクタリングであるかに関わらず、テストを再度実行する必要があることに注意してください。 – quamrana

+0

私たちがアプリケーションを書くことを考えてみましょう。この時点で、タスクのリストと新しいタスクの公開が可能になります。しかし、テストに合格するには、グローバルなタスクリストがあれば十分でした。確かに、顧客は「仕事を持続させる」ことを望んでいる。 IRepositoryを実装するのがよい方法であると私は決めることができます。それを使用するには既存のコードが必要です。だから私は彼らがIRepositoryに電話することを確認する方法をリファクタリングする。今回のリファクタリングは、新しいユーザーストーリーに起因していました。要するに、私が把握しようとしているのは、Code Writingだけでなく、Refactoring自体を駆動するためにユーザーストーリー/テストを使用できるかどうかです。どう思いますか? – alex2k8

+0

私たちはTDDから少し離れているので、私はそれを省略します。 *リファクタリング*の定義(TDDの世界の中で)は、テストが緑色になるまでリファクタリングを開始せず、緑色(やはり/まだ)でなければ完了していないということです。だから彼らは役に立つツールですが、実際にはリファクタリングを「推進」することはできません。 私はユーザーストーリーの実践においてINVESTについてかなり規律を持っています。私はいつもあなたが上でやったのと同じように、必要なリファクタをユーザーストーリーの一部として再構築しようとします。 「IRepositoryにリファクタリングする」という話は決してありませんが、代わりに貴重なユーザー対応機能の不可欠な部分にします。 – ndp

1

として見るべきであるかもしれうーん...私は通常、「外部」リファクタリングのこれらの並べ替えから分離考えますTDDサイクルそのもの。 TDDを使ってフィーチャXYZを完成させたら、リファクタリングによるバグの導入を防ぐための健全なテストを行うべきです(コードカバレッジが最適であると仮定した場合など)。パフォーマンスのボトルネックと分かりにくいコードは、とにかく事実の後で通常は切り詰めるので、その時点でリファクタリングを行うのが理想的です。テストを使用してシステムにバグを導入していないことを確認しながら、パフォーマンスを向上させ、コードを理解しやすくするほか、必要な作業を行うことができます。

あなたの質問に答えるために、コードを開発している間、識別子(コードが臭いがする場合があります)が確実に追跡される項目であるにもかかわらず、外部リファクタリングがTDDパターンに適合しているとは思いません。

+0

私たちは「外部」リファクタリングを除外した場合...あなたはTDDは別のステップとしてリファクタリングを持っていると思いますか、またはそれは「リファクタリングとコード」になりますか?既存のコードを変更せずに新しいテストを実装できない場合にのみリファクタリングします。 – alex2k8

+0

パターンの3番目のステップの考え方は、テストが合格したのでコードを改善することです。テストが実施されているので、これは安全に行うことができます。次のテストを書くためだけのリファクタリングに関しては、コンパイラ自体が失敗テストの1つの側面です。テスト用のコードを記述し、それが "失敗"(つまりコンパイルしていない)のを見てから、コードをリファクタリングしてコンパイルします。 – Scott

9

テストをパスしている間にかなり醜いコードを書くことができます。リファクタリングは動作しないためではありませんが、それはあまりメンテナンスできません。それがポイントです。

いくつかのテストに合うようにコードを書いた後で、より大きな画像を撮り始めることができます。これらのコードの間に重複があり、重複を取り除くことができますか?

+0

Hm。息をする。 – alex2k8

+0

リファクタリングは、コードが機能していないときやコードレビュー後にコードが「嗅ぐ」ときに行われることにも注意してください。だから、テストパスを作るコードを書いて、臭いを感じる - リファクタリング。 –

1

パフォーマンスを向上させる必要があることをトリガーとするリファクタリング以外は、テストを合格するコードを書いている間に、私はコードを共有できる場所、またはより良い、よりエレガントな方法で実現します。この時点で、テストに合格するコードを完成させ、すべてのテストが合格していることを確認してから、リファクタリングを行って戻ります。これはあなたが書き込んだ正確なコードを含むかもしれないし、そうでないかもしれませんが、それは新しいコードを書いている間に気がついたかもしれません。

時々、私はリファクタリングできるものを書き留めますが、私が今作業しているものがより重要であると判断します。その時点で、後でリファクタリングする際の問題に気付くでしょう。最終的に、そのリファクタリングは次の機能と同じくらい重要になり、赤/緑/リファクタ・サイクルのリファクタ・フェーズで完了します。この場合、おそらく私が働いていたものとは無関係です。

1

メジャーリリースの前に1週間または2週間以外のリファクタリングに時間がかかりますか?

+0

Hehe、私はこれが他のモデルにつながると思います:[Refactor] - > Test - > [Refactor] - > Code - > [Refactor] – alex2k8

+1

リファクタリングに悪い時間はありません。あなたが変更を行う前に何かを壊していないことを証明してください。 現在のプロジェクトで必要とされているように、リファクタリングのみを行い、決して新しい機能を追加しない場合は、唯一悪いです。 – quamrana

+0

あなたのテストが本当にすべてをカバーしていると仮定します。私はリリースサイクルの開始に大きなリファクタリングを残すことを好む。私はそれが危険ではないと思う。 –

関連する問題