LedgerSMBのリファクタリングの経験をお伝えします。私たちは早い段階で物事を別の方法で行うことを決定しましたが、まだあなたが説明したとおりにしていますが、多くの接着方法はありません(いくつかの接着方法がありますが、多くはありません)。
2つのコードベースのある生活
LedgerSMBは2つのコードベースで約5年間存続しましたが、古いコードベースが削除されるまでにさらに数年かかります。古いコードベースは、見るべき本当の恐怖です。悪いdb設計、Perl IS->some_func(\%$some_object);
は、スパゲッティメタファーがときどき使用される理由を正確に示すコードと同様に構築します(実行パスは、モジュール間で、また言語間で、韻も理由もなく蛇行しています)。新しいコードベースでは、dbクエリをストアドプロシージャに移動したり、要求を処理するためのよりクリーンなフレームワークを使用するなどして、これを回避しています。
私たちが最初に決めたのは、モジュールごとにモジュールをリファクタリングすることでした。これは、特定の領域のすべての機能を新しいモジュールに移動し、古いコードを新しいモジュールにフックすることを意味します。新しいAPIがクリーンであれば、これは大した問題ではありません。新しいAPIが毛深いものではない場合、それは新しいAPIで少し一生懸命働くことへの招待です。
2つ目は、新しいコードが古いコードのロジックにアクセスしなければならない場合が多いことです。これは、extentい接着剤メソッドにつながるため、可能な限り回避する必要がありますが、常に回避できるとは限りません。この場合、接着方法は最小限に抑え、可能な限り回避する必要がありますが、必要に応じて使用します。
これを機能させるには、特定の領域のすべての機能の書き換えをコミットする必要があります。たとえば、すべての顧客情報追跡コードを一度に書き換えることができる場合、つまり、古いコードからこれを呼び出すコードは扱いにくくなり、新しいコードから古いコードへのディスパッチは最小限に抑えられます。
2つ目のことは、適切な抽象化を自分の場所に持っている場合、呼び出すAPIのレベルとそのクリーンな状態を維持する方法を選択できる必要があるということです。ただし、APIを呼び出している部分を書き直して、かなりきれいになるように検討する必要があります。
ビジネスツールには、還元できないほど複雑な領域が数多くあります。すべての複雑さを取り除くことはできません。ただし、特に必要なことを実行するクリーンなAPIと、そのAPIを建設的に利用するモジュールに焦点を当てることで管理できます。Glueは、残りの呼び出しコードの書き換えが高速になる可能性があることを考慮した場合にのみ、最後の手段となるはずです。