2

私はC#アプリケーションにcomeビジネスロジックを実装することに取り組んでいます。ロジックを適切なコードに適合させるのに問題があります。実装するロジックは次のようになります。

たとえば、プロジェクト、国、地域、都市などの要素のツリーがあります。1つのプロジェクトに国が含まれます。国には地域が含まれ、地域には都市が含まれ、都市にはデータエントリが含まれます。利用可能な情報に基づいて、要素にデータエントリを入力します。

  • 地域、および都市の情報が利用可能な場合は、データをプロジェクトにプッシュし、その情報を使用してデータエントリを挿入する場所を確認します。
  • 情報が利用できない場合は、新しい国を作成し、地域都市の情報を使用してデータエントリを挿入します。
  • 都市情報のみが利用可能な場合は、新しいの中に新しい地域を作成し、都市情報を使用してそこにデータを配置します。
  • 情報がない場合は、新しいの新しい地域内に新しい都市を作成し、そこにデータを配置します。
  • 情報が順不同で利用できない場合(たとえば、地域は利用できるがは利用できない)、より一般的なケースにフォールバックする必要があります(この場合は新しい地域都市を作成します)。

さらに:

  • リーフクラスを作成するときは、コンストラクターで親を指定する必要があります。
  • 利用可能な情報について問い合わせるのは費用がかかります。
  • 新しいクラスを作成するコードを繰り返さないようにしたいと思います。
  • クラスの実装を変更することはできませCountryRegion、、City

以下の私の解決策は機能しますが、それは醜く、整数を使用してアプリのフローを制御すると震えます。

以下のコードスニペットを改善するにはどうすればよいですか?

Country country = null;
Region region = null;
City city = null;

int level;

if (!IsCityInfoAvailable())
{
    // we have to make a new country, region and city
    level = 3;
}
else if (!IsRegionInfoAvailable())
{
    // we have to make a new country and region
    level = 2;
}
else if (!IsCountryRegionAvailable())
{
    // we have to make a new country
    level = 1;
}
else
{
    // we have all the info we need
    level = 0;
}

IDataEntryTarget target;

if (level > 0)
{
    country = new Country(Project, "Unnamed Country");
    target = country;
}
if (level > 1)
{
    region = new Region(country, "Unnamed Region", Region.DefaultRegionSettings);
    target = region;
}
if (level > 2)
{
    city = new City(region, "Unnamed City", 0);
    target = city;
}

// ... proceed with data entry code using `target`...
4

1 に答える 1

2

編集:次のように試してください:私が持っている唯一の質問は、都市、地域、国がどこで初期化されているかです。Is()メソッドでは?

Func<Country> GetCountry = () => country ?? (country = new Country(Project, "Unnamed Country"));
Func<Region> GetRegion = () => region ?? (region = new Region(GetCountry(), "Unnamed Region", Region.DefaultRegionSettings));
Func<City> GetCity = () => city ?? (city = new City(GetRegion(), "Unnamed City", 0));

IDataEntryTarget target = null;

if (!IsCityInfoAvailable())
{
    // we have to make a new country, region and city
     target = GetCity();
}
else if (!IsRegionInfoAvailable())
{
    // we have to make a new country and region
    target = GetRegion();
}
else if (!IsCountryRegionAvailable())
{
    // we have to make a new country
    target = GetCountry();
}
于 2012-04-21T19:33:16.743 に答える