একই বস্তুকে একাধিক জায়গা থেকে রেফারেন্স করা হলে কীভাবে কার্যকরী প্রোগ্রামিং পরিস্থিতি পরিচালনা করতে পারে?


10

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

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

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

প্রথম উদাহরণটি হ'ল আমার সি # গেমটি আমি আমার অতিরিক্ত সময় তৈরির চেষ্টা করছি । এটি টার্ন-ভিত্তিক ওয়েব গেম যেখানে উভয় খেলোয়াড়েরই 4 টি দানব রয়েছে এবং তারা তাদের দল থেকে একটি রাক্ষসকে যুদ্ধের ময়দানে পাঠাতে পারে, যেখানে এটি বিরোধী খেলোয়াড়ের পাঠানো দানবের মুখোমুখি হবে। খেলোয়াড়রা যুদ্ধক্ষেত্র থেকে দানবগুলিকেও স্মরণ করতে পারে এবং তাদের দল থেকে অন্য দানব (একইভাবে পোকেমন-এর মতো) দিয়ে প্রতিস্থাপন করতে পারে।

এই সেটিংয়ে, একক দানবকে কমপক্ষে 2 টি স্থান থেকে স্বাভাবিকভাবেই উল্লেখ করা যেতে পারে: একটি খেলোয়াড়ের দল এবং যুদ্ধক্ষেত্র, যা দুটি "সক্রিয়" দানবদের উল্লেখ করে।

এখন আসুন পরিস্থিতিটি বিবেচনা করুন যখন কোনও দানব আঘাতপ্রাপ্ত হয় এবং 20 টি স্বাস্থ্য পয়েন্ট হারিয়ে ফেলে। আবশ্যকীয় দৃষ্টান্তের বন্ধনীগুলির মধ্যে আমি এই দৈত্যের healthক্ষেত্রটি পরিবর্তনটি প্রতিবিম্বিত করতে এই পরিবর্তনটি করেছি - এবং আমি এখন এটি করছি। যাইহোক, এটি Monsterশ্রেণিটিকে পরিবর্তনযোগ্য এবং সম্পর্কিত ফাংশনগুলি (পদ্ধতিগুলি) অপরিষ্কার করে তোলে , যা আমি অনুমান করি যে এটি এখনকার হিসাবে খারাপ অভ্যাস হিসাবে বিবেচিত হয়।

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

ক্রিয়ামূলক শৈলীতে, যেমনটি আমি এটি বুঝতে পারি, পরিবর্তে আমি এই Monsterবস্তুর একটি অনুলিপি তৈরি করব , এটি এই ক্ষেত্রটি বাদে পুরানোটির সাথে অভিন্ন; এবং পদ্ধতিটি suffer_hitজায়গায় পুরানোটিকে পরিবর্তনের পরিবর্তে এই নতুন অবজেক্টটি ফিরিয়ে দেবে। তারপরে আমি একইভাবে Battlefieldএই দানবটি বাদে তার সমস্ত ক্ষেত্র একই করে রাখি copy

এটি কমপক্ষে 2 টি সমস্যা নিয়ে আসে:

  1. শ্রেণিবিন্যাস সহজেই Battlefield-> এর সহজ সরল উদাহরণের চেয়ে অনেক গভীর হতে পারে Monster। আমাকে এই ক্ষেত্রটি বাদ দিয়ে সমস্ত ক্ষেত্রের অনুলিপি করা এবং একটি নতুন অবজেক্টটি ফিরিয়ে আনতে হবে। এটি বয়লারপ্লেট কোড হবে যা আমি বিরক্তিকর বলে মনে করি বিশেষত যেহেতু কার্যকরী প্রোগ্রামিংয়ের বয়লারপ্লেট হ্রাস করার কথা।
  2. তবে আরও একটি গুরুতর সমস্যা হ'ল এটি ডেটা সিঙ্কের বাইরে চলে যাবে । ক্ষেত্রের সক্রিয় দৈত্যটি তার স্বাস্থ্য হ্রাস দেখতে পাবে; তবে এটির নিয়ন্ত্রণকারী প্লেয়ার থেকে উল্লেখ করা এই একই দানবটি Teamতা করবে না। আমি এর পরিবর্তে অনুজ্ঞাসূচক শৈলী আশ্লিষ্ট পারেন, তথ্য প্রতিটি পরিমার্জন কোডের এবং আপনার ডিভাইসে এক আমি এটা সত্যিই সুবিধাজনক এটি মত এই ক্ষেত্রে অন্য সব জায়গা থেকে অবিলম্বে দৃশ্যমান হবে - কিন্তু উপায় আমি পেয়ে করছি এই হল অবিকল মানুষের বলে অপরিহার্য শৈলীতে ভুল!
    • এখন Teamপ্রতিটি আক্রমণের পরে যাত্রা করে এই বিষয়টির যত্ন নেওয়া সম্ভব হবে । এটি অতিরিক্ত কাজ। তবে, যদি কোনও দৈত্যকে হঠাৎ আরও বেশি জায়গা থেকে রেফারেন্স করা যায় তবে কী হবে? যদি আমি এমন কোনও দক্ষতা নিয়ে আসি যা উদাহরণস্বরূপ, কোনও দৈত্যকে অন্য দৈত্যের দিকে মনোনিবেশ করতে দেয় যা অগত্যা মাঠে না আসে (আমি আসলে এই জাতীয় ক্ষমতা বিবেচনা করছি)? আমি কী অবশ্যই প্রতিটি আক্রমণের পরে অবিলম্বে দৃষ্টি নিবদ্ধ দানবদের ভ্রমণ করতে মনে করব ? কোডটি আরও জটিল হয়ে উঠলে এটি বিস্ফোরিত হবে এমন একটি টাইম বোমা বলে মনে হচ্ছে, সুতরাং আমি মনে করি এটি কোনও সমাধান নয়।

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

আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল প্রতিটি সুযোগকে একটি আইডি নির্ধারণ এবং মোনাদে সমস্ত স্কোপের একটি কেন্দ্রীয় অভিধান রাখা State। এখন ভেরিয়েবলগুলি কেবল স্কোপের চেয়ে তাদের যে স্কোপ থেকে আবদ্ধ ছিল তার আইডি ধরে রাখবে এবং নেস্টেড স্কোপগুলি তাদের পিতামাত স্কোপের আইডিও ধারণ করবে।

আমার অনুমান যে আমার দানব যুদ্ধের খেলায় একই পদ্ধতির চেষ্টা করা যেতে পারে ... ক্ষেত্র এবং দলগুলি দানবদের রেফারেন্স দেয় না; তারা পরিবর্তে একটি কেন্দ্রীয় দৈত্য অভিধানে সংরক্ষিত দানবগুলির আইডি রাখে।

তবে আমি এই পদ্ধতির সাথে আবারও একটি সমস্যা দেখতে পাচ্ছি যা সমস্যার সমাধান হিসাবে বিনা দ্বিধায় এটিকে গ্রহণ করতে আমাকে বাধা দেয়:

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

আমি আরও বেশি তীব্র বলে মনে হচ্ছে অ্যাসিকন্ড সমস্যা সম্পর্কে লিখতে যাচ্ছিলাম: এই পদ্ধতির মাধ্যমে মেমরি ফাঁস প্রবর্তিত হয় । অ্যাক্সেসযোগ্য অবজেক্টগুলি সাধারণত জঞ্জাল সংগ্রহ করা হবে। তবে, কোনও কেন্দ্রীয় অভিধানে রাখা অবজেক্টগুলি আবর্জনা সংগ্রহ করা যাবে না, এমনকি যদি কোনও ਪਹੁੰਚযোগ্য বস্তু এই নির্দিষ্ট আইডির উল্লেখ না করে। এবং তাত্ত্বিকভাবে সতর্ক প্রোগ্রামিং যখন মেমরি ফাঁস এড়াতে পারে (আমরা প্রতিটি অভিধানের প্রয়োজন নেই তখন কেন্দ্রীয় অভিধান থেকে ম্যানুয়ালি মুছে ফেলার যত্ন নিতে পারি), এটি ত্রুটিযুক্ত এবং এফপি প্রোগ্রামগুলির যথার্থতা বাড়ানোর জন্য বিজ্ঞাপনিত হয় যাতে এটি আবারও হতে পারে সঠিক উপায় না।

যাইহোক, আমি সময়মতো খুঁজে পেয়েছি যে এটি বরং এটি একটি সমাধান করা সমস্যা বলে মনে হচ্ছে। জাভা সরবরাহ করে WeakHashMapযা এই সমস্যাটি সমাধান করতে ব্যবহৃত হতে পারে। সি # একটি অনুরূপ সুবিধা সরবরাহ করে - ConditionalWeakTable- যদিও ডক্স অনুসারে এটি সংকলকগণ দ্বারা ব্যবহার করা বোঝানো হয়েছিল। এবং হাস্কেলে আমাদের সিস্টেম.মিম.উইক রয়েছে

এই জাতীয় অভিধান সংরক্ষণ করা কি এই সমস্যার সঠিক কার্যকরী সমাধান বা এর চেয়ে সহজ সরল একটি যা আমি দেখতে ব্যর্থ হয়েছি? আমি কল্পনা করি যে এই জাতীয় অভিধানের সংখ্যা সহজেই বা খারাপভাবে বৃদ্ধি পেতে পারে; সুতরাং যদি এই কথাসাহিত্যগুলিকেও অবিচ্ছেদ্য বলে মনে করা হয় তবে এর অর্থ অনেকগুলি প্যারামিটার-পাসিং হতে পারে বা ভাষাগুলি যা সমর্থন করে যে, একাকী গণনা, যেহেতু অভিধানগুলি মনাদে অনুষ্ঠিত হবে (তবে আবার আমি পড়ছি যে পুরোপুরি কার্যকরীভাবে) যতটা সম্ভব সংক্ষিপ্ত কোডগুলি ভাষাগুলি monadic হওয়া উচিত, যদিও এই অভিধানের সমাধানটি প্রায় সমস্ত Stateকোডকে মোনাডের ভিতরে রাখে ; যা আমাকে আবার সন্দেহ করে তোলে এটি সঠিক সমাধান কিনা।)

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


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

8
ক্রিয়ামূলক অপরিবর্তনীয়তা এবং গেম প্রোগ্রামিং সম্পর্কে নোংরা সামান্য রহস্যটি হ'ল এই দুটি জিনিস একে অপরের সাথে একরকম বেমানান। আপনি স্থিতিশীল, অস্থাবর ডেটা স্ট্রাকচার ব্যবহার করে মূলত একটি গতিময়, সদা-পরিবর্তনশীল সিস্টেমকে মডেল করার চেষ্টা করছেন।
রবার্ট হার্ভে

2
পরিবর্তনীয়তা বনাম অপরিবর্তনীয়তাটিকে ধর্মীয় মতবাদ হিসাবে গ্রহণ করবেন না। এমন পরিস্থিতি রয়েছে যেখানে প্রতিটি অপরের চেয়ে ভাল, অপরিবর্তনশীলতা সর্বদা ভাল হয় না, উদাহরণস্বরূপ, অপরিবর্তনীয় ডেটা প্রকারের সাথে জিইউআই টুলকিট লেখা একটি নিখুঁত দুঃস্বপ্ন হবে।
শে

1
এই সি # বিশিষ্ট প্রশ্ন এবং এর উত্তরগুলি বয়লারপ্লেটের বিষয়টি কভার করে, বেশিরভাগ ক্ষেত্রে বিদ্যমান বিদ্যমান অপরিবর্তনীয় বস্তুর সামান্য-পরিবর্তিত (আপডেট) ক্লোন তৈরি করার প্রয়োজন থেকে আসে from
রওয়ং

2
একটি মূল অন্তর্দৃষ্টি হ'ল এই গেমের কোনও দৈত্যকে একটি সত্তা হিসাবে বিবেচনা করা হয়। এছাড়াও, প্রতিটি যুদ্ধের ফলাফল (যুদ্ধের অনুক্রমের সংখ্যা, দানবগুলির সত্তার আইডি, যুদ্ধের আগে এবং পরে দানবের রাজ্যগুলি নিয়ে গঠিত) একটি নির্দিষ্ট সময়-পয়েন্টে (বা সময়ের ধাপ) একটি রাষ্ট্র হিসাবে বিবেচিত হয়। সুতরাং, খেলোয়াড়রা ( Team) যুদ্ধের ফলাফল পুনরুদ্ধার করতে পারে এবং এইভাবে একটি (যুদ্ধের সংখ্যা, দানব সত্তা আইডি) টিপল দ্বারা দানবদের রাজ্যগুলি অর্জন করতে পারে।
রোবং

উত্তর:


19

কীভাবে কার্যকরী প্রোগ্রামিং একাধিক জায়গা থেকে রেফারেন্স করা কোনও বস্তু পরিচালনা করে? এটি আপনাকে আপনার মডেলটি পুনরায় দেখার জন্য আমন্ত্রণ জানায়!

ব্যাখ্যার জন্য ... আসুন দেখে নেওয়া যাক নেটওয়ার্ক গেমগুলি কীভাবে কখনও কখনও লেখা হয় - গেমের রাজ্যের কেন্দ্রীয় "স্বর্ণের উত্স" অনুলিপি সহ এবং আগত ক্লায়েন্ট ইভেন্টগুলির একটি সেট যা সেই রাজ্যটিকে আপডেট করে এবং তারপরে অন্যান্য ক্লায়েন্টদের কাছে আবার সম্প্রচারিত হয় with ।

কিছু পরিস্থিতিতে ভাল আচরণ করার জন্য ফ্যাক্টরিও দলটি যে মজা পেয়েছিল তা সম্পর্কে আপনি পড়তে পারেন ; এখানে তাদের মডেলটির একটি সংক্ষিপ্ত বিবরণ:

আমাদের মাল্টিপ্লেয়ার যে কাজ করে তার মূল উপায়টি হ'ল সমস্ত ক্লায়েন্টরা গেমের অবস্থা অনুকরণ করে এবং তারা কেবল প্লেয়ারের ইনপুট গ্রহণ করে এবং প্রেরণ করে (যাকে ইনপুট অ্যাকশনস বলা হয়)। সার্ভারের প্রধান দায়িত্ব হ'ল ইনপুট ক্রিয়াগুলি প্রক্সিং করা এবং তা নিশ্চিত করা যে সমস্ত ক্লায়েন্ট একই টিকের মধ্যে একই ক্রিয়াকলাপ সম্পাদন করে।

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

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

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

মূল বিষয়টি হ'ল প্রতিটি লাইনের স্থিতি সময় লাইনের নির্দিষ্ট টিকটিতে অপরিবর্তনীয় । বিশ্বব্যাপী মাল্টিপ্লেয়ার রাষ্ট্রের প্রতিটি কিছুর অবশ্যই অবশেষে একটি নির্বিচার বাস্তবতায় রূপান্তর করতে হবে।

এবং - এটি আপনার প্রশ্নের মূল বিষয় হতে পারে। প্রতিটি সত্তার রাজ্য কোনও নির্দিষ্ট টিকের জন্য অপরিবর্তনীয় এবং আপনি সেই সংক্রমণের ইভেন্টগুলি ট্র্যাক করে রাখুন যা সময়ের সাথে সাথে নতুন উদাহরণ তৈরি করে।

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

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

সুতরাং, একটি বিস্তৃত গাইড হিসাবে, দৈত্যের রাজ্যটিকে কয়েকটি ছোট ছোট বস্তুতে ভাঙ্গার বিবেচনা করুন যা বলুন, অবস্থান / গতি / পদার্থবিজ্ঞান, স্বাস্থ্য / ক্ষতি, সম্পদ। ঘটতে পারে এমন প্রতিটি মিউটেশন বর্ণনা করার জন্য একটি ইভেন্ট তৈরি করুন এবং আপনার মূল লুপটি এইভাবে চালান:

  1. প্রক্রিয়া ইনপুট এবং সম্পর্কিত ইভেন্ট উত্পন্ন
  2. অভ্যন্তরীণ ইভেন্টগুলি উত্পন্ন করুন (যেমন বস্তুর সংঘর্ষের কারণে ইত্যাদি)
  3. পরবর্তী টিকের জন্য নতুন দানবগুলি তৈরি করতে, বর্তমান অপরিবর্তনীয় দানবগুলিতে ইভেন্ট প্রয়োগ করুন - বেশিরভাগ যেখানে সম্ভব সেখানে পুরানো অপরিবর্তিত রাজ্যের অনুলিপি করা, তবে যেখানে প্রয়োজন সেখানে নতুন রাষ্ট্রীয় অবজেক্ট তৈরি করুন।
  4. পরবর্তী টিক জন্য রেন্ডার এবং পুনরাবৃত্তি।

বা এমন কিছু। আমি ভাবছি "আমি কীভাবে এই বিতরণ করব?" জিনিসগুলি কোথায় থাকে এবং কীভাবে সেগুলি বিকশিত হয় সে সম্পর্কে আমি যখন বিভ্রান্ত হই তখন সাধারণত আমার বোঝার সংশোধন করার জন্য সাধারণতঃ একটি ভাল মানসিক অনুশীলন।

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


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

@ অ্যারোনএম.এশবাচ এটাই! আমি যদি আপনার মন্তব্যে / উত্তরে উত্তরে অন্তর্ভুক্ত করি তবে কি আপত্তি আছে? এটি এটিকে আরও প্রামাণ্য বলে মনে করে। ধন্যবাদ!
সুসানডাব্লু

অবশ্যই না, করুন।
হারুন এম। ইশবাচ

3

অপরিহার্য শিবিরে আপনি এখনও অর্ধেক রয়েছেন। একবারে কোনও একক বস্তুর কথা চিন্তা না করে আপনার গেমটি নাটক বা ইভেন্টের ইতিহাসের দিক দিয়ে ভাবুন

p1 - send m1 to battlefield
p2 - send m2 to battlefield
m1 - attacks m2 (2 dam)
m2 - attacks m1 (10 dam)
p1 - retreats m1

ইত্যাদি

অপরিবর্তনীয় রাষ্ট্রের অবজেক্ট তৈরি করতে ক্রিয়াগুলি এক সাথে শৃঙ্খলাবদ্ধ করে আপনি যে কোনও নির্দিষ্ট সময়ে গেমের অবস্থা গণনা করতে পারেন। প্রতিটি নাটক একটি ফাংশন যা একটি রাষ্ট্রের অবজেক্ট নেয় এবং একটি নতুন রাষ্ট্রের বস্তু দেয় returns

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.