私はC#アプリケーションにcomeビジネスロジックを実装することに取り組んでいます。ロジックを適切なコードに適合させるのに問題があります。実装するロジックは次のようになります。
たとえば、プロジェクト、国、地域、都市などの要素のツリーがあります。1つのプロジェクトに国が含まれます。国には地域が含まれ、地域には都市が含まれ、都市にはデータエントリが含まれます。利用可能な情報に基づいて、要素にデータエントリを入力します。
- 国、地域、および都市の情報が利用可能な場合は、データをプロジェクトにプッシュし、その情報を使用してデータエントリを挿入する場所を確認します。
- 国情報が利用できない場合は、新しい国を作成し、地域と都市の情報を使用してデータエントリを挿入します。
- 都市情報のみが利用可能な場合は、新しい国の中に新しい地域を作成し、都市情報を使用してそこにデータを配置します。
- 情報がない場合は、新しい国の新しい地域内に新しい都市を作成し、そこにデータを配置します。
- 情報が順不同で利用できない場合(たとえば、国と地域は利用できるが市は利用できない)、より一般的なケースにフォールバックする必要があります(この場合は新しい国、地域、都市を作成します)。
さらに:
- リーフクラスを作成するときは、コンストラクターで親を指定する必要があります。
- 利用可能な情報について問い合わせるのは費用がかかります。
- 新しいクラスを作成するコードを繰り返さないようにしたいと思います。
- クラスの実装を変更することはできませ
Country
んRegion
、、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`...