更新12/8:コメントに答える
質問:FileReaderが、すべてのクラスに存在する必要があるLoggingのような非常に基本的なものである場合はどうなりますか。私がそこで同じアプローチに従うことを提案しますか?
場合によります。
そのような大規模なリファクタリングを行う前に、考えたいことがあります。
外に移動した場合、ファイルから読み取り、それらを必要とするすべてのクラスFileReader
に結果を提供できる適切なクラスがありますか?
クラスのテストを簡単にする以外に、他のメリットはありますか?
時間はありますか?
答えのいずれかが「いいえ」の場合は、そうしない方がよいでしょう。
FileReader
ただし、最小限の変更で、すべてのクラス間の依存関係を解消できます。
あなたの質問とコメントから、私はあなたのシステムFileReader
がプロパティファイルからものを読み取るためのグローバルリファレンスとして使用していると仮定し、それをシステムの残りの部分に提供します。
この手法は、MichaelFeathersのすばらしい本「LegacyCodeを効果的に使用する」でも紹介されています。
手順1.FileReader
静的メソッドをインスタンスに委任します。
変化する
public class FileReader {
public static FileReader getMemberOne() {
// codes that read file.
}
}
に
public class FileReader {
private static FileReader singleton = new FileReader();
public static String getMemberOne() {
return singleton.getMemberOne();
}
public String getMemberOne() {
// codes that read file.
}
}
これを行うことにより、静的メソッドはFileReader
現在、getMemberOne()
ステップ2.からインターフェイスを抽出しますFileReader
public interface AppProperties {
String getMemberOne();
}
public class FileReader implements AppProperties {
private static AppProperties singleton = new FileReader();
public static String getMemberOne() {
return singleton.getMemberOne();
}
@Override
public String getMemberOne() {
// codes that read file.
}
}
すべてのメソッドをに抽出し、AppProperties
静的インスタンスをに抽出しFileReader
ますAppProperties
。
ステップ3.静的セッター
public class FileReader implements AppProperties {
private static AppProperties singleton = new FileReader();
public static void setAppProperties(AppProperties prop) {
singleton = prop;
}
...
...
}
FileReaderでシームを開きました。これを行うことで、基になるインスタンスの変更を設定でき、FileReader
気付くことはありません。
ステップ4.クリーンアップ
今FileReader
、2つの責任があります。1つはファイルの読み取りと結果の提供であり、もう1つはシステムのグローバル参照の提供です。
それらを分離して、適切な名前を付けることができます。結果は次のとおりです。
// This is the original FileReader,
// now is a AppProperties subclass which read properties from file.
public FileAppProperties implements AppProperties {
// implementation.
}
// This is the class that provide static methods.
public class GlobalAppProperties {
private static AppProperties singleton = new FileAppProperties();
public static void setAppProperties(AppProperties prop) {
singleton = prop;
}
public static String getMemberOne() {
return singleton.getMemberOne();
}
...
...
}
終わり。
このリファクタリングの後、テストしたいときはいつでも。あなたはモックAppProperties
を設定することができますGlobalAppProperties
このリファクタリングは、多くのクラスで同じグローバル依存関係を解消するだけの場合に適していると思います。