如何在实现业务逻辑时避免使用数字或枚举

时间:2012-04-21 19:17:02

标签: c#

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

有一个元素树,比方说:项目,国家,地区,城市。单个项目包含国家/地区。国家/地区包含Regions,Region包含Cities和Cities包含数据条目。我们将根据可用的信息填充数据条目元素。

  • 如果国家/地区地区城市信息可用,请将数据推送到项目并使用信息知道要插入的位置数据条目。
  • 如果国家/地区信息不可用,请创建新的国家/地区并使用地区城市信息进行插入数据条目。
  • 如果只有城市信息可用,请在新的国家/地区中创建新的区域,并使用城市信息将数据放入其中。
  • 如果没有可用信息,请在新的国家/地区中的新区域内创建新的城市,并将数据放在那里。
  • 如果无法提供任何信息(例如国家地区可用,但城市),我们必须退回更一般的情况(在这种情况下创建新的国家地区城市)。

此外:

  • 创建叶类时,必须在构造函数中提供父类。
  • 查询可用信息的费用很高。
  • 我想避免重复创建新类的代码。
  • 我无法更改类CountryRegionCity的实现。

我的解决方案可行,但它很丑陋并且使用整数来控制应用流程让我感到不安。

如何改进下面的代码段?

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`...

1 个答案:

答案 0 :(得分: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();
}