簡體   English   中英

突破父功能?

[英]Break out of parent function?

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

這將確保除非需要,否則不會創建新的數據上下文(避免意外忘記在父方法中添加返回行)。

嵌套方法不可能從父方法返回。 您可以在GetUncachedRecordIDs內執行一些未處理的ExceptionGetUncachedRecordIDs此問題,但不應這樣做,因此會造成混亂。 而且,它非常慢。

另一個不建議使用的機制是使用goto魔術。 這也會引起混亂,因為goto允許程序執行流程中發生意外行為。

最好的選擇是返回帶有簡單bool HasUncachedRecordIDs字段的Result對象,然后進行檢查。 如果通過,則返回。 此解決方案解決了調用方法的問題,這種情況下為Any()

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

我之所以缺乏該語言的功能,是因為基本上在任何函數中調用GetUncachedRecordIDs都會意外終止該父函數,而不會發出警告。 而且,它將緊密地纏繞兩個功能,並且最佳編程實踐涉及類和方法的松散耦合。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM