2014-10-02 86 views
0

我有下面的代碼:如何優化這段代碼?

protected StoreDetailModel GetSelectedStore() 
    { 
     if (StoresWithDepartmentType != null && StoresWithDepartmentType.Any()) 
     { 
      StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore(); 

      if (currentUserStore != null && currentUserStore.Item != null) 
      { 
       StoreDetailModel store = 
        StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID ==  
               currentUserStore.Item.ID); 
       if (store == null) 
       { 
        store = StoresWithDepartmentType.First(); 
       } 
       return store; 
      } 
     } 
     return null; 
    } 

條件太多了讓這段代碼幾乎沒有可讀性。我如何優化它並使其更清晰?

+3

這是更多的代碼審查的問題。 – 2014-10-02 09:28:38

+1

更多關於代碼審查的問題..但是我不會說代碼是不可讀的說實話。 – BenjaminPaul 2014-10-02 09:28:57

+1

根據是否預期空引用,可以拋出異常並集中處理錯誤。 – 2014-10-02 09:30:07

回答

0

你可以寫的

return StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == currentUserStore.Item.ID) ?? StoresWithDepartmentType.First(); 

代替

StoreDetailModel store = 
       StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID ==  
              currentUserStore.Item.ID); 
      if (store == null) 
      { 
       store = StoresWithDepartmentType.First(); 
      } 
      return store; 

但有些人不喜歡這樣。如果有必要的話,他們不會打擾我。

+0

這是個好主意 – zoidbergDr 2014-10-02 09:34:14

0

您的代碼期望返回當前用戶存儲,或者如果找不到,則返回null。它可以簡化如下。

protected StoreDetailModel GetSelectedStore() 
{ 
    if (StoresWithDepartmentType == null) return null; // There are no stores 

    // Get the user store or return the first available store 
    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore(); 
    return currentUserStore ?? StoresWithDepartmentType.First(); 
} 

如果沒有需要查找的商店,則無法返回任何商店。

否則返回用戶的商店,或者如果找不到用戶的商店,則返回第一個可用商店。

簡化工作原理是因爲StoresWithDepartmentType上的查找似乎返回相同的對象。

+0

但是在'return currentUserStore'中我會得到'currentUserStore',但是我需要'StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == currentUserStore.Item.ID)'... – zoidbergDr 2014-10-02 09:44:18

+0

@zoidbergDr什麼是由'WebsiteContext.GetCurrentUserStore()'和'StoreWithDepartmentType.FirstOrDefault()'返回的'StoreDetailModel'之間的區別嗎?它們看起來是相同的類型。 – Kami 2014-10-02 09:49:19

0

沒有必要嵌套if塊,所以我扁平結構的可讀性。

最後'返回'聲明行來自artm的答案。

protected StoreDetailModel GetSelectedStore() 
{ 
    if (StoresWithDepartmentType == null || !StoresWithDepartmentType.Any()) 
    { 
     return null; 
    } 

    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore(); 
    if (currentUserStore == null || currentUserStore.Item == null) 
    { 
     return null; 
    } 

    return StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == currentUserStore.Item.ID) ?? StoresWithDepartmentType.First(); 
} 
0

我會把它分成許多有名的方法。

這不會編譯(因爲我不知道你正在使用的類型),但希望它會給你的想法:

protected StoreDetailModel GetSelectedStore() 
{ 
    if (anyStoresWithDepartmentType()) 
     return storeWithCurrentlySelectedItem(); 

    return null; 
} 

private bool anyStoresWithDepartmentType() 
{ 
    return (StoresWithDepartmentType != null) && StoresWithDepartmentType.Any(); 
} 

private StoreDetailModel storeWithCurrentlySelectedItem() 
{ 
    var itemId = currentUserStoreItemId(); 

    if (itemId == null) 
     return null; 

    return storeWithItem(itemId); 
} 

private StoreItemId currentUserStoreItemId() 
{ 
    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore(); 

    if (currentUserStore != null && currentUserStore.Item != null) 
     return currentUserStore.Item.ID; 

    return null; 
} 

private StoreDetailModel storeWithItem(StoreItemId itemId) 
{ 
    StoreDetailModel store = StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == itemId); 

    if (store != null) 
     return store; 

    return StoresWithDepartmentType.First(); 
}