我有以下代码:
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;
}
太多ifs使这段代码难以理解。如何优化它并使其更清晰?
答案 0 :(得分: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;
但有些人并不喜欢这样。如果看起来是必要的,那么他们就不会打扰我。
答案 1 :(得分: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
上的查找似乎返回相同的对象。
答案 2 :(得分:0)
没有必要嵌套if-blocks,所以我将结构弄平以便于阅读。
最后一行'返回'声明来自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();
}
答案 3 :(得分: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();
}