如何优化这段代码

本文关键字:代码 段代码 优化 何优化 | 更新日期: 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();
}