2014-10-02 56 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(); 
}