ট্র্যাক
/
Python
Python
/
অনুশীলনী
/
সার্কুলার বাফার
সার্কুলার বাফার

সার্কুলার বাফার

সহজ

নির্দেশনা

একটি সার্কুলার বাফার, সাইক্লিক বাফার বা রিং বাফার হলো এমন একটি ডেটা স্ট্রাকচার, যা একটি মাত্র নির্দিষ্ট আকারের বাফার ব্যবহার করে, যেন এর দুই প্রান্ত পরস্পরের সাথে জোড়া লাগানো।

একটি সার্কুলার বাফার শুরুতে খালি থাকে এবং এর একটি পূর্বনির্ধারিত দৈর্ঘ্য থাকে। যেমন, এটি ৭টি এলিমেন্টের একটি বাফার:

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

ধরে নিন বাফারের মাঝখানে একটি 1 লেখা হলো (সার্কুলার বাফারে ঠিক কোথা থেকে শুরু হচ্ছে সেটি গুরুত্বপূর্ণ নয়):

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

এরপর ধরে নিন আরও দুটি এলিমেন্ট, 2 ও 3, যোগ করা হলো, যেগুলো 1-এর পরে যুক্ত হয়:

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

এরপর যদি বাফার থেকে দুটি এলিমেন্ট সরিয়ে ফেলা হয়, তবে বাফারের ভেতরের সবচেয়ে পুরোনো মানগুলো সরিয়ে ফেলা হয়। এক্ষেত্রে যে দুটি এলিমেন্ট সরানো হলো সেগুলো 1 ও 2, ফলে বাফারে শুধু একটি 3 পড়ে থাকে:

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

বাফারে যদি ৭টি এলিমেন্ট থাকে, তবে তা পুরোপুরি ভরে যায়:

[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-এর সাবক্লাস হয়।

যেসব পরিস্থিতিতে আপনি জানেন যে এররটির উৎস নির্দিষ্ট কোনো এক্সেপশন টাইপের একটি ডেরিভেটিভ হবে, সেখানে Exception ক্লাসের অধীনস্থ built in error types-এর মধ্যে একটি থেকে ইনহেরিট করতে পারেন। এরর রেইজ করার সময়ও একটি অর্থবহ মেসেজ রাখা উচিত।

এই নির্দিষ্ট অনুশীলনীতে দুটি কাস্টম এক্সেপশন তৈরি করতে হবে। একটি এক্সেপশন রেইজ/"থ্রো" করতে হবে যখন আপনার সার্কুলার বাফার ভর্তি, আর একটি যখন তা খালি। টেস্ট পাস হবে কেবল তখনই, যখন আপনি যথাযথ এক্সেপশন কাস্টমাইজ করবেন, সেগুলো 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")

সূত্র

Wikipediaলিংকটি নতুন উইন্ডো বা ট্যাবে খোলে
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Python Exercism

সার্কুলার বাফার শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।

ডিপ ডাইভ: সার্কুলার বাফার!

এই ভিডিওতে আমরা সার্কুলার বাফার দেখব: এগুলো কী, কোথায় ব্যবহৃত হয় এবং এর বিভিন্ন ইমপ্লিমেন্টেশন, যার মধ্যে রয়েছে কিউ, স্ট্যাটিক ও ডাইনামিক অ্যারে, ইমিউটেবল ডেটা স্ট্রাকচার এবং একটি মজার এজেন্ট-ভিত্তিক ইমপ্লিমেন্টেশন।