私たちのチームには、さらなるメンテナンスと開発のためのレガシーシステムが与えられています。これは真の「レガシー」なものであるため、テストの数は非常に少なく、ほとんどががらくたです。これはWebインターフェースを備えたアプリであるため、コンテナー管理コンポーネントと、必要に応じていちこちで「新しく」なプレーンJavaクラス(フレームワークなどに関連付けられていない)の両方があります。
このシステムで作業するとき、特定の部分に触れるたびに、すべてのものを小さな断片に分割し、依存関係を検出してリファクタリングし、依存関係をコードにプルするのではなくプッシュしようとします。
私の質問は、そのようなシステムをどのように操作するか、依存関係を破る方法、コードをよりテストしやすくする方法などです。いつ停止し、これにどのように対処するのですか?
例を示しましょう:
public class BillingSettingsAction {
private TelSystemConfigurator configurator;
private OperatorIdDao dao;
public BillingSettingsAction(String zoneId) {
configurator = TelSystemConfiguratorFactory.instance().getConfigurator(zoneId);
dao = IdDaoFactory.getDao();
...
}
// methods using configurator and dao
}
このコンストラクターは間違いなくやりすぎです。また、これをさらにリファクタリングするためにテストするには、PowerMockなどで魔法をかける必要があります。私が行うことは、次のように変更することです。
public BillingSettingsAction(String zone, TelSystemConfigurator configurator, OperatorIdDao dao) {
this.configurator = configurator;
this.dao = dao;
this.zone = zone;
}
または、依存関係のセッターのみをコンストラクター設定ゾーンに提供します。
私が見ている問題は、コンストラクターで依存関係を提供する場合でも、どこかに依存関係を提供する必要があるということです。つまり、問題を1レベル上に移動しているだけです。すべての依存関係を配線するためのファクトリを作成できることは知っていますが、アプリのさまざまな部分に触れると、それぞれに異なるファクトリが発生します。明らかに、すべてのアプリを一度にリファクタリングして、Springなどを紹介することはできません。
セッターの公開(おそらくデフォルトの実装が提供されている)も同様であり、さらにテスト専用のコードを追加するようなものです。
だから私の質問はあなたがそれをどのように扱うかです?オブジェクト間の依存関係を一度に実行せずに、より良く、より読みやすく、テスト可能にする方法は?