2

我正在努力在我的 C# 应用程序中实现业务逻辑。我无法将逻辑拟合到一段理智的代码中。实现的逻辑是这样的:

有一棵元素树,比如说:项目、国家、地区、城市。单个项目包含国家。国家包含地区,地区包含城市,城市包含数据条目。我们将根据可用信息使用数据条目填充元素。

  • 如果CountryRegionCity信息可用,则将数据推送到项目并使用该信息知道在哪里插入数据条目。
  • 如果国家信息不可用,则创建一个新国家并使用地区城市信息插入数据条目。
  • 如果只有城市信息可用,请在新国家/地区内创建一个新区域并使用城市信息将数据放在那里。
  • 如果没有可用信息,请在新国家/地区内的新区域内创建新城市并将数据放在那里
  • 如果任何信息不可用(例如CountryRegion可用但City不可用),我们必须回退到更一般的情况(在这种情况下创建新的CountryRegionCity)。

此外:

  • 创建叶类时,必须在构造函数中提供父类。
  • 查询可用的信息是昂贵的。
  • 我想避免重复创建新类的代码。
  • 我不能改变类的实现Country,,。RegionCity

我下面的解决方案有效,但它很丑陋,使用整数来控制应用程序流让我不寒而栗。

如何改进下面的代码片段?

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 回答