ববডালগাইশ ইতিমধ্যে উল্লেখ করেছে যে এই (বিরোধী) প্যাটার্নটিকে " ট্র্যাম্প ডেটা " বলা হয় ।
আমার অভিজ্ঞতা হিসাবে, অত্যধিক ট্র্যাম্প ডেটার সর্বাধিক সাধারণ কারণটিতে লিঙ্কযুক্ত স্টেট ভেরিয়েবলগুলির একটি গোছা রয়েছে যা সত্যই কোনও বস্তু বা কোনও ডেটা কাঠামোতে আবশ্যক। কখনও কখনও, তথ্য সঠিকভাবে সাজানোর জন্য এমনকি একগুচ্ছ বস্তুর বাসা বাঁধার প্রয়োজন হতে পারে।
একটি সহজ উদাহরণ হিসেবে বলা যায়, কোনো গেম একটি স্বনির্ধারিত প্লেয়ার চরিত্র আছে যা, মত বৈশিষ্ট্য সঙ্গে বিবেচনা playerName
, playerEyeColor
তাই এবং। অবশ্যই, খেলোয়াড়ের গেমের মানচিত্রে একটি শারীরিক অবস্থান এবং অন্যান্য বিভিন্ন বৈশিষ্ট্য যেমন, বলা, বর্তমান এবং সর্বাধিক স্বাস্থ্য স্তর ইত্যাদি রয়েছে।
এই জাতীয় গেমটির প্রথম পুনরাবৃত্তিতে, এই সমস্ত বৈশিষ্ট্যকে বৈশ্বিক ভেরিয়েবলে পরিণত করা একদম যুক্তিসঙ্গত পছন্দ হতে পারে - সর্বোপরি, কেবলমাত্র একজন খেলোয়াড় রয়েছে এবং খেলায় প্রায় সমস্ত কিছুই খেলোয়াড়কে জড়িত। সুতরাং আপনার বৈশ্বিক রাষ্ট্রের মধ্যে ভেরিয়েবলগুলি থাকতে পারে:
playerName = "Bob"
playerEyeColor = GREEN
playerXPosition = -8
playerYPosition = 136
playerHealth = 100
playerMaxHealth = 100
তবে এক পর্যায়ে আপনি দেখতে পাবেন যে আপনাকে এই নকশাটি পরিবর্তন করতে হবে, সম্ভবত আপনি গেমটিতে একটি মাল্টিপ্লেয়ার মোড যুক্ত করতে চান বলে want প্রথম প্রয়াস হিসাবে, আপনি এই সমস্ত পরিবর্তনশীল স্থানীয় করার চেষ্টা করতে পারেন এবং তাদের প্রয়োজনীয় ফাংশনে এগুলি প্রেরণ করতে পারেন। তবে, আপনি তখন দেখতে পাবেন যে আপনার গেমের একটি নির্দিষ্ট ক্রিয়াতে কোনও ফাংশন কল চেইন যেমন জড়িত থাকতে পারে:
mainGameLoop()
-> processInputEvent()
-> doPlayerAction()
-> movePlayer()
-> checkCollision()
-> interactWithNPC()
-> interactWithShopkeeper()
... এবং interactWithShopkeeper()
ফাংশনটিতে দোকানের নামটি দিয়ে খেলোয়াড়কে সম্বোধন করা হয়েছে, সুতরাং আপনাকে এখন হঠাৎ এই সমস্ত ফাংশনটির playerName
মধ্য দিয়ে ট্র্যাম্প ডেটা হিসাবে পাস করতে হবে । এবং অবশ্যই, দোকানদার যদি মনে করেন যে নীল চোখের খেলোয়াড়গুলি নির্বোধ, এবং তাদের জন্য আরও দাম ধার্য করে, তবে আপনাকে পুরো ক্রিয়াকলাপের মধ্য দিয়ে যেতে হবে , ইত্যাদি।playerEyeColor
সঠিক সমাধান, এক্ষেত্রে অবশ্যই কোনও প্লেয়ার অবজেক্টকে সংজ্ঞায়িত করা যা নাম, চোখের রঙ, অবস্থান, স্বাস্থ্য এবং খেলোয়াড়ের চরিত্রের অন্য কোনও বৈশিষ্ট্যকে আবদ্ধ করে। এইভাবে, আপনার কেবলমাত্র সেই এককটি অবজেক্টটি সমস্ত ফাংশনগুলিতেই পাস করতে হবে যা কোনওভাবে প্লেয়ারকে জড়িত।
এছাড়াও, উপরের কয়েকটি ফাংশন প্রাকৃতিকভাবে সেই প্লেয়ার অবজেক্টের পদ্ধতিতে তৈরি করা যেতে পারে যা এগুলি স্বয়ংক্রিয়ভাবে তাদের প্লেয়ারের বৈশিষ্ট্যে অ্যাক্সেস দেয়। একটি উপায়ে, এটি কেবল সিনট্যাকটিক চিনি, যেহেতু কোনও বস্তুর কোনও পদ্ধতি কল করা কার্যকরভাবে কোনও পদ্ধতিতে কোনও লুকানো প্যারামিটার হিসাবে অবজেক্টের উদাহরণটিকে পাস করে, তবে এটি সঠিকভাবে ব্যবহার করা হলে কোডটি আরও পরিষ্কার এবং আরও প্রাকৃতিক দেখায়।
অবশ্যই, একটি সাধারণ খেলায় কেবল প্লেয়ারের চেয়ে অনেক বেশি "গ্লোবাল" অবস্থা থাকবে; উদাহরণস্বরূপ, আপনার কাছে অবশ্যই খেলাধুলার একটি মানচিত্র রয়েছে এবং মানচিত্রে খেলোয়াড়বিহীন অক্ষরের একটি তালিকা এবং এটিতে রাখা আইটেম এবং সম্ভবত আরও কিছু রয়েছে। আপনি আশেপাশের সমস্তগুলি ট্র্যাম্প অবজেক্ট হিসাবেও পাস করতে পারেন তবে এটি আবার আপনার পদ্ধতির যুক্তিগুলিকে বিশৃঙ্খলা করবে।
পরিবর্তে, সমাধানটি হ'ল বস্তুগুলির সাথে অন্য যে কোনও অবজেক্টের সাথে তাদের স্থায়ী বা অস্থায়ী সম্পর্ক রয়েছে সেগুলির উল্লেখ রয়েছে। সুতরাং, উদাহরণস্বরূপ, প্লেয়ার অবজেক্ট (এবং সম্ভবত কোনও এনপিসি অবজেক্টগুলিও) সম্ভবত "গেম ওয়ার্ল্ড" অবজেক্টের একটি রেফারেন্স সঞ্চয় করে রাখা উচিত, যার বর্তমান স্তরের / মানচিত্রের একটি রেফারেন্স থাকতে পারে, যাতে কোনও পদ্ধতির মতো player.moveTo(x, y)
দরকার নেই প্যারামিটার হিসাবে স্পষ্টভাবে মানচিত্র দেওয়া হবে।
একইভাবে, যদি আমাদের খেলোয়াড়ের চরিত্রটি তাদের আশেপাশে অনুসরণ করে, তবে একটি পোষা কুকুর তাদের চারপাশে অনুসরণ করত, আমরা স্বাভাবিকভাবেই কুকুরটিকে একক বস্তুতে বর্ণিত সমস্ত রাষ্ট্রীয় ভেরিয়েবলগুলি গ্রুপ করতাম এবং প্লেয়ারটিকে বস্তুর কুকুরের জন্য একটি রেফারেন্স দিতাম (যাতে খেলোয়াড়টি পারে , বলুন, কুকুরটিকে নাম ধরে কল করুন) এবং বিপরীতে (যাতে কুকুরটি জানতে পারে যে খেলোয়াড়টি কোথায়)। এবং অবশ্যই, আমরা সম্ভবত খেলোয়াড় এবং কুকুরটিকে দুটি আরও জেনেরিক "অভিনেতা" অবজেক্টের সাবক্লাস তৈরি করতে চাই, যাতে আমরা একই কোডটি পুনরায় ব্যবহার করতে পারি, বলি, উভয় মানচিত্রের চারদিকে ঘোরাতে পারি।
গীত। যদিও আমি একটি গেম একটি উদাহরণ হিসাবে ব্যবহার করেছি, অন্যান্য ধরণের প্রোগ্রাম রয়েছে যেখানে এই জাতীয় সমস্যাগুলিও আসে। যদিও আমার অভিজ্ঞতায় অন্তর্নিহিত সমস্যাটি সর্বদা একই রকম থাকে: আপনার পৃথক ভেরিয়েবলের একগুচ্ছ (স্থানীয় বা বিশ্বব্যাপী) যা সত্যিই এক বা একাধিক আন্তঃসংযোগযুক্ত বস্তুর সাথে একত্রে বাঁধতে চায়। আপনার ক্রিয়াকলাপগুলিতে প্রবেশকারী "ট্র্যাম্প ডেটা" কোনও "বৈশ্বিক" বিকল্প সেটিংস বা সংখ্যাসূচক সিমুলেশনে ক্যাশেড ডাটাবেস প্রশ্নগুলি বা স্টেট ভেক্টর নিয়ে গঠিত হোক না কেন, সমাধানটি অনায়াসে প্রাকৃতিক প্রসঙ্গটি ডেটা সম্পর্কিত এবং এটি একটি অবজেক্টে তৈরি করে (বা আপনার নির্বাচিত ভাষায় নিকটতম সমতুল্য যেকোনোটিই)।