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
方法?
这将保证不会创建新的数据上下文,除非需要(不要忘记在父方法中添加返回行)。
答案 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())
{
// ...
}
});
}