কেন কোনও বিল্ডারকে তার নিজস্ব বর্গ ফাইলের পরিবর্তে অভ্যন্তরীণ শ্রেণি হওয়া উচিত?


24

অনেক Builder Patternউদাহরণ Builderউদাহরণস্বরূপ এটি তৈরি করে এমন একটি অভ্যন্তর শ্রেণি তৈরি করে।

এটি কিছুটা বোধগম্য হয় যেহেতু এটি কীটি Builderতৈরি করে তা নির্দেশ করে। যাইহোক, একটি স্ট্যাটিকালি টাইপ করা ভাষায় আমরা জানি কী Builderতৈরি হয়।

অন্যদিকে যদি এটি Builderএকটি অভ্যন্তর শ্রেণি হয় তবে আপনার অবশ্যই জানা উচিত যে কোন শ্রেণীর Builderভিতরে না তাকিয়ে সেগুলি তৈরি করে Builder

এছাড়াও, নির্মাতাকে অভ্যন্তরীণ শ্রেণি হিসাবে রাখার ফলে আমদানির সংখ্যা হ্রাস হয় কারণ এটি বাইরের শ্রেণি দ্বারা রেফারেন্স করা যায় - যদি আপনি সে বিষয়ে যত্নবান হন।

এবং তারপরে ব্যবহারিক উদাহরণ রয়েছে যেখানে Builderএকই প্যাকেজে রয়েছে তবে কোনও অভ্যন্তরীণ শ্রেণি নয় StringBuilder। আপনি জানেন যে এটি তৈরি করা Builder উচিতString কারণ এটির নামকরণ হয়েছে।

বলা হচ্ছে, কেবলমাত্র Builderএকটি অভ্যন্তরীণ শ্রেণী তৈরির জন্য আমি কেবলমাত্র ভাল কারণটিই বলতে পারি তা হল আপনি জানেন যে ক্লাসটি কী তা ' Builderনামটি না জেনে বা নামকরণের সম্মেলনে নির্ভর না করে what উদাহরণস্বরূপ, যদি আমি StringBuilderএকটি অভ্যন্তরীণ শ্রেণি Stringহত তবে এটি সম্ভবত আমার আগে থেকে ধারণা করা হত (অনুমানমূলক)।

Builderঅভ্যন্তরীণ শ্রেণি তৈরির জন্য অন্য কোনও কারণ রয়েছে বা এটি কেবল পছন্দ এবং আচারে নেমে আসে?

উত্তর:


30

আমি মনে করি এটি করার কারণটি হ'ল অভ্যন্তরীণ শ্রেণি (বিল্ডার) শ্রেণিটি যে নির্মাণ করছে তার ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে।

Http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html থেকে

অ-স্থির নেস্টেড ক্লাসগুলি (অভ্যন্তরীণ ক্লাসগুলি) বেসরকারী শ্রেণীর অন্যান্য সদস্যদের ব্যক্তিগত হিসাবে ঘোষিত হলেও তাদের অ্যাক্সেস রয়েছে।

...

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

...

উদাহরণস্বরূপ পদ্ধতি এবং ভেরিয়েবলগুলির মতো, একটি অভ্যন্তরীণ বর্গ তার বদ্ধ শ্রেণীর উদাহরণের সাথে সম্পর্কিত এবং সেই বস্তুর পদ্ধতি এবং ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেস রয়েছে access

এটি চিত্রিত করার চেষ্টা করার জন্য এখানে কিছু কোড রয়েছে:

class Example {

    private int x;

    public int getX() { return this.x; }

    public static class Builder {

        public Example Create() {
            Example instance = new Example();
            instance.x = 5; // Builder can access Example's private member variable
            return instance;
        }
    }
}

স্থির শ্রেণি হিসাবে, বিল্ডারের সাথে উদাহরণটির নির্দিষ্ট উদাহরণ নেই যা এটি আবদ্ধ। তবে উদাহরণের উদাহরণ দেওয়া (বা এটি নিজে তৈরি করে এমন একটি) বিল্ডার এখনও সেই উদাহরণটির ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারেন।


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

1
@ নাথানিয়াল একেবারেই নয়, বেসরকারী উদাহরণের ভেরিয়েবলগুলিও অ্যাক্সেসযোগ্য: আদর্শ one.com/7ডিজডিআর
amon

1
@ নাথানিয়াল: হ্যাঁ, তবে নির্মাতা ক্লাসটি চালাচ্ছেন না; এটি শ্রেণীর কোনও অবয়বকে চালিত করে যা নির্মাতা নিজেই তাত্ক্ষণিকভাবে চালিয়েছেন।
রবার্ট হার্ভে

@ আমি আপনাকে সেখানে কী করেছি তা আমি দেখতে পাচ্ছি। ব্যাখ্যা করার জন্য ধন্যবাদ!
নাথানিয়াল

বিশেষত, এটি শ্রেণিটি নির্মিত হওয়ার জন্য একটি প্রাইভেট কনস্ট্রাক্টরকে বিল্ডারকে অ্যাক্সেস দেয়, যাতে সেই শ্রেণিটি অপরিবর্তনীয় (সমস্ত ক্ষেত্র চূড়ান্ত) হতে পারে এবং কেবল বিল্ডারের মাধ্যমে অস্থির হয়।
ম্যাথু ম্যাকপিক

1

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


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