“GetOrCreate” - does that idiom have an established name?

后端 未结 5 1289
清歌不尽
清歌不尽 2021-02-12 19:51

Ok, consider this common idiom that most of us have used many times (I assume):

class FooBarDictionary
{
    private Dictionary fooBars;

          


        
相关标签:
5条回答
  • 2021-02-12 20:23

    Lazy Loading

    http://en.wikipedia.org/wiki/Lazy_loading

    0 讨论(0)
  • 2021-02-12 20:27

    It sort of depends why you're doing it - the idiom is one I've seen be called memoization, caching, initialisation on demand, create on first use. Normally I call the method "ensureFoo" rather than "GetOrCreate"

    0 讨论(0)
  • 2021-02-12 20:33

    In C#...

    ... I've got a DefaultingDictionary<> which does about this. As a bonus

    • you can specify a default value or factory function to create values for missing keys:
    • it comes with implicit conversion from IDictionary<> (wrapping the dictionary)
    • it comes with extension methods to morph any dictionary into a DefaultingDictionary<> on the fly

    Full Code:

    • https://gist.github.com/2789882#file_defaulting_dictionary.cs

    The extensions .AsDefaulting can be used to transparently use any IDictionary<> as a defaulting one, so you can opt to use any dictionary (even e.g. obtained from a thirdparty API) as a defaulting one, and the underlying container will be updated with any 'auto-vivified' items.

    Use it like

    IDictionary<string, MyItem> dict = LoadFromDatabase();
    
    // using a fixed value
    SomeFunc(dict.AsDefaulting(defaultItem));
    
    // using an independent generator function
    var defaulting = dict.AsDefaulting(() => new MyItem { Id = System.Guid.NewGuid() });
    
    // using a keydepedent generator function
    var defaulting = dict.AsDefaulting(key => LazyLoadFromDatabase(key));
    

    Some test cases

    are included:

    • https://gist.github.com/2789882#file_defaulting_dictionary_tests.cs
    0 讨论(0)
  • 2021-02-12 20:39

    I always call such functions obtainSomething().

    0 讨论(0)
  • 2021-02-12 20:42

    I'm unsure of overall programming name for the high level pattern, but Perl has this wonderful behavior called Autovivification - namely, automatically creating hash (map) key with undefined value when you're querying the value of non-existing key in the hash.

    0 讨论(0)
提交回复
热议问题