سؤال

حسنا، النظر في هذا المصطلح المشترك الذي استخدمه معظمنا عدة مرات (أفترض):

class FooBarDictionary
{
    private Dictionary<String, FooBar> fooBars;

    ...

    FooBar GetOrCreate(String key)
    {
        FooBar fooBar;

        if (!fooBars.TryGetValue(key, out fooBar))
        {
            fooBar = new FooBar();
            fooBars.Add(key, fooBar);
        }

        return fooBar;
    }
}

هل لديها أي نوع من الاسم الثابت؟

(نعم، مكتوب في C #، ولكن يمكن نقل "بسهولة" إلى C ++. وبالتالي هذه العلامة.)

هل كانت مفيدة؟

المحلول

نصائح أخرى

أنا دائما استدعاء مثل هذه الوظائف obtainSomething().

يعتمد ذلك على سبب القيام بذلك - المصطلح هو الشخص الذي رأيته يسمى Memoization، التخزين المؤقت، التهيمة عند الطلب، وإنشاء الاستخدام الأول. عادة ما أسمي الطريقة "المقرر" بدلا من "getorreatee"

أنا غير متأكد من اسم البرمجة الشاملة لنمط المستوى العالي، لكن بيرل لديه هذا السلوك الرائع يسمى Autovivification. - هيا، إنشاء مفتاح التجزئة تلقائيا (خريطة) مع قيمة غير محددة عند الاستعلام عن قيمة المفتاح غير الموجود في التجزئة.

في C # ...

... لدي افتراضي <> أي شيء يتعلق بهذا. كمكافأة

  • يمكنك تحديد قيمة افتراضية أو وظيفة المصنع لإنشاء قيم للمفاتيح المفقودة:
  • لأنه يأتي مع تحويل ضمني من التصدي <> (التفاف القاموس)
  • يأتي مع طرق الإرشاد إلى أي قاموس في التخلف عن <> على الطاير

رمز كامل:

الامتدادات .AsDefaulting يمكن استخدامها للاستخدام بشفافية IDictionary<> كجزء افتراضي، بحيث يمكنك اختيار استخدام أي قاموس (على سبيل المثال، على سبيل المثال تم الحصول عليها من API واجهة برمجة واحدة) كإعداد افتراضي، وسيتم تحديث الحاوية الأساسية مع أي عناصر "متفجر".

استخدامه مثل

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));

بعض حالات الاختبار

يتم تضمين:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top