paint-brush
পাইথনে স্টেট প্যাটার্ন ব্যবহার করে একটি অসীম দীর্ঘ প্রবন্ধ লেখাদ্বারা@aayn
2,430 পড়া
2,430 পড়া

পাইথনে স্টেট প্যাটার্ন ব্যবহার করে একটি অসীম দীর্ঘ প্রবন্ধ লেখা

দ্বারা Aayush Naik10m2023/12/27
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

স্টেট ডিজাইন প্যাটার্ন হল অবজেক্ট ওরিয়েন্টেড কোডে স্টেট মেশিন। আমরা একটি প্রবন্ধ/বাক্য জেনারেটর তৈরি করতে প্যাটার্ন ব্যবহার করি।
featured image - পাইথনে স্টেট প্যাটার্ন ব্যবহার করে একটি অসীম দীর্ঘ প্রবন্ধ লেখা
Aayush Naik HackerNoon profile picture
0-item

এর একটি অসীম দীর্ঘ প্রবন্ধ লিখুন! কিন্তু এটা অসম্ভব কাজ। যাইহোক, আমরা এমন একটি প্রক্রিয়া তৈরি করতে পারি যা, যদি চিরতরে চালানো হয়, একটি অসীম দীর্ঘ প্রবন্ধ তৈরি করবে। খুব কাছাকাছি .


এখন, আপনি স্পষ্টতই পাইথন কোডের একটি লাইন দিয়ে একটি দীর্ঘ এবং পুনরাবৃত্তিমূলক রচনা তৈরি করতে পারেন:


 >>> "This is water. " * 20 'This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. '


ইয়াওন … বোরিং! পরিবর্তে, আমরা এই নিবন্ধে স্টেট ডিজাইন প্যাটার্ন ব্যবহার করে আরও অনেক আকর্ষণীয় প্রবন্ধ তৈরি করব।


প্রথমত, আমরা রাজ্যের মেশিনগুলি কী এবং সেগুলি কীভাবে রাজ্য নকশা প্যাটার্নের সাথে সম্পর্কিত তা বুঝতে পারব। এর পরে, আমরা একটি রাষ্ট্রীয় যন্ত্র তৈরি করব যা একটি (যৌক্তিকভাবে) আকর্ষণীয় এবং অসীম রচনা তৈরি করতে পারে। তারপর, আমরা সংক্ষিপ্তভাবে রাষ্ট্র নকশা প্যাটার্ন উপর যেতে হবে. অবশেষে, আমরা স্টেট ডিজাইন প্যাটার্ন ব্যবহার করে সেই স্টেট মেশিনটিকে অবজেক্ট-ওরিয়েন্টেড কোডে অনুবাদ করব।


সফ্টওয়্যার ডিজাইন প্যাটার্নগুলি সাধারণত ঘটতে থাকা সমস্যাগুলি সমাধান করার কার্যকর উপায়। যথাযথভাবে প্রয়োগ করা হলে, স্টেট প্যাটার্নের মতো সফ্টওয়্যার ডিজাইন প্যাটার্ন আপনাকে আরও ভাল মাপযোগ্য, রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষাযোগ্য সফ্টওয়্যার লিখতে সাহায্য করতে পারে।

স্টেট মেশিন

সংক্ষেপে, স্টেট ডিজাইন প্যাটার্ন একটি স্টেট মেশিনকে অবজেক্ট-ওরিয়েন্টেড কোডে অনুবাদ করে।


আপনি যদি রাষ্ট্রীয় মেশিনের সাথে পরিচিত না হন তবে এটি একটি খুব সহজ ধারণা। একটি রাষ্ট্রীয় যন্ত্রের রাজ্য এবং রূপান্তর রয়েছে। রাজ্যগুলি হল আমাদের সুদ ব্যবস্থার নির্দিষ্ট বৈশিষ্ট্য, এবং রাষ্ট্রীয় রূপান্তর হল এমন ক্রিয়া যা এই বৈশিষ্ট্যগুলিকে পরিবর্তন করে এবং এর ফলে রাষ্ট্রের পরিবর্তনও ঘটে।


যেহেতু আমার একটি রোবোটিক্স ব্যাকগ্রাউন্ড রয়েছে (অন্যান্য জিনিসগুলির মধ্যে) এবং যেহেতু স্টেট মেশিনগুলি রোবোটিক্সে ব্যাপকভাবে ব্যবহৃত হয়, তাই আমি একটি রোবট ভ্যাকুয়াম ক্লিনারের একটি সাধারণ উদাহরণ ব্যবহার করব যাতে রাজ্যের মেশিনগুলি কীভাবে কাজ করে তা বোঝাতে।


একটি রোবট ভ্যাকুয়াম ক্লিনার চালানোর জন্য রাষ্ট্রীয় মেশিন।


স্টেট মেশিন ডায়াগ্রামটি রোবটটি কীভাবে কাজ করে তার একটি স্বজ্ঞাত ছবি পেইন্ট করে, এমনকি যদি আপনি কখনও রাষ্ট্রীয় মেশিনের মুখোমুখি না হন। চলুন এই অপারেশন ধাপে ধাপে যেতে দিন.


  1. রোবটটি ডকড অবস্থায় শুরু হয় (কালো বিন্দুটি শুরুর অবস্থা নির্দেশ করে)।
  2. যদি রোবট শনাক্ত করে যে তার ব্যাটারি কম, তবে এটি নিজেই চার্জ করা শুরু করে ( চার্জিং স্টেট) যতক্ষণ না তার ব্যাটারি পূর্ণ হয়। একবার ব্যাটারি পূর্ণ হয়ে গেলে, এটি ডকড অবস্থায় ফিরে আসে।
  3. ডকড অবস্থায়, রোবট যদি সনাক্ত করে যে মেঝে নোংরা (এবং এর ব্যাটারি কম নয়), এটি মেঝে পরিষ্কার করা শুরু করে ( পরিস্কার অবস্থা)।
  4. ক্লিনিং স্টেটে, রোবটের ব্যাটারি কম থাকলে তা নিজেই চার্জ হয়ে যায়। এবং মেঝে পরিষ্কার থাকলে, রোবট তার ডকে ( ডক করা অবস্থায়) ফিরে আসে।


এইভাবে, আমাদের রোবট ভ্যাকুয়াম ক্লিনারের তিনটি অবস্থা রয়েছে — ডকড , ক্লিনিং এবং চার্জিং — এবং মেঝে এবং এর ব্যাটারির সংবেদনশীল সনাক্তকরণের উপর ভিত্তি করে ট্রানজিশন রয়েছে।


অসীম রচনা জন্য সহজ রাষ্ট্র মেশিন

এখন যেহেতু আমরা রাষ্ট্রীয় যন্ত্রগুলিকে একটি মৌলিক স্তরে বুঝি, আসুন একটি অসীম প্রবন্ধ লিখতে সক্ষম একটি রাষ্ট্রযন্ত্র তৈরি করি।


অসীম রচনা তৈরি করার জন্য রাষ্ট্রীয় যন্ত্র - সংস্করণ 1


উপরে একটি রাষ্ট্রীয় যন্ত্র যা ইংরেজি ব্যাকরণ ব্যবহার করে সংক্ষিপ্ত, সহজ বাক্য সমন্বিত একটি প্রবন্ধ তৈরি করে। আমি প্রতিশ্রুতি দিচ্ছি যে আমরা খুব শীঘ্রই আরও আকর্ষণীয় সংস্করণে পাব, তবে এটি বোঝার জন্য একটি ভাল সূচনা পয়েন্ট হিসাবে কাজ করা উচিত। চলুন এটা কিভাবে কাজ করে যান.


  1. বিশেষ্য অবস্থায় শুরু করে, আমরা কিছু পূর্বনির্ধারিত বিশেষ্য তালিকা থেকে বাছাই করে একটি বিশেষ্য তৈরি করি। ধরা যাক আমাদের বিশেষ্য হল “The World”। (এখন পর্যন্ত বাক্য: "বিশ্ব")
  2. তারপরে আমরা ক্রিয়া অবস্থায় শেষ করি, পরবর্তী একটি ক্রিয়া তৈরি করি (বলুন, "বার্ক")। (এখন পর্যন্ত বাক্য: "বিশ্ব ঘেউ ঘেউ")
  3. আমরা বিশেষণ অবস্থায় একটি বিশেষণ (বলুন, "লাল") তৈরি করি। (এখন পর্যন্ত বাক্য: "বিশ্ব লাল লাল")
  4. তারপরে, এন্ডমার্ক অবস্থায়, আমরা সমাপ্ত বিরাম চিহ্নগুলির একটি তৈরি করি, বলুন “!”৷ (বাক্য: "বিশ্ব লাল ছাল!")
  5. অবশেষে, আমরা প্রবন্ধে আমাদের পরবর্তী বাক্য তৈরি করতে বিশেষ্য অবস্থায় ফিরে এসেছি।


এই রাষ্ট্রীয় যন্ত্রটি এমন একটি (অবাস্তব) প্রবন্ধ তৈরি করতে পারে যা দেখতে এইরকম।


পৃথিবী লাল হয়ে যায়! চাচাতো ভাই হ্যারি ফাউল বৃষ্টি? বাঘেরা মজায় শিহরন করে। …


অসীম প্রবন্ধের জন্য নন-ডিটারমিনিস্টিক স্টেট মেশিন

যদিও "অ-নির্ধারণবাদী" জটিল শোনাচ্ছে, আমাদের উদ্দেশ্যে, এর অর্থ হল কিছু এলোমেলোতা যোগ করা। মূলত আমরা কিছু রাজ্যে স্থানান্তর করার আগে এক ধরনের মুদ্রা টস যোগ করছি। আপনি আমি কি বলতে চাই দেখতে পাবেন.

অসীম প্রবন্ধ তৈরি করার জন্য অ-নির্ধারক রাষ্ট্র মেশিন - সংস্করণ 2


উপরের নন-ডিটারমিনিস্টিক স্টেট মেশিনটি আগেরটির মতোই। শুধুমাত্র পার্থক্য হল:

  • নেগেটিভ হল "না" বা "না" এর মত শব্দ এবং সংযোজন হল "এবং" এবং "কিন্তু" এর মত শব্দ।
  • ক্রিয়াপদ অবস্থায়, আমরা একটি ক্রিয়া তৈরি করি এবং তারপরে আমরা একটি মুদ্রা টস করি। যদি এটি হেড অবলম্বন করে (50% সম্ভাবনা), আমরা নেতিবাচক অবস্থায় যাই; অন্যথায় আমরা বিশেষণ অবস্থায় যাই।
  • একইভাবে, বিশেষণ অবস্থায়, আমরা একটি বিশেষণ তৈরি করি এবং তারপর একটি মুদ্রা টস করি। যদি মাথা থাকে, আমরা কনজাংশন স্টেটে যাই; যদি এটি পুচ্ছ হয়, তাহলে আমরা এন্ডমার্ক স্টেটে যাই।


এলোমেলোতা, নেতিবাচকতা এবং সংযোগের প্রবর্তনের সাথে, আমরা এখন আরও আকর্ষণীয় এবং পরিবর্তনশীল দৈর্ঘ্যের বাক্য তৈরি করতে পারি।


রাষ্ট্র নকশা প্যাটার্ন

এখন, রাষ্ট্র নকশা প্যাটার্ন কিভাবে কাজ করে তা বোঝা যাক। আবার, মনে রাখবেন যে আমরা একটি রাষ্ট্রীয় মেশিনকে অবজেক্ট-ওরিয়েন্টেড কোডে অনুবাদ করার চেষ্টা করছি।


প্রবন্ধ জেনারেশন স্টেট মেশিনে, লক্ষ্য করুন যে প্রতিটি রাজ্যকে দুটি জিনিস করতে হবে।

  1. কিছু কর্ম সঞ্চালন. এই ক্ষেত্রে, একটি শব্দ (বিশেষ্য, বিশেষণ, ইত্যাদি) তৈরি করা।
  2. পরবর্তী রাজ্যে রূপান্তর। Noun থেকে Verb পর্যন্ত, এবং তাই।


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


নীচে, আমাদের স্টেট ডিজাইন প্যাটার্নের জন্য একটি UML ডায়াগ্রাম আছে। কিছু প্রেক্ষাপট রয়েছে যেখানে প্রতিটি রাজ্য কাজ করে, Context শ্রেণী দ্বারা চিত্রিত। কনটেক্সট অবজেক্টের একটি প্রাইভেট স্টেট অ্যাট্রিবিউট আছে, যা এটি ব্যবহার করে বর্তমান স্টেটকে তার ক্রিয়া সম্পাদন করতে কল করে। প্রতিটি রাষ্ট্র তার ক্রিয়া বা ক্রিয়াকলাপ সম্পাদন এবং পরবর্তী রাজ্যে ফিরে আসার পদ্ধতি সহ একটি State ইন্টারফেস প্রয়োগ করে।


স্টেট ডিজাইন প্যাটার্ন ইউএমএল ডায়াগ্রাম


যদি আমরা এটিকে প্রবন্ধ প্রজন্মের উদাহরণে মানচিত্র করি, তাহলে UML চিত্রটি এরকম দেখায়।


প্রবন্ধ তৈরির জন্য রাষ্ট্রীয় প্যাটার্ন প্রয়োগ করা হয়েছে


WordState এখন একটি ইন্টারফেসের পরিবর্তে একটি বিমূর্ত শ্রেণী (ইটালিক দ্বারা নির্দেশিত)। বিমূর্ত ক্লাসে কিছু বিমূর্ত (বাস্তবায়িত নয়) পদ্ধতি এবং বৈশিষ্ট্য থাকতে পারে, অন্যদের সংজ্ঞায়িত করা যেতে পারে। ইন্টারফেসগুলি সম্পূর্ণ বিমূর্ত: তাদের সমস্ত পদ্ধতি বিমূর্ত। আমি এই পরিবর্তন করেছি কারণ generateWord বাস্তবায়ন সমস্ত রাজ্যে একই, এবং ডুপ্লিকেট কোড এড়ানো ভাল।


আসুন উপরের প্রতিটি গুণাবলী এবং পদ্ধতিগুলিকে ভেঙে দেওয়া যাক। EssayContext ক্লাসে, আমাদের আছে:

  • state : বর্তমান WordState অবজেক্টের রেফারেন্স।
  • essayBody : এ পর্যন্ত তৈরি হওয়া সমস্ত শব্দের তালিকা।
  • setState() : state অ্যাট্রিবিউট পরিবর্তন করতে সেটার।
  • addWord() : প্রবন্ধের মূল অংশে পরবর্তী শব্দ যোগ করার পদ্ধতি।
  • generateEssay() : আমরা এই পদ্ধতিটিকে আমাদের রচনা তৈরি করতে বলি; essayBody এর দৈর্ঘ্য length চেয়ে বেশি হলে আমরা থামি।
  • printEssay() : তৈরি করা প্রবন্ধের একটি স্ট্রিং প্রদান করে।


বিমূর্ত ক্লাস WordState এ, আমাদের আছে:

  • wordList : বিমূর্ত সম্পত্তি (ইটালিক দ্বারা নির্দেশিত) শব্দের একটি তালিকার জন্য যেখান থেকে আমরা শব্দগুলি তৈরি করি।
  • generateWord() : পদ্ধতি যা প্রবন্ধের প্রসঙ্গে জেনারেট করা শব্দ যোগ করে।
  • nextState() : পরবর্তী অবস্থা ফেরানোর জন্য বিমূর্ত পদ্ধতি।


WordState থেকে উত্তরাধিকারসূত্রে প্রাপ্ত অন্য সব কংক্রিট স্টেটের জন্য আমরা NounState একটি প্রতিনিধি উদাহরণ হিসেবে ব্যবহার করব।

  • wordList : বিশেষ্যের একটি তালিকা যেখান থেকে আমরা শব্দ তৈরি করি।
  • nextState() : পরবর্তী অবস্থা ফেরত দেয়।


এখন, কোডে এটি বাস্তবায়নের জন্য আমাদের যা দরকার তা আমাদের কাছে রয়েছে। এর এগিয়ে যান এবং ঠিক যে কি!


পাইথন কোড

আসুন প্রথমে essay_context.py নামে একটি ফাইলে EssayContext ক্লাস লিখি। আমরা উটের কেস বাদ দেব এবং সাপের কেস এ চলে যাব কারণ, ভাল, পাইথন একটি... সাপ (দুঃখিত)।


 from word_state import WordState class EssayContext: def __init__(self, state: WordState): self.state = state self.essay_body: list[str] = [] def set_state(self, state: WordState): self.state = state def add_word(self, word: str): self.essay_body.append(word) def generate_essay(self, length: int): while len(self.essay_body) < length: self.state.generate_word(self) def print_essay(self) -> str: return " ".join(self.essay_body)


তারপর, word_state.py নামের একটি ফাইলে স্টেট যোগ করা যাক।


 import abc import numpy as np class WordState(abc.ABC): word_list: list[str] @classmethod def generate_word(cls, context: "EssayContext"): word = np.random.choice(cls.word_list) context.add_word(word) context.set_state(cls.next_state()) @classmethod @abc.abstractmethod def next_state(cls) -> "WordState": pass class NounState(WordState): word_list: list[str] = ["everything", "nothing"] @classmethod def next_state(cls): return VerbState class VerbState(WordState): word_list: list[str] = ["is", "was", "will be"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return NegationState return AdjectiveState class NegationState(WordState): word_list: list[str] = ["not"] @classmethod def next_state(cls): return AdjectiveState class AdjectiveState(WordState): word_list: list[str] = ["fantastic", "terrible"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return ConjunctionState return EndmarkState class ConjunctionState(WordState): word_list: list[str] = ["and", "but"] @classmethod def next_state(cls): return NounState class EndmarkState(WordState): word_list: list[str] = [".", "!"] @classmethod def next_state(cls): return NounState


অবশেষে, main.py এ সবকিছু চালানোর জন্য কোড যোগ করা যাক।


 from essay_context import EssayContext from word_state import NounState if __name__ == '__main__': ctx = EssayContext(NounState) ctx.generate_essay(100) print(ctx.print_essay())


python main.py চালানো আমাদের নিম্নলিখিত আউটপুট দেয় (অনির্ধারণবাদের কারণে প্রতিবার আলাদা):


 'everything is not terrible and nothing was terrible ! everything will be not fantastic but everything is fantastic . everything will be fantastic . nothing will be fantastic and nothing will be terrible ! everything was not fantastic and everything will be not terrible . everything was terrible . nothing was terrible but nothing will be fantastic ! nothing is not terrible . nothing was not fantastic but everything was not fantastic ! everything will be not fantastic but everything will be terrible ! everything will be not fantastic . everything is fantastic but nothing will be not terrible ! everything will be not fantastic but nothing was not fantastic !'


এত সহজ সিস্টেমের জন্য খারাপ না! প্রবন্ধ প্রজন্মকে আরও পরিশীলিত করতে আমরা বিভিন্ন শব্দ তালিকা প্রসারিত করতে বা আরও রাজ্য যোগ করতে পারি। এমনকি আমাদের প্রবন্ধগুলিকে পরবর্তী স্তরে নিয়ে যাওয়ার জন্য আমরা কিছু LLM API চালু করতে পারি।


সর্বশেষ ভাবনা

স্টেট মেশিন এবং স্টেট প্যাটার্ন একটি "রাষ্ট্র" এর একটি সু-সংজ্ঞায়িত ধারণার সাথে মডেল এবং সিস্টেম তৈরি করার জন্য উপযুক্ত। অর্থাৎ, প্রতিটি রাষ্ট্রের সাথে সম্পর্কিত নির্দিষ্ট আচরণ এবং বৈশিষ্ট্য রয়েছে। রোবট ভ্যাকুয়াম ক্লিনার পরিষ্কার করা, ডক করা বা চার্জ করা হচ্ছে। আপনার টিভি চালু বা বন্ধ হতে পারে, এবং টিভি রিমোট বোতামগুলি টিভির অবস্থার উপর ভিত্তি করে ভিন্নভাবে কাজ করবে।


এটি একটি ভাল-সংজ্ঞায়িত প্যাটার্নের সাথে সিকোয়েন্স তৈরি বা সনাক্ত করার জন্যও উপযুক্ত। এটি আমাদের প্রবন্ধ প্রজন্মের উদাহরণে প্রযোজ্য।


অবশেষে, আপনি জিজ্ঞাসা করতে পারেন, "এ সবের উদ্দেশ্য কি?" কেন আমরা এই "অসীম" রচনাটি তৈরি করার জন্য বিভিন্ন রাজ্য এবং শ্রেণিকে সংজ্ঞায়িত করার সমস্ত ঝামেলার মধ্য দিয়ে গিয়েছিলাম? আমরা একই আচরণ অর্জন করতে পাইথন কোডের 20 (বা কম) লাইন লিখতে পারতাম।


সংক্ষিপ্ত উত্তর হল আরও ভালো মাপযোগ্যতার জন্য।


কল্পনা করুন, যদি মাত্র তিন বা পাঁচটি রাজ্যের পরিবর্তে আমাদের 50 বা 500টি রাজ্য থাকত। এটা হাইপারবোল নয়; বাস্তব এন্টারপ্রাইজ সিস্টেমে সেই স্তরের জটিলতা আছে। হঠাৎ করে, রাজ্যের প্যাটার্নটি তার ডিকপলিং এবং বিচ্ছিন্নতার কারণে অনেক বেশি আকর্ষণীয় বলে মনে হচ্ছে। পুরো সিস্টেমকে আমাদের মাথায় না রেখে আমরা একবারে একটি রাজ্যে ফোকাস করতে পারি। পরিবর্তনগুলি প্রবর্তন করা সহজ কারণ একটি রাজ্য অন্যদের প্রভাবিত করবে না। এটি সহজ ইউনিট পরীক্ষার জন্য অনুমতি দেয়, একটি মাপযোগ্য এবং রক্ষণাবেক্ষণযোগ্য সিস্টেমের একটি বড় অংশ।


শেষ পর্যন্ত, রাজ্যের ধরণটি কেবল রাজ্যগুলি পরিচালনার বিষয়ে নয়; সমস্ত ডিজাইনের প্যাটার্নের মতো, এটি বিল্ডিং সিস্টেমগুলির জন্য একটি ব্লুপ্রিন্ট যা পরিমাপযোগ্য এবং রক্ষণাবেক্ষণযোগ্য যতটা পরিশীলিত।