কখনই রিবুটিং টেস্ট ওয়ার্ল্ড বাস্তবায়ন করবেন?


23

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

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

এই যে জিনিসটা. ভবিষ্যতে (এবং বর্তমানে অস্তিত্বহীন) কীভাবে কীভাবে সনাক্ত / লোড / ট্র্যাক করতে হবে তা জানতে আমার কী ধরণের কাঠামো / নকশা তৈরি করতে হবে তা আমি জানি না।

আপনি জাভা ব্যবহার করে এমন কিছু করবেন কীভাবে কোনও ধারণা?


2
অনেকটা গরম অদলবদলের মতো শোনাচ্ছে । সম্ভবত এই বিষয়ে কিছু সাহিত্য রয়েছে যা সহায়ক হতে পারে। যাইহোক, খুব আকর্ষণীয় প্রশ্ন। +1…
কনরাড রুডল্ফ

উত্তর:


5

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

interface Entity {
   void init(World world);
   // Called when loaded for the first time in the world and adds itself
   // to the world (correct position in the array, scheduler for updates)

   void update(World world);
   // Called when scheduler fires (allows the entity to think about its
   // next move)

   Image getImage();
   // Called by the GUI when it is time to draw the entity on the screen
}

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

void injectEntity(String filename, World world) {
    // Load the class as described in the mentioned link
    Entity e = (Entity) loadClass(filename);
    e.init(world);
}

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

void init(World world) {
   // Register entity with world for easy access
   world.register(this, "RockImpl A");

   // Place the entity on the world map
   Point initialLocation = Point(10,5);
   world.place(this, initialLocation);

   // Schedule its update method for every 5 seconds
   world.schedule(this, 5);
}

1
গুগলে কীওয়ার্ড: "আইওসি পাত্রে", "নিয়ন্ত্রণের বিপরীতমুখী", "নির্ভরতা ইনজেকশন"। এগুলি জেনেরিক হট-প্লাগেবল সিস্টেমগুলির কৌশল, যা রানটাইমে উপাদানগুলি আবিষ্কার এবং লোড করতে পারে।
মনে রাখবেন না

16

অভিযানের জন্য আমরা স্ট্যান্ডেলে এমন কিছু করেছি ।

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

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

মারিয়া.জভা একটি সহজ উদাহরণ। তিনি একটি নতুন এনপিসি যা খেলোয়াড়দের জন্য পানীয় এবং খাবার বিক্রি করে। আমরা সেখানে খুব জটিল বস্তুর সংজ্ঞা দিতে পারি ।

একটি নতুন শ্রেণি এভাবে চালিত হয়:

// create a new class loader, with the script folder as classpath.
final File file = new File("./data/script");
final ClassLoader loader = new URLClassLoader(new URL[]{file.toURI().toURL()});

// load class through new loader
final Class< ? > aClass = loader.loadClass(classname);
script = (Script) aClass.newInstance();

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

আনলোড করা অবশ্য বেশ গুরুত্বপূর্ণ মনে হচ্ছে। এটি অর্জন করতে, আপনি যখনই নতুন কোড ইনজেক্ট করতে চান তখন আপনাকে নতুন শ্রেণির লোডার ইনস্ট্যান্ট করতে হবে। যাতে জিসি সেই কোডটির শেষ রেফারেন্সটি সাফ হওয়ার পরে তার কাজটি করতে পারে।

আমাদের কাছে একটি / আনলোড কমান্ড রয়েছে যা আমাদের ইন্টারফেসে একটি আনলোড প্রক্রিয়া শুরু করে যাতে স্ক্রিপ্টগুলি ক্লিনআপ করতে পারে। আসল আনলোডটি স্বয়ংক্রিয়ভাবে জিসি দ্বারা সম্পন্ন হয়।

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

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


3

বিশ্বকে সংরক্ষণ করুন (কোনও পাং উদ্দেশ্য নয়) এবং এর সমস্ত রাজ্য (অবস্থান, বেগ, সমস্ত পরিবর্তনশীল)।

  • প্রোগ্রাম বন্ধ করুন।
  • পরিবর্তনগুলি প্রয়োগ করুন (সংরক্ষণের সাথে পিছনে সামঞ্জস্য নিশ্চিত করা)।
  • প্রোগ্রামটি পুনরায় কম্পাইল করুন।
  • প্রোগ্রাম পুনরায় চালু করুন।
  • বিশ্ব এবং রাষ্ট্র লোড করুন।
  • পুনরাবৃত্তি

এটি যদিও একটি সাধারণ সমাধান, আপনি জাভাকে কোড ব্লক এবং আপনার আশার মতো ক্লাসগুলি কার্যকরভাবে প্রয়োগ করতে পারবেন কিনা তা জানার জন্য আমি নির্দিষ্ট করে নিই না ...

বিকল্প 2 , হ'ল একটি স্ক্রিপ্টিং ভাষা বাঁধাই যা ফ্লাইতে লোড করা যায়।


স্ক্রিপ্টিং ভাষার জন্য +1। আপনি যদি জাভাতে আবদ্ধ না হন তবে এলপিসি ভিত্তিক কিছু এমইউডি ড্রাইভার এবং মুডলিব চেষ্টা করে দেখুন।
মার্টিন সোজকা

1

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

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