打破父功能?

时间:2016-10-31 12:10:46

标签: c# function return

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方法?

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

2 个答案:

答案 0 :(得分:1)

嵌套方法无法从父方法返回。 你可以在Exception里面做一些未处理的GetUncachedRecordIDs,这样做就可以了,但不应该这样做,所以它会造成混乱。而且,它很慢。

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

最佳选择将返回包含简单Result字段的bool HasUncachedRecordIDs对象,然后进行检查。如果它通过,然后返回。此解决方案解决了调用方法的问题,在这种情况下为Any()

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

我在语言中缺少此功能的原因是,基本上任何函数调用GetUncachedRecordIDs会意外地结束该父函数,而不会发出警告。此外,它将两个函数密切相关,最佳编程实践涉及类和方法的松散耦合。

答案 1 :(得分:0)

您可以将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())
        {
             // ...
        }
    });    

}