2012-04-21 66 views
2

我正在實現在我的C#應用​​程序中使用商業邏輯。 我無法將邏輯合理化爲一段合理的代碼。 執行的邏輯是這樣的:如何在實現業務邏輯時避免使用數字或枚舉

有一個元素樹,讓我們說:項目,國家,地區,城市。一個項目包含國家。國家包含地區,包含城市和城市的地區包含數據條目。我們將根據可用信息填充具有數據條目的元素。

  • 如果國家地區資料齊全,數據推到項目和使用信息,以知道在哪裏插入數據項。
  • 如果國家信息不可用,創建一個新的國家和使用地區信息插入數據項。
  • 如果只是城市的信息是可用的,創建一個新的地區國家內使用信息把數據存在。
  • 如果沒有信息可用,創建一個新的地區內新國家內,並把那裏的數據。
  • 如果任何信息,不提供出的順序(例如國家地區也有,但不是),我們必須退回到更一般的情況下(創建新國家地區在這種情況下城市)。

此外:

  • 當你創建一個類的葉子,你必須提供在構造父。
  • 查詢哪些信息可用是昂貴的。
  • 我想避免重複創建新類的代碼。
  • 我無法更改類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`... 
+0

對不起,在這裏應該做的級別整數是多少? – Sinaesthetic 2012-04-21 19:27:00

+0

哦,我明白了,它只是確定可用信息的最高級別? – Sinaesthetic 2012-04-21 19:30:25

+0

未來,我會建議您在課堂結構中使用作文。城市應該是地區的一個屬性,地區是國家的一個屬性,國家是項目的一個屬性。這樣,你可以通過將它們全部加載到列表中並使用頂級類中定義的行爲(Project;即:var population = ProjectList.Where(i => i.Country ==「Uraguay」)來控制它們, ).Country.Region.City.Population;或ProjectList.Where(i => i.Country ==「USA」)。AddPhoto(img); – Sinaesthetic 2012-04-21 19:42:14

回答

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(); 
} 
+0

請注意,構造函數需要對高一級的元素的引用,所以上面的代碼將不起作用,但我可以重新排列if並使用布爾值來跟蹤需要被創建,像你一樣。 另外:是的,我犯了一個錯誤!它不應該是'@ class',它應該是'city'。我正在學習我的代碼,以便在我的項目領域之外更容易理解。 – Dominik 2012-04-21 19:54:36

+0

'City'的構造函數將失敗,因爲'region'未初始化或爲null。 – Dominik 2012-04-21 20:18:09

+0

@Dominik好的,編輯它。城市,國家和地區在哪裏初始化?在Is()方法中?這就是我最後一次編輯的方式。 – 2012-04-21 20:41:54