0

私は数週間、Test Driven Development: By Exampleを読んでいます。今、私は第 31 章 - リファクタリングに固執しました。私の質問は、183 ページのデータの移行に関するものです。このトピックがわかりません。についての例TestSuiteも、これを理解するのに役立ちません。

移行データの意味と、TDD での使用方法を知りたいです。


[更新]本 Migrate Dataのコンテンツ

1 つの表現からどのように移行しますか? データを一時的に複製します。

方法: これは、内部から外部へのバージョンです。ここでは、表現を内部で変更してから、外部から見えるインターフェイスを変更します。

  • 新しい形式でインスタンス変数を追加する
  • 古いフォーマットを設定するすべての場所に新しいフォーマット変数を設定します
  • 古い形式を使用するすべての場所で、新しい形式変数を使用します
  • 古いフォーマットを削除する
  • 新しい形式を反映するように外部インターフェイスを変更します

ただし、最初に API を変更したい場合もあります。次に、次のことを行う必要があります。 - 新しい形式でパラメーターを追加する - 新しい形式パラメーターから古い形式の内部表現に変換する - 古い形式パラメーターを削除する - 古い形式の使用を新しい形式に置き換える - 古い形式を削除する

理由: 1 対多では、毎回データ移行の問題が発生します。One to Many を使用して TestSuite を実装したいとします。以下から始めます。

def testSuite(self):
suite= TestSuite()
suite.add(WasRun("testMethod"))
suite.run(self.result)
assert("1 run, 0 failed" == self.result.summary())

これは (One to Many の「One」部分で) 以下によって実装されます。

class TestSuite:
def add(self, test):
self.test= test
def run(self, result):
self.test.run(result)

次に、データの複製を開始します。まず、テストのコレクションを初期化します。

TestSuite
def __init__(self):
self.tests= []
Everywhere “test” is set, we add to the collection, too:
TestSuite
def add(self, test):
self.test= test
self.tests.append(test)

ここでは、単一のテストの代わりにテストのリストを使用します。現在のテスト ケースでは、これはリファクタリングです (セマンティクスを保持します)。これは、コレクション内に要素が 1 つしかないためです。

TestSuite
def run(self, result):
for test in self.tests:
test.run(result)

現在使用されていないインスタンス変数「test」を削除します。

TestSuite
def add(self, test):
self.tests.append(test)

Java の Vector/Enumerator から Collection/Iterator に移行する場合のように、プロトコルが異なる同等のフォーマット間を移行する場合にも、段階的なデータ移行を使用できます。

4

1 に答える 1

1

これは、データの表現方法を変更するリファクタリングです。

本に書かれているように例は 1 つから複数への移行です。たとえば、シナリオを 1 つのテストで機能させた後、N 個のテストを処理できるようにそれを改善したいとします。したがって、たとえばデータ表現を Test インスタンス変数から に変更 (移行) する必要がありますList<Test>。この変更は、インサイド アウトまたはアウトサイド インのアプローチで段階的に行うことができます。

  • アウトサイド イン (推奨) - 新しい表現で既存の API に追加のパラメーターを追加します (たとえば、パラメーターをプリミティブからカスタム構造に変更します)。すべてのクライアントをコンパイルします。API の内部を再配線して、古いパラメーターが使用されている新しいパラメーターを使用します (別のオプションは、両方を一時的に使用するように複製することです)。すぐに、古い (プリミティブ) パラメータが使用されなくなったことが IDE に表示されるはずです。その時点で、そのパラメータを安全に削除できます。アイデアは、すべてのリファクタリングを通じて、コードの動作を維持することです。
于 2012-07-03T06:34:59.590 に答える