একটি শ্রেণীর সমস্ত বস্তুর উপর নজর রাখা


9

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

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

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

আমি একটি স্ট্যাটিক অ্যারে বা সংগ্রহ সম্পর্কে ভেবেছিলাম, যার সাথে এটির নির্মাণকারীর মাধ্যমে তৈরি প্রতিটি নতুন বস্তু যুক্ত করা হবে। এটি তবে সাবক্লাসগুলির সাথে কাজ করবে না, যেহেতু নির্মাণকারীরা উত্তরাধিকারসূত্রে নয়?

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


5
ট্র্যাক এবং ট্র্যাকারের আরও নির্দিষ্ট উদাহরণ সাহায্য করতে পারে এই সমস্যাটি প্রসঙ্গের উপর নির্ভর করে, তারা কীভাবে ব্যবহৃত হয় ইত্যাদি বিভিন্নভাবে পরিচালিত হয়।
জাস্টিনসি

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

1
"বিভিন্ন উদ্দেশ্যে তাদের মাধ্যমে পুনরাবৃত্তি" ... যেমন ...? সাধারণত কোনও জিনিসের একজন 'মালিক' থাকে (কোনও আনুষ্ঠানিক শব্দ নয়, প্রোগ্রাম শব্দার্থক সম্পর্কে আরও একটি বিবৃতি), এবং অন্য কারও পক্ষে অবজেক্টটির সাথে 'বিভিন্ন উদ্দেশ্য' রাখার পক্ষে নয়।
আকাশম

উত্তর:


8

আমি জানি না কেন আপনাকে কোনও শ্রেণীর সমস্ত দৃষ্টান্তের একটি তালিকা রাখা দরকার।

এটি মেমরি ফুটো হওয়ার কারণ যেহেতু objects বস্তুগুলি কখনই নিষ্পত্তি হবে না, যেহেতু তালিকাটি অন্য কোনও শ্রেণি না করার পরে তাদের রেফারেন্স করবে।

তবে আপনি যদি সত্যিই সেই রুটটি অনুসরণ করতে চান:

  1. কারখানার প্যাটার্নটি ব্যবহার করুন। এমন একটি ফ্যাক্টরি ক্লাস যা পদ্ধতিগুলির সাথে শ্রেণিটি তত্ক্ষণিত করে এবং বস্তুগুলি ফেরত দেয়। এইভাবে ইনস্ট্যান্টেশনগুলি নিয়ন্ত্রণ করার জন্য আপনার একটি কেন্দ্রীয় বিন্দু রয়েছে।
  2. উদাহরণস্বরূপ থাকা একটি তালিকা বা তালিকা ধরে রাখতে সিঙ্গলটন প্যাটার্নটি ব্যবহার করুন।
  3. কারখানাটি তৈরি করার পরে একটি নির্দিষ্ট ধরণের প্রতিটি বস্তুকে একটি তালিকায় রাখুন।

উপায় দ্বারা: নির্মাণকারীরা উত্তরাধিকারসূত্রে প্রাপ্ত।


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

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

অত: পর তা রেজিস্টার কারখানা কহন, এটা কি সৃষ্টি কারখানা সম্পর্কে অবগত থাকুন থাকার বরং বস্তুর চেয়ে ...
jwenting

একটি সিঙ্গলটন প্রযুক্তিগতভাবে আমার অনুমান অনুসারে সমস্ত দমন করবে। একটি একক উদাহরণ।
রিগ

3

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

আমি একটি স্ট্যাটিক অ্যারে বা সংগ্রহ সম্পর্কে ভেবেছিলাম, যার সাথে এটির নির্মাণকারীর মাধ্যমে তৈরি প্রতিটি নতুন বস্তু যুক্ত করা হবে। এটি তবে সাবক্লাসগুলির সাথে কাজ করবে না, যেহেতু নির্মাণকারীরা উত্তরাধিকারসূত্রে নয়?

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


2

গেমস তৈরি করার সময় লোকেরা মাঝে মধ্যে প্রতিটি ধরণের গেম অবজেক্টের "স্ব-পরিচালন" সংগ্রহ চায়।

একটি বাস্তবায়ন দেখে মনে হচ্ছে:

public class Car {

    static ArrayList<Car> list = new ArrayList<Car>();

    public Car() {
        list.add(this);
    }

    void kill() {
        list.remove(this);
    }

    static public void updateAll()
    {
        for (int i = list.size() - 1; i >= 0; i--)
        {
                list.get(i).update();
        }
    }

    public void update()
    {
        //update logic
    }
}

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

যদিও খুব সাধারণ দৃশ্যের জন্য সূক্ষ্ম , এমনকি মাঝারি জটিলতার সাথে পৃথক ব্যবস্থাপক শ্রেণি তৈরি করা ভাল।


1
আপনি সরাসরি static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();উত্তর লিখতে পারেন স্ট্যাটাস sup ..
cl

2
জাভা পদ্ধতির নাম একটি ছোট হাতের অক্ষর দিয়ে শুরু হয়:uptdateAll(){..;}
cl-r

ওফ ... কিছুক্ষণ হয়ে গেছে যখন আমি প্রকাশ্যে আমার জাভা প্রচার করেছি
কেলি টমাস

@ কেলি থমাস একটি গাড়ি নিজেকে তালিকায় যুক্ত করছে, তারা এটিকে এটিকে থেকে সরিয়ে নিচ্ছে। অপ্রাকৃত লাগছে।
তুলাইনস কর্ডোভা

1
@ কেয়েটানোগনালভসকে স্থির ক্ষেত্র হিসাবে এটি সমস্ত দৃষ্টিকোণ দ্বারা ভাগ করা একটি তালিকা।
কেলি টমাস

2

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

কারেন্টএলিয়েনস নামে একটি সম্পত্তি থাকা স্পেসের পক্ষে একেবারেই প্রাকৃতিক, এটি একটি অ্যারে হবে, যেখানে আপনি তৈরি প্রতিটি নতুন এলিয়েন যুক্ত করবেন add আপনি যদি নিজের ব্যবহারকারীকে স্পেসটাইমের ফ্যাব্রিক ছিঁড়ে ফেলার এবং সমস্ত এলিয়েনকে একবারে নষ্ট করার অনুমতি দিতে চান, আপনি সেই সংগ্রহের মাধ্যমে পুনরুক্তি করতে এবং প্রতিটি বস্তুকে ধ্বংস করতে পারবেন।

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

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