まず、新しいAPIを作成します。これは、新しいAPIの動作にしたいことを行います。この新しいAPIの名前が古いAPIと同じである場合は、新しいAPI名に_NEWという名前を追加します。
int DoSomethingInterestingAPI();
になる:
int DoSomethingInterestingAPI_NEW(int takes_more_arguments); int DoSomethingInterestingAPI_OLD(); int DoSomethingInterestingAPI(){DoSomethingInterestingAPI_NEW(whatever_default_mimics_the_old_API); OK-この段階では、DoSomethingInterestingAPI()という名前を使用して、すべての回帰テストがパスします。
次に、コードを調べて、DoSomethingInterestingAPI()へのすべての呼び出しをDoSomethingInterestingAPI_NEW()の適切なバリアントに変更します。これには、新しいAPIを使用するために変更する必要がある回帰テストの部分の更新/書き換えが含まれます。
次に、DoSomethingInterestingAPI_OLD()を[[deprecated()]]としてマークします。必要な限り、非推奨のAPIを使用し続けます(それに依存する可能性のあるすべてのコードを安全に更新するまで)。
このアプローチでは、回帰テストの失敗は、単にその回帰テストのバグであるか、コードのバグを特定するだけです。この_NEWおよび_OLDバージョンのAPIを明示的に作成することにより、APIを改訂するこの段階的なプロセスにより、しばらくの間、新しいコードと古いコードの一部を共存させることができます。
実際のこのアプローチの良い(難しい)例がここにあります。関数BitSubstring()がありました-ここでは、3番目のパラメーターをサブストリング内のビットのCOUNTにするというアプローチを使用していました。C ++の他のAPIやパターンとの一貫性を保つために、関数の引数として開始/終了に切り替えたいと思いました。
https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0
新しいAPIを使用して関数BitSubstring_NEWを作成し、それを使用するようにすべてのコードを更新しました(BitSubStringへの呼び出しはありません)。しかし、私はいくつかのリリース(月)で実装を残し、廃止予定としてマークしました。したがって、誰もがBitSubString_NEWに切り替えることができます(その時点で、引数をカウントから開始/終了スタイルに変更します)。
その後-その遷移が完了したら、BitSubString()を削除してBitSubString_NEW-> BitSubString()の名前を変更し、BitSubString_NEWという名前を廃止しました。