【问题标题】:Break out of parent function?突破父函数?
【发布时间】:2017-03-13 12:30:30
【问题描述】:
public static void CacheUncachedMessageIDs(List<int> messageIDs)
{
    var uncachedRecordIDs = LocalCacheController.GetUncachedRecordIDs<PrivateMessage>(messageIDs);
    if (!uncachedRecordIDs.Any()) return;

    using (var db = new DBContext())
    {
         .....
    }
}

上述方法在整个项目中定期重复(传入不同的泛型除外)。我希望避免重复使用 if (!uncachedRecordIDs.Any()) return; 行。

简而言之,是否可以让LocalCacheController.GetUncachedRecordIDs 返回CacheUncachedMessageIDs 方法?

这将保证除非需要,否则不会创建新的数据上下文(防止意外忘记在父方法中添加返回行)。

【问题讨论】:

    标签: c# function return


    【解决方案1】:

    嵌套方法不可能从父方法返回。 您可以在GetUncachedRecordIDs 中执行一些未处理的Exception,这样可以解决问题,但是不应该这样做,因此会造成混乱。而且速度很慢。

    另一个不建议机制是使用一些goto 魔法。这也会产生混淆,因为goto 允许程序执行流程中出现意外行为。

    您的最好的选择是返回一个带有简单bool HasUncachedRecordIDs 字段的Result 对象,然后检查它。如果通过,则返回。该方案解决了调用方法的问题,本例为Any()

    var uncachedRecordIDsResult = LocalCacheController.GetUncachedRecordIDs<PrivateMessage>(messageIDs);
    if(uncachedRecordIDsResult.HasUncachedRecordIDs) return;
    

    我认为语言中缺少此功能的原因是,在基本上 any 函数中调用 GetUncachedRecordIDs 会意外地结束该父函数,而不会发出警告。此外,它将两个功能紧密地交织在一起,并且最佳编程实践涉及类和方法的松散耦合。

    【讨论】:

    • 谢谢,你是对的,返回一个对象是要走的路!
    • 如果你无论如何都要检查结果,我会保持代码原样,因为它使你想要从标准返回的方法更清楚。换句话说,你并没有真正通过 if (uncachedRecordIDs.ShouldReturn) return;if (!uncachedRecordIDs.Any()) return; 保存任何代码。
    • 要明确:当前代码对我的解读是“如果没有任何未缓存的记录则返回”,这对我来说比“如果我应该返回则返回”更容易阅读。
    • @LasseV.Karlsen 我同意ShouldReturn 是垃圾,将其更改为HasUncachedRecordIDs。我认为这太明确了,但应该没问题。
    【解决方案2】:

    您可以将 Action 传递给您的 GetUncachedRecordIDs 方法,只有在需要时才调用该方法。想法的粗略草图:

    // LocalCacheController
    void GetUncachedRecordIDs<T>(List<int> messageIDs, Action<List<int>> action)
    {
        // ...
        if (!cached) {
            action(recordIds);
        }
    }
    
    // ...
    
    public static void CacheUncachedMessageIDs(List<int> messageIDs)
    {
        LocalCacheController.GetUncachedRecordIDs<PrivateMessage>(messageIDs, uncachedRecordIDs => {
            using (var db = new DBContext())
            {
                 // ...
            }
        });    
    

    }

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多