المسارات
/
Python
Python
/
التمارين
/
المخزن المؤقت الدائري
المخزن المؤقت الدائري

المخزن المؤقت الدائري

سهل

التعليمات

المخزن المؤقت الدائري، أو المخزن المؤقت الدوري، أو مخزن الحلقة، هو بنية بيانات تستخدم مخزنًا مؤقتًا واحدًا ثابت الحجم كما لو كان موصولًا من طرفه بطرَفه.

يبدأ المخزن المؤقت الدائري فارغًا وله طول محدد مسبقًا. على سبيل المثال، هذا مخزن من 7 عناصر:

[ ][ ][ ][ ][ ][ ][ ]

افترض أن العدد 1 كُتب في منتصف المخزن (لا يهم موضع البداية الدقيق في المخزن الدائري):

[ ][ ][ ][1][ ][ ][ ]

ثم افترض أنه أُضيف عنصران آخران، 2 و3، يُضافان بعد 1:

[ ][ ][ ][1][2][3][ ]

إذا أُزيل عنصران بعد ذلك من المخزن، فستُزال أقدم القيم الموجودة داخل المخزن. العنصران المُزالان في هذه الحالة هما 1 و2، ولا يبقى في المخزن سوى 3:

[ ][ ][ ][ ][ ][3][ ]

إذا احتوى المخزن على 7 عناصر فهو ممتلئ تمامًا:

[5][6][7][8][9][3][4]

عندما يمتلئ المخزن يُرفَع خطأ يُنبّه العميل إلى أن الكتابات الإضافية محجوبة حتى تتحرر خانة.

عندما يمتلئ المخزن، يمكن للعميل أن يختار الكتابة فوق أقدم البيانات بكتابة قسرية. في هذه الحالة يُضاف عنصران آخران، A وB، فيكتبان فوق 3 و4:

[5][6][7][8][9][A][B]

استُبدل 3 و4 بـA وB، فأصبح 5 هو أقدم بيانات في المخزن. وأخيرًا، إذا أُزيل عنصران فما سيُرجع هو 5 و6، ليصبح المخزن:

[ ][ ][7][8][9][A][B]

ولأن هناك مساحة متاحة، إذا استخدم العميل الكتابة فوق مرة أخرى لتخزين C وD، فسيُستخدم المكان الذي كان يخزّن فيه 5 و6 سابقًا، لا موضع 7 و8. لا يزال 7 أقدم عنصر، وقد امتلأ المخزن مرة أخرى.

[C][D][7][8][9][A][B]

تخصيص الاستثناءات ورفعها

أحيانًا تحتاج في الكود إلى تخصيص الاستثناءات ورفعها بـ raise. وعندما تفعل ذلك، يجب أن تتضمن دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ. فهذا يجعل كودك أسهل في القراءة ويساعد كثيرًا في تصحيح الأخطاء.

يمكن إنشاء الاستثناءات المخصصة عبر أصناف استثناءات جديدة (راجع classes لمزيد من التفاصيل)، وهي عادةً أصناف فرعية من Exception.

وفي الحالات التي تعرف فيها أن مصدر الخطأ سيكون مشتقًا من نوع استثناء معيّن، يمكنك أن تختار الوراثة من أحد built in error types ضمن الصنف Exception. وعند رفع الخطأ، يجب أن تتضمن مع ذلك رسالة ذات معنى.

يتطلب هذا التمرين تحديدًا أن تنشئ استثناءين مخصصين. استثناء يُرفع/«يُقذف» عندما يكون المخزن الدائري ممتلئًا، وآخر عندما يكون فارغًا. لن تنجح الاختبارات إلا إذا خصّصت الاستثناءات المناسبة، ورفعت تلك الاستثناءات باستخدام raise، وتضمنت رسائل خطأ مناسبة.

لتخصيص built-in exception، أنشئ class يرث من ذلك الاستثناء. وعند رفع الاستثناء المخصص مع رسالة، اكتب الرسالة كوسيط لنوع exception:

# subclassing the built-in BufferError to create BufferFullException
class BufferFullException(BufferError):
    """Exception raised when CircularBuffer is full.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a BufferFullException
raise BufferFullException("Circular buffer is full")

المصدر

ويكيبيديايفتح الرابط في نافذة أو علامة تبويب جديدة
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Python Exercism

مستعد لبدء المخزن المؤقت الدائري؟

سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.

تعمّق في المخزن المؤقت الدائري!

في هذا الفيديو نلقي نظرة على المخزن المؤقت الدائري: ما هو، وأين يُستخدم، وتطبيقاته المختلفة، بما في ذلك الطوابير والمصفوفات الثابتة والديناميكية وبنى البيانات غير القابلة للتغيير وتطبيق ممتع قائم على الوكلاء.