كيف يمكنك تصميم العداد أن يعود (نظريا) مبلغ لا حصر له من البنود ؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

أنا أكتب رمز التي تبدو مشابهة لهذه:

public IEnumerable<T> Unfold<T>(this T seed)
{
    while (true)
    {
        yield return [next (T)object in custom sequence];
    }
}

ومن الواضح أن هذا الأسلوب لن يعود.(C# compiler بصمت يسمح هذا ، في حين R# يعطيني تحذير "وظيفة لا يعود أبدا".)

عموما هو سيئة تصميم لتوفير العداد التي تقوم بإرجاع عدد لا حصر له من البنود ، دون توفير وسيلة لوقف تعداد?

هل هناك أي اعتبارات خاصة لهذا السيناريو ؟ Mem ؟ Perf?أخرى gotchas?

إذا نحن دائما توفير مخرج الشرط ، التي هي الخيارات ؟ E. g:

  • كائن من نوع T أن يمثل شاملة أو حصرية الحدود
  • a Predicate<T> continue (كما TakeWhile لا)
  • عدد (كما Take لا)
  • ...

يجب علينا الاعتماد على المستخدمين الاتصال Take(...) / TakeWhile(...) بعد Unfold(...)?(ربما يكون الخيار المفضل ، لأنه روافع القائمة Linq المعرفة.)

هل الإجابة على هذا السؤال بشكل مختلف إذا كان رمز سوف تنشر في API العامة ، إما كما هو (عام) أو كما هو محدد تنفيذ هذا النمط ؟

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

المحلول

طالما أنك توثق بوضوح شديد أن الطريقة لن تنتهي من التكرار أبدًا (الطريقة نفسها تعود بسرعة كبيرة بالطبع) فأعتقد أنه لا بأس.في الواقع، يمكنها أن تجعل بعض الخوارزميات أكثر إتقانًا.لا أعتقد أن هناك أي آثار مهمة على الذاكرة/الأداء - على الرغم من أنك إذا أشرت إلى كائن "باهظ الثمن" داخل المكرر الخاص بك، فسيتم التقاط هذا المرجع.

هناك دائمًا طرق لإساءة استخدام واجهات برمجة التطبيقات:طالما أن مستنداتك واضحة، أعتقد أنه لا بأس.

نصائح أخرى

"عموما, هي سيئة التصميم لتوفير العداد أن يعود كمية لا حصر له من المواد, دون توريد وسيلة لوقف تعداد?"

المستهلك من رمز ، دائما وقف تعداد (باستخدام كسر على سبيل المثال أو غيرها من الوسائل).إذا كان العداد يعود تسلسل لانهائي, هذا لا يعني أن العميل العداد بطريقة ما اضطر أبدا كسر التعداد في الواقع لا يمكنك أن تجعل العداد الذي هو ضمان أن يكون كاملا المذكورة من قبل العميل.

يجب علينا الاعتماد على المستخدمين الاتصال تأخذ(...) / TakeWhile(...) بعد تتكشف(...)?(ربما المفضل الخيار لأنه يستفيد من القائمة Linq المعرفة.)

نعم, طالما أنك تحدد بوضوح في الوثائق أن العداد يعود تسلسل لانهائي وكسر من التعداد هو المتصل المسؤولية ، يجب أن يكون كل شيء بخير.

العودة لانهائية تسلسل ليست فكرة سيئة, وظيفية برمجة لغات فعلت ذلك لفترة طويلة الآن.

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

لن أستخدم عدادًا لا نهائيًا في واجهة برمجة التطبيقات العامة.مبرمجو C#، وأنا منهم، معتادون أيضًا على حلقة foreach.سيكون هذا أيضًا متوافقًا مع .NET Framework؛لاحظ كيف تستخدم الأساليب Enumerable.Range وEnumerable.Repeat وسيطة لتحديد عدد العناصر في Enumerable.اختارت Microsoft استخدام Enumerable.Repeat(" ", 10) بدلاً من Enumerable.Repeat(" ").Take(10) لتجنب التعداد اللانهائي وسألتزم بخيارات التصميم الخاصة بهم.

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