0

この種の設計が正しいか、間違っているか、またはその両方かを知りたいです。
複数のコンポーネント (オブジェクト) を持つアプリがあり、それぞれに構成 (フラグ、機能など) があります。いつでも、オブジェクトから構成を取得したいと考えています。
そのために、私はこれをしました:

class ConfigRetriever {
    public String getConfigString() {
        String configString = "";   
        configString += "component 1 flag : "+component1.getFlag()+"\n";
        configString += "component 2 flag : "+component2.getFlag()+"\n";
        // ...
        return( configString );
    }
}

他の場所で、構成が必要な場合:

class SomeClass {
    public void someMethod() {
        ConfigRetriever configRetriever = new ConfigRetriever(); 
        String configString = configRetriever.getConfigString();
            // Do some stuff with configString...
    }
}

私はオブジェクト プログラミングにまったく慣れていませんが、特定の 1 つのアクションだけのためにオブジェクト (ConfigRetriever) を作成するのは奇妙に感じます (オブジェクトが他のことを実行できる場合でも)。
私はシングルトンパターンについても考えましたが、次のようなものがあります:

String configString = ConfigRetriever.getInstance().getConfigString();

きれいな線ですが、オブジェクトはアプリの最後までメモリに残るため、何が正しくて何が間違っているのかよくわかりません。

私のデザインはもっと良くなるでしょうか?どのように ?なんで ?

更新
回答ありがとうございます。私の質問は少し乱雑で、私が求めていたものについての要点を逃したと思います.
構成とコンポーネントのストーリー全体は、私が扱っている状況の例としてここにあります。これは簡単で汚いコードであり、警告する必要がありました。本当の問題は、「オブジェクトのメソッドの 1 つにアクセスするために、オブジェクトを 1 回だけ (または時々) 作成するのは良いことなのか?」ということでした。さて、あなたの回答を読んでもう一度考えてみると、「それはあなたの目標、クラス、責任などに依存します...」というのが正しい答えのよう
です。オブジェクトに情報を保存しますか? 静的メソッドにすることはできません。
永久メモリを使用するシングルトンは問題ですか? ほとんどの場合、グローバルな状態でオブジェクトをメモリ内に維持する正当な理由が必要だと思うからです。したがって、ほとんどの場合、シングルトンはありません。

最後に、いつかオブジェクトをインスタンス化するために使用するクラスを作成するのは問題ですか? そうではありません、がんばってください!:-)

4

3 に答える 3

1

方法についてはまだ誰も言及staticしていません。典型的な Java パターンは、クラスのインスタンスを持たずにクラス化する静的メソッドを使用することです。何かのようなもの:

class ConfigRetriever {
   public static String getConfigString() {
      StringBuilder sb = new StringBuilder();
      sb.append("component 1 flag : ").append(component1.getFlag()).append('\n');
      sb.append("component 2 flag : ").append(component2.getFlag()).append('\n');
      // ...
      return sb.toString();
   }
}

したがって、これにより、次のようなことができます。

// call the static method on the class, not on an instance
String configString = ConfigRetriever.getConfigString();

インスタンスがないため、状態をConfigRetriever. component1component2オブジェクトがどこから来たのかわかりません。

実際に内部で複数のクラスを使用するメソッドよりもはるかに効率的なクラスgetConfigString()を使用するようにメソッドを変換したことに注意してください。StringBuilder()+= StringBuilder

于 2012-09-28T18:42:40.987 に答える
1

ここにシングルトンを用意する必要はないと思います。

1 回の操作でオブジェクトを作成するのはおかしなことではありませんが、そのメソッドを頻繁に呼び出すと効率が悪い可能性があります。あなたができる最善のことは、依存性注入を使用することだと思います:

class SomeClass {
    private final ConfigRetriever retriever;
    public SomeClass(ConfigRetriever retriever) {
        this.retriever = retriever;
    }
    public void someMethod() {
        // use this.retriever here
    }
}
于 2012-09-28T17:22:55.497 に答える
0

いくつかの問題 -
A. 元のコードには、getConfigString という名前の void を返すメソッドがあります。これは修正する必要があります。
B. また、コンポーネントが ConfigRetriever クラスのどこに提供されているかが明確でない。
C. 選択できるいくつかのオプションがあります

。 1. Component 階層に一致する ConfigProvider クラス階層を持つ -
ComputerComponent という名前のクラスがある場合は、一致する ComptuerConfigProider があります。
Component クラスで ConfigProider getConfigProvider メソッドを使用することを検討してください。

public abstract class Component {
   public abstract ConfigProvider getConfigProvider()'
}

そして、具象クラスは次のようになります。

public class ComputerComponent extends Component {
   public ConfigProvider getConfigProvider() { 
       return new ComputerConfigProvider(this);
   }
}




2. 最初のソリューションと似ていますが、単一の ConfigProvider クラスがあり、構成コンポーネントを追加するメソッドがあります。
たとえば、ConfigurationProvider が単にキーと値のマップを保持しているとします。
この場合のコードは次のようになります。

public class ConfigProvider {

    private Map<String,String> internalMap = new HashMap<String,String>();
    public String getConfigProvider() {
      //Return a string representation of the internal map
    }

    public ConfigProvider addConfigElement(String key,String value) {
        map.put(key,value); 
        return this;
    }
}

public class ComputerComponent extends Component {
    private int memory;
    private String cpu;
    public ConfigProvider getConfigProvider() {
       ConfigProvider configProvider = new ConfigProvider();
       return configProvider.addConfigElement("memory",Integer.toString(memory)).
       addConfigElement("cpu",cpu);
    } }




3. それでもシングルトーンを使用したい場合
- 構成はコンポーネントの状態に依存するため、getConfigProvider を「ステートレス」メソッドにしない限り、構成プロバイダーのシングルトーンを使用するのは間違っています -

String getConfigString(Component component)

ただし、この場合、シングルトーンを使用するのではなく、単に静的メソッドを使用することを検討すると、コードは次のようになります。

public class ConfigurationProvider {
   public static String getConfigString(Component component) {
     StringBuilder sb = new StringBuilder();
     //Append the component values to the string builder
     return sb.toString();
   }
}
于 2012-09-28T17:32:20.270 に答える