5

次のような一連のオブジェクトを考えてみましょう。

Earth->Continent->Country->City->name

Earth.classhasも考えてみましょうpublic static void main(String[] args)

アプリケーションがコマンド ライン オプションで実行される場合、たとえば、中間パラメータを導入せずにオブジェクトBarcelonaに渡す最良の方法は何でしょうか?City

オブジェクトは、プログラム実行中のさまざまな段階で作成されます。

name変数を静的にするか、Spring や Google Guice などの IoC を使用する必要がありますか? 他のオプションはありますか?

どんなアイデアでも大歓迎です。

4

3 に答える 3

2
  • この仕事には IOC が最適です。IOC が都市を構築するときに依存関係を渡すようにします。
  • 別の方法: 値を照会できる静的サービス レジストリを使用します。市は、サービス レジストリからその名前を取得できます。
  • 代替案: 階層に複合パターンを実装します。これには、都市を返す可能性がある find などの関数が含まれます。次に、クエリと設定を行うだけですearth.find(BarcelonaID).setName(args[0]);

PicoContainer の IoC ソリューションがどのように見えるかの例:

PicoContainer container = new DefaultPicoContainer();
container.addComponent(Earth.class);
container.addComponent(Continent.class);
container.addComponent(Country.class);
container.addComponent(City.class, new ConstantParameter(cityName));

City barcelona = container.getComponent(City.class);
于 2012-05-05T16:40:16.977 に答える
2

大陸が都市を構築するトップダウンからデータ構造を構築することも、都市を構築してそれを国に渡すボトムアップからmain構築することも、いくつかの組み合わせを使用して構築することもできます。DI は後者を支持します。

public static void main(String... argv) {
  // Bottom up.
  City city = new City(/* args relevant to city */);
  Country country = new Country(city, /* args relevant to country */);
  Continent continent = new Continent(country, /* args relevant to continent */);
  Planet planet = new Planet(continent, /* args relevant to planet */);
}

class City {
  City(/* few parameters */) { /* little work */ }
}
class Country {
  Country(/* few parameters */) { /* little work */ }
}
...
class Planet {
  Planet(/* few parameters */) { /* little work */ }
}

これは、トップダウンよりもはるかにクリーンです。

public static void main(String... argv) {
  // Top down.
  Planet earth = new Planet(
    /* all the parameters needed by Earth and its dependencies. */);
}
class Planet {
  Planet(/* many parameters */) { /* lots of work */ }
}
...

DI 関係者は、ボトムアップ構造は保守性とテスト性に優れたコードにつながると主張していますが、それを使用するために DI フレームワークは必要ありません。

于 2012-05-05T16:41:23.900 に答える
1

私の考えでは、これはビジターパターンで想像できる最良のユース ケースです。基本的に、Parametersすべてのパラメーターを保持する必要がある 1 つのクラスが必要です。1 セットのパラメーターを必要とするすべてのオブジェクトは、そのParametersクラスでアクセスできます。次に、オブジェクトは、使用するパラメーターとその方法を知っている子にパラメーターを渡すことができます。あなたの場合、これは次のように行うことができます:

public interface IParameterized{
   public void processParameters(Parameters param);
}

public class Earth implements IParameterized{
   public Earth(){
      // Create all countries here and store them in a list or hashmap 
   }
   public void processParameters(Parameters param){
      // find the country you want and pass the parameters to it
      country.processParameters(param);
   }
} 

public class Country implements IParameterized{
   public Country(){
      // Create all cities that belong to this country
   }
   public void processParameters(Parameters param){
      // find the city you want and pass the parameters to it
      city.processParameters(param);
   }
} 

public class City implements IParameterized{
   public City(){
      // Create city...
   }
   public void processParameters(Parameters param){
      // Do something with the parameter
   }
}

編集 ドットを接続するには、これを次のように使用できます。

public static void main(String... argv) {
     Parameters params = new Parameters();
     // Populate params from the command line parameters
     Earth earth = new Earth();

     // Earth takes the responsibilty of processing the parameters
     // It will delegate the processing to the underlying objects in a chain
     earth.processParameters(params);
}

ちなみに、Chain Of Responsibility設計パターンも参照してください。

于 2012-05-05T16:50:22.577 に答える