如何优化这段代码
本文关键字:代码 段代码 优化 何优化 | 更新日期: 2023-09-27 18:25:28
我有以下代码:
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;
}
太多的if使代码难以阅读。如何优化它并使其更清晰?
您可以编写
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;
但有些人不喜欢这样。如果从外观上看是必要的,它们不会打扰我。
您的代码期望返回当前用户存储,如果找不到,则返回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
上的查找似乎返回了相同的对象。
没有必要嵌套if块,所以为了可读性,我对结构进行了扁平化。
最后一行"return"语句来自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();
}
我会把它分成许多命名良好的方法。
这不会编译(因为我不知道你使用的所有类型),但希望它能给你一个想法:
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();
}