التلقائي مترجم الكشف عن ذلك من نفس الكائن سبيل المثال حاوية في حلقة

StackOverflow https://stackoverflow.com/questions/1465486

سؤال

هذا هو خطأ غبيا:

List<Foo> fooList = new List<Foo>();
Foo f = new Foo();
while (something.Read()) {
    f.Fill(something.GetRecord());
    fooList.Add(f);
}

بالطبع, يجب إنشاء مثيل جديد فو داخل الحلقة.

يمكن أن مترجم الكشف عن هذا النوع من الخطأ في تجميع الوقت ؟

إلى السذاجة عيون يبدو أنها ينبغي أن تكون قادرة على الكشف عن هذا السلوك (ملء قائمة مع الحالات من نفس الكائن في حلقة).ثم ينبغي أن تصدر تحذيرا مثل "أنت ملء وعاء مع نفس المثال أكثر من مرة".

إذا كيف ساذجة أنا ؟ هل تعرف من لغة فيها شيء مثل هذا موجود ؟

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

المحلول

نعم، هذا ممكن.

ومع ذلك، لا أعتقد أن أداة أو مترجم ستحذر من هذا أنفسهم، لذلك يجب عليك استخدام أداة يمكن تمديدها مع تحليلاتك الخاصة. ل Java، findbugs. هي هذه الأداة. ل C، C ++، إلخ، سوف GCC 4.5 السماح الإضافات للناس لكتابة ملحقاتهم، و كلا من LLVM مصمم لهذا أيضا. يوجد ايضا ديهيدرا من موزيلا، مرة أخرى ل C ++. لغات MS، هناك إطار فينيكس.

لذلك السؤال هو، كيف تكتب هذا التحليل؟ هذا أكثر صعوبة قليلا، ويعتمد على الأداة. ولكن أساسا:

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

لذلك يمكنك بسهولة اكتشاف مكالمة List<>.append(x) في حلقة، حيث x يمكن أن يشير إلى كائن واحد فقط.

نصائح أخرى

ما إذا كنت ترغب في ملء قائمة<> مع مثيلات متعددة من كائن ؟ سوف تحتاج إلى تزيين الخاص بك مع رمز #pragma وبالتالي فإن المترجم يترك لك وحدك ؟

كيف تعلن حتى الدرجة إلى هذه الأنواع من القيود ؟ قائمة<> هو في الحقيقة ليس أكثر من الفئة C#, يمكنك فك mscorlib.dll وانظر تنفيذها الكامل.حتى أن هذا النوع من المعرفة ، فإنه قد يكون من الصعب ترميز في مكان ما.السمات ؟ أن يكون بشكل لا يصدق تقييد.أساليب خاصة للتحقق من صحة الرمز ؟ إضافة النفقات العامة إلى الأشياء الخاصة بك.

هذا النوع من الاشياء هو أبدا (وأنا لا يعني أبدا) تستخدم لسبب:على عدد قليل للغاية من الحالات حيث أنه من شأنه أن يساعد بدلا من إعاقة يأتي من مكان قريب تفوق جدا التكلفة الحقيقية فإن ذلك يتطلب في كل صعوبة تنفيذ (الإطار نفسه من التعليمات البرمجية) و يضرب الأداء (من overbloated الأشياء التي يمكن نقلها من مكان الذاكرة كما GC لا شيء فيها).

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