নিম্নলিখিত পদ্ধতিতে সমস্ত এমন একটি সিস্টেম আমি কীভাবে তৈরি করব :
- অপরিবর্তনীয় বস্তুর সাথে বিশুদ্ধ ফাংশন ব্যবহার করা।
- কেবলমাত্র কোনও ক্রিয়াকলাপের ডেটাতে প্রবেশ করুন যা এটির জন্য প্রয়োজনীয় ক্রিয়াকলাপটি নেই, আর নেই (অর্থাত্ কোনও বড় অ্যাপ্লিকেশন স্টেট অবজেক্ট নয়)
- ফাংশনে বেশি যুক্তি দেওয়া এড়িয়ে চলুন।
- প্যাকেজগুলিকে প্যাকিং এবং আনপ্যাকিং করার উদ্দেশ্যে শুধুমাত্র কার্য্যগুলি পরামিতিগুলি এড়ানো যায় না, কেবলমাত্র অনেকগুলি পরামিতি ফাংশনগুলিতে প্রেরণ করা এড়ানোর জন্য নতুন অবজেক্টগুলি নির্মাণ করা থেকে বিরত থাকুন। যদি আমি একক বস্তু হিসাবে কোনও ফাংশনে একাধিক আইটেম প্যাক করতে চলেছি, আমি চাই যে সেই বস্তুটি অস্থায়ীভাবে নির্মিত কিছু নয়, সেই ডেটার মালিক হতে পারে
আমার কাছে মনে হয় যে রাজ্য মনড নিয়ম # 2 ভঙ্গ করে, যদিও এটি স্পষ্ট নয় কারণ এটি মোনাডের মাধ্যমে বুনে।
আমার মনে হয় আমার কোনওভাবে লেন্স ব্যবহার করা দরকার তবে এটি অ-কার্যকরী ভাষার জন্য খুব কম লেখা হয়।
পটভূমি
অনুশীলন হিসাবে, আমি আমার বিদ্যমান অ্যাপ্লিকেশনগুলির একটিকে একটি অবজেক্ট ভিত্তিক শৈলী থেকে একটি কার্যকরী শৈলীতে রূপান্তর করছি। প্রথম জিনিসটি আমি যা করার চেষ্টা করছি তা হ'ল যথাসম্ভব অ্যাপ্লিকেশনটির অভ্যন্তরীণ-কোরটি তৈরি করা।
একটি জিনিস আমি শুনেছি যে কীভাবে "রাষ্ট্র "কে নিখুঁত-কার্যকরী ভাষায় পরিচালনা করতে হবে এবং আমি বিশ্বাস করি যে এটি রাষ্ট্রীয় মনাদ দ্বারা সম্পন্ন হয়েছে, এটি কি যুক্তিযুক্তভাবে আপনি একটি খাঁটি ফাংশন বলছেন," রাষ্ট্রের মধ্য দিয়ে যাওয়ার সময়? পৃথিবী যেমন হয় ", তারপরে যখন ফাংশনটি ফিরে আসে, এটি আপনাকে পরিবর্তিত হিসাবে বিশ্বের অবস্থা ফিরে আসে।
উদাহরণস্বরূপ, আপনি যেভাবে একটি "হ্যালো ওয়ার্ল্ড" কে খাঁটি কার্যকরী উপায়ে করতে পারেন তা হ'ল দর্শনীয়, আপনি আপনার প্রোগ্রামটিতে সেই স্ক্রিনের সেই অবস্থাটি পাস করেন এবং তার উপর মুদ্রিত "হ্যালো ওয়ার্ল্ড" দিয়ে পর্দার অবস্থা ফিরে পাবেন। প্রযুক্তিগতভাবে, আপনি একটি খাঁটি ফাংশনে কল করছেন, এবং কোনও পার্শ্ব-প্রতিক্রিয়া নেই।
তার উপর ভিত্তি করে আমি আমার অ্যাপ্লিকেশনটি দিয়েছিলাম এবং: 1. প্রথমে আমার সমস্ত অ্যাপ্লিকেশন স্থিতিকে একটি একক বিশ্বব্যাপী বস্তুতে (গেমস্টেট) রাখুন 2. দ্বিতীয়ত, আমি গেমস্টেটকে অনিবার্য করে তুলেছি। আপনি এটি পরিবর্তন করতে পারবেন না। আপনার যদি পরিবর্তন দরকার হয় তবে আপনাকে একটি নতুন তৈরি করতে হবে। আমি একটি অনুলিপি-নির্মাণকারী যুক্ত করে এটি করেছি, এটি বিকল্প বা এক বা একাধিক ক্ষেত্র নেয় যা পরিবর্তিত হয়েছিল। ৩. প্রতিটি অ্যাপ্লিকেশনটিতে আমি পরামিতি হিসাবে গেমস্টেটে পাস করি। ফাংশনটির মধ্যে, এটি যা করতে চলেছে তা করার পরে, এটি একটি নতুন গেমস্টেট তৈরি করে এবং এটি ফিরিয়ে দেয়।
আমার কীভাবে খাঁটি ফাংশনাল কোর এবং বাইরের একটি লুপ রয়েছে যা গেমস্টেটটিকে অ্যাপ্লিকেশনের মূল ওয়ার্কফ্লো লুপে ফিড করে।
আমার প্রশ্ন:
এখন, আমার সমস্যাটি হ'ল, গেমস্টেটের প্রায় 15 টি বিভিন্ন অপরিবর্তনীয় বস্তু রয়েছে। সর্বনিম্ন স্তরের ফাংশনগুলির মধ্যে কেবল কয়েকটি স্কোর রাখার মতো কয়েকটি বিষয়ের উপরই কাজ করে। সুতরাং, আসুন আমি বলি যে আমার একটি ফাংশন রয়েছে যা স্কোর গণনা করে। আজ, গেমস্টেটটি এই ফাংশনে পাস হয়েছে, যা একটি নতুন স্কোর সহ নতুন গেমস্টেট তৈরি করে স্কোরকে সংশোধন করে।
সে সম্পর্কে কিছু ভুল বলে মনে হচ্ছে। ফাংশনটির পুরো গেমস্টেটের প্রয়োজন হয় না। এটি কেবল স্কোর অবজেক্টের প্রয়োজন। সুতরাং আমি স্কোর পাস করার জন্য এটি আপডেট করেছি, এবং শুধুমাত্র স্কোর ফিরে।
এটি বোধগম্য মনে হয়েছিল, তাই আমি অন্যান্য ক্রিয়াকলাপগুলি নিয়ে আরও এগিয়ে গেলাম। কিছু ফাংশনগুলির জন্য আমাকে গেমস্টেট থেকে 2, 3 বা 4 পরামিতিগুলিতে উত্তীর্ণ হতে হবে, তবে আমি যেমন প্যাটার্নটি ব্যবহার করেছি অ্যাপ্লিকেশনটির বহিরাগত কোর, আমি আরও বেশি করে অ্যাপ্লিকেশন অবস্থায় চলেছি। মত, ওয়ার্কফ্লো লুপের শীর্ষে, আমি একটি পদ্ধতি কল করতাম, যে পদ্ধতিটি কল করত যে কোনও পদ্ধতিকে কল করত, ইত্যাদি, যেখানে সমস্ত স্কোর গণনা করা হত। তার মানে বর্তমান স্কোরটি সমস্ত স্তরগুলির সাথে পেরিয়ে গেছে কেবলমাত্র কারণ খুব নীচে একটি ফাংশন স্কোর গণনা করতে চলেছে।
তাই এখন আমার মাঝে মাঝে কয়েক ডজন পরামিতি রয়েছে। আমি এই পরামিতিগুলিকে পরামিতিগুলির সংখ্যা হ্রাস করার জন্য কোনও বস্তুতে রেখে দিতে পারি, তবে তারপরে আমি সেই শ্রেণিকে রাজ্য অ্যাপ্লিকেশন রাষ্ট্রের মাস্টার লোকেশন হিসাবে পছন্দ করব, কল করার সময় কেবলমাত্র পাসিং এড়ানোর জন্য তৈরি করা কোনও অবজেক্টের চেয়ে একাধিক পরামিতিগুলিতে এবং তারপরে আনপ্যাক করুন।
সুতরাং এখন আমি ভাবছি যে আমার সমস্যাটি হ'ল আমার ফাংশনগুলি খুব গভীরভাবে বাসা বাঁধে। এটি ছোট ফাংশনগুলি থাকা চাইবার ফলস্বরূপ, তাই আমি যখন কোনও ফাংশন বড় হয়ে যায় তখন আমি রিফ্যাক্টর করি এবং এটিকে একাধিক ছোট ফাংশনে বিভক্ত করি। তবে এটি করার ফলে একটি গভীর স্তরক্রম তৈরি হয় এবং অভ্যন্তরীণ ফাংশনগুলিতে যে কোনও কিছু প্রবেশ করা বাহ্যিক ফাংশনে সরাসরি প্রবেশ করা দরকার এমনকি যদি বাহ্যিক ক্রিয়াটি সরাসরি সেই বস্তুগুলিতে পরিচালনা না করে।
দেখে মনে হচ্ছিল পথটি গেমস্টেটে যাওয়ার সময় এই সমস্যাটি এড়ানো হয়েছে। তবে আমি ফাংশনটির প্রয়োজনের চেয়ে কোনও ফাংশনে আরও তথ্য পাস করার মূল সমস্যাটিতে ফিরে এসেছি।