আপনি কখন একটি বেসরকারী / অভ্যন্তরীণ ক্লাস ব্যবহার করা উচিত?


21

পরিষ্কার করার জন্য, আমি যা সম্পর্কে জিজ্ঞাসা করছি তা

public class A{
    private/*or public*/ B b;
}

বনাম

public class A{
    private/*or public*/ class B{
        ....
    }
}

আমি অবশ্যই একটি বা অন্যটি ব্যবহার করার কয়েকটি কারণ সম্পর্কে ভাবতে পারি, তবে আমি যা দেখতে চাই তা দৃinc়প্রত্যয়ী উদাহরণ যা এগুলি দেখায় যে উপকারিতা এবং নীতিগুলি কেবল একাডেমিক নয়।


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

একাডেমিক উদাহরণগুলি যথেষ্ট ভাল না হলে একটি দৃ a়প্রত্যয়ী উদাহরণ কী হবে?

অভ্যন্তরীণ ক্লাসগুলি বাইরে থেকে দৃশ্যমান হলে @ জোব স্টাইলকপ কেবলমাত্র একটি সতর্কতা দেবে। যদি এটি ব্যক্তিগত হয় তবে এটি সম্পূর্ণরূপে ঠিক আছে এবং আসলে এর অনেকগুলি ব্যবহার রয়েছে।
জুলাইআলগন

উত্তর:


20

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


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

9

মনে করুন আপনি একটি গাছ, একটি তালিকা, একটি গ্রাফ এবং আরও কিছু তৈরি করছেন। আপনার নোড বা একটি ঘরের অভ্যন্তরীণ বিশদটি বহিরাগতকে কেন প্রকাশ করা উচিত?

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

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

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


5

আমার মতে এটা শ্রেণীর ব্যবহার করা জন্য অভ্যন্তরীণভাবে-সংজ্ঞায়িত শ্রেণীর ব্যবহার করার জন্য একটি ন্যায্য পুলিশ সংক্ষিপ্তভাবে একটি বর্গ মধ্যে একটি নির্দিষ্ট কাজের অনুমতি দেয়।

উদাহরণস্বরূপ, যদি আপনার দুটি সম্পর্কযুক্ত শ্রেণীর সমন্বয়ে থাকা ডেটার একটি তালিকা বাঁধতে হয়:

public class UiLayer
{
    public BindLists(List<A> as, List<B> bs)
    {
        var list = as.ZipWith(bs, (x, y) => new LayerListItem { AnA = x, AB = y});
        // do stuff with your new list.
    }

    private class LayerListItem
    {
        public A AnA;
        public B AB;
    }
}

যদি আপনার অভ্যন্তরীণ ক্লাসটি অন্য শ্রেণীর দ্বারা ব্যবহৃত হয় তবে আপনার এটি পৃথক করা উচিত। যদি আপনার অভ্যন্তরীণ শ্রেণিতে কোনও যুক্তি থাকে তবে আপনার এটি পৃথক করা উচিত।

মূলত, আমি মনে করি যে তারা আপনার ডেটা অবজেক্টে গর্ত লাগানোর জন্য দুর্দান্ত, তবে তাদের যদি যুক্তি ধারণ করতে হয় তবে তা বজায় রাখা খুব কঠিন, যেহেতু আপনার যদি এটি পরিবর্তন করার প্রয়োজন হয় তবে তাদের কোথায় সন্ধান করবেন তা জানতে হবে।


2
সি # ধরে নিচ্ছেন, আপনি কি এখানে শুধু টিপল ব্যবহার করতে পারবেন না?
চাকরী

3
@ জোব শিওর, তবে কখনও কখনও কোডগুলি tuple.ItemXঅস্পষ্ট করে তোলে।
ল্যাসে এসপহোল্ট

2
@ জোব হ্যাঁ, লাসেস্পিহল্ট এটি পেয়েছে। আমি বরং স্ট্রিং শিরোনামের একটি অভ্যন্তর শ্রেণি দেখতে চাই; স্ট্রিং বর্ণনা; T টিপল <স্ট্রিং, স্ট্রিং> এর চেয়ে।
এড জেমস

এই মুহুর্তে এটি নিজের ফাইলের মধ্যে শ্রেণিটি রাখা কি বুদ্ধিমান হবে না?
চাকরী

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

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

  • অন্য ভাষার নেস্টেড ক্লাসগুলির (উদাহরণস্বরূপ C ++) এ জাতীয় টাই নেই। আপনি কেবল শ্রেণীর দ্বারা সরবরাহিত স্কোপিং এবং অ্যাক্সেসিবিলিটি নিয়ন্ত্রণ ব্যবহার করছেন।


3
আসলে জাভা এর দুটি আছে ।
জোছিম সউর

3

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


এই বিষয়টি কোথাও নথিভুক্ত করা হয়?
gnat

ডাউনভোটার: আমার দাবিটি কি ভুল?
কেভিন

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

1
@ গ্যানাট: আমি কিছুটা গবেষণা করেছি এবং এটি একটি সুপরিচিত সত্য বলে মনে হচ্ছে, জাভা হটসাপের সীমাবদ্ধতার বিষয়ে আমি কোনও নির্দিষ্ট রেফারেন্স পাইনি।
কেভিন cline

আমরা Skeptics.SE না থাকেন :) শুধু কিছু রেফারেন্স করতে হবে, এটা নির্ধারক প্রয়োজন হবে না
মশা

2

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


2

ব্যক্তিগত অভ্যন্তর শ্রেণীর ব্যবহারের একটি কারণ হতে পারে কারণ আপনি যে এপিআই ব্যবহার করছেন তার জন্য নির্দিষ্ট শ্রেণীর উত্তরাধিকার প্রয়োজন, তবে আপনি এই শ্রেণীর জ্ঞানটি আপনার বাইরের শ্রেণির ব্যবহারকারীদের কাছে রফতানি করতে চান না। উদাহরণ স্বরূপ:

// async_op.h -- someone else's api.
struct callback
{
    virtual ~callback(){}
    virtual void fire() = 0;
};

void do_my_async_op(callback *p);



// caller.cpp -- my api
class caller
{
private :
    struct caller_inner : callback
    {
        caller_inner(caller &self) : self_(self) {}
        void fire() { self_.do_callback(); }
        caller &self_;
    };

    void do_callback()
    {
        // Real callback
    }

    caller_inner inner_;

public :
    caller() : inner_(*this) {}

    void do_op()
    {
        do_my_async_op(&inner_);
    }
};

এতে, do_my_async_op এর কাছে কলব্যাক টাইপ করার একটি বিষয় প্রয়োজন। এই কলব্যাকটিতে সর্বজনীন সদস্যের ফাংশন স্বাক্ষর রয়েছে যা এপিআই ব্যবহার করে।

বাইরের_ক্লাস থেকে যখন do_op () কল করা হয় তখন এটি ব্যক্তিগত অভ্যন্তর শ্রেণীর একটি উদাহরণ ব্যবহার করে যা নিজের দিকে নির্দেশকের পরিবর্তে প্রয়োজনীয় কলব্যাক ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। বহিরাগত শ্রেণীর বেসরকারী ডো_ক্যালব্যাক সদস্য ফাংশনে কলব্যাকটি সরিয়ে দেওয়ার সহজ উদ্দেশ্যে বহিরাগত শ্রেণীর একটি উল্লেখ রয়েছে ।

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


2

ডিপথের সি # তে জোন স্কিটের মতে, নেস্টেড ক্লাস ব্যবহার করা ছিল সম্পূর্ণ অলস থ্রেড-সেফ সিঙ্গলটন (পঞ্চম সংস্করণ দেখুন) বাস্তবায়ন করার একমাত্র উপায় (। নেট 4 অবধি)।


1
এটি ডিমান্ড হোল্ডার আইডিয়ম অন ইনিশিয়ালেশন , জাভাতে এটির জন্য ব্যক্তিগত স্ট্যাটিক অভ্যন্তর শ্রেণির প্রয়োজন requires এটি জেএমএম এফএকিউ , জেসিআইপি ১.4.৪ এর ব্রায়ান গয়েটস এবং জাভাওনে ২০০৮ সালে জোশুয়া ব্লচ দ্বারা প্রস্তাবিত আরও কার্যকর জাভা (পিডিএফ) "একটি স্ট্যাটিক ফিল্ডের উচ্চ পারফরম্যান্সের জন্য ..."
gnat

1

ব্যক্তিগত এবং অভ্যন্তরীণ ক্লাসগুলি এনক্যাপসুলেশনের মাত্রা বাড়াতে এবং প্রয়োগের বিশদটি গোপন করতে ব্যবহৃত হয়।

সি ++ এ, একটি প্রাইভেট ক্লাস ছাড়াও, ক্লাস সিপিসির নামবিহীন নেমস্পেস প্রয়োগ করে একই ধারণাটি অর্জন করা যায়। এটি বাস্তবায়নের বিশদটি গোপন / ব্যক্তিগতকরণে দুর্দান্তভাবে পরিবেশন করে।

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


-1 সম্পর্কে কোনও গঠনমূলক প্রতিক্রিয়া?
হাইওলন

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

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

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

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