আমার সবসময় কোনও অভ্যন্তরীণ ডেটা স্ট্রাকচার পুরোপুরি আবদ্ধ করা উচিত?


11

দয়া করে এই শ্রেণিটি বিবেচনা করুন:

class ClassA{

    private Thing[] things; // stores data

    // stuff omitted

    public Thing[] getThings(){
        return things;
    }

}

এই শ্রেণিটি আগ্রহী যে কোনও ক্লায়েন্ট কোডে ডেটা সঞ্চয় করতে ব্যবহৃত অ্যারেটি প্রকাশ করে।

আমি কাজ করছি এমন একটি অ্যাপে আমি এটি করেছি। আমার একটি ChordProgressionক্লাস ছিল যা একটি ক্রম সংরক্ষণ Chordকরে (এবং কিছু অন্যান্য কাজ করে)। এটিতে এমন একটি Chord[] getChords()পদ্ধতি ছিল যা জিবির অ্যারে ফিরিয়ে দেয়। যখন ডেটা স্ট্রাকচারটি পরিবর্তন করতে হয়েছিল (একটি অ্যারে থেকে একটি অ্যারেলিস্টে) তখন সমস্ত ক্লায়েন্ট কোডটি ভেঙে যায়।

এটি আমাকে ভাবতে বাধ্য করেছে - সম্ভবত নিম্নলিখিত পদ্ধতিটি আরও ভাল:

class ClassA{

    private Thing[] things; // stores data

    // stuff omitted

    public Thing[] getThing(int index){
        return things[index];
    }

    public int getDataSize(){
        return things.length;
    }

    public void setThing(int index, Thing thing){
        things[index] = thing;
    }

}

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

যখন ডেটা স্ট্রাকচার পরিবর্তন হয়, কেবলমাত্র এই পদ্ধতিগুলি পরিবর্তন করতে হবে - তবে সেগুলি করার পরে, সমস্ত ক্লায়েন্ট কোড এখনও কাজ করে।

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


এই পদ্ধতির কি সাধারণ? আপনি এই কি মনে করেন? এর কী কী ডাউনসাইড রয়েছে? অভ্যন্তরীণ ডেটা কাঠামোতে প্রতিনিধি দেওয়ার জন্য অন্তর্ভুক্ত ক্লাসটি কমপক্ষে তিনটি পাবলিক পদ্ধতি বাস্তবায়ন করা কি যুক্তিসঙ্গত?

উত্তর:


14

কোড এর মতো:

   public Thing[] getThings(){
        return things;
    }

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

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

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

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

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

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

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

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


1
উত্তর করার জন্য ধন্যবাদ. একটি প্রশ্ন: যদি অভ্যন্তরীণ ডেটা কাঠামোতে, 5 টি পাবলিক পদ্ধতি থাকে - তবে আমার ক্লাসের পাবলিক ইন্টারফেসের মাধ্যমে সমস্ত বৈশিষ্ট্যযুক্ত হওয়া দরকার? উদাহরণস্বরূপ, একটি জাভা ArrayList নিম্নলিখিত পদ্ধতিগুলির আছে: get(index), add(), size(), remove(index), এবং remove(Object)। প্রস্তাবিত কৌশলটি ব্যবহার করে, এই অ্যারেলিস্টযুক্ত শ্রেণিতে কেবলমাত্র অভ্যন্তরীণ সংগ্রহে ডেলিগেশন দেওয়ার জন্য পাঁচটি পাবলিক পদ্ধতি থাকতে হবে। প্রোগ্রামটিতে এই শ্রেণীর উদ্দেশ্যটি সম্ভবত এই অ্যারেলিস্টকে encapsulate না করে বরং অন্য কিছু করছে। অ্যারেলিস্টটি কেবল একটি বিশদ। [...]
আভিভ কোহন

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

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

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

1
@ ফোশি - কেবল পঠন মূল শব্দটি - আমি এটির সাথে একমত হতে পারি। তবে ওপি কেবল পঠনের বিষয়ে কথা বলছে না। উদাহরণস্বরূপ removeশুধুমাত্র পড়া হয় না। আমার বোধগম্যতা হ'ল ওপি সব কিছু সর্বজনীন করতে চায় - প্রস্তাবিত পরিবর্তনের আগে আসল কোডের মতো এটি public Thing[] getThings(){return things;}আমি পছন্দ করি না।
ভেক্টর

2

আপনি জিজ্ঞাসা করেছিলেন: আমি কি সর্বদা কোনও অভ্যন্তরীণ ডেটা কাঠামো পুরোপুরি আবদ্ধ করতে পারি?

সংক্ষিপ্ত উত্তর: হ্যাঁ, বেশিরভাগ সময় তবে সর্বদা হয় না ।

দীর্ঘ উত্তর: আমি মনে করি ক্লাসগুলি নিম্নলিখিত বিভাগগুলিতে অনুসরণ করে:

  1. ক্লাসগুলি যা সহজ ডেটা encapsulate করে। উদাহরণ: 2 ডি পয়েন্ট। এক্স এবং ওয়াইয়ের স্থানাঙ্কগুলি পেতে / সেট করার ক্ষমতা সরবরাহকারী পাবলিক ফাংশনগুলি তৈরি করা সহজ তবে আপনি খুব বেশি ঝামেলা ছাড়াই সহজেই অভ্যন্তরীণ তথ্য আড়াল করতে পারেন। এই ধরনের শ্রেণীর জন্য, অভ্যন্তরীণ ডেটা কাঠামোর বিশদটি প্রকাশ করা অপ্রয়োজনীয়।

  2. সংগ্রহগুলি encapsulate করে এমন পাত্রে ক্লাস। এসটিএল ক্লাসিক ধারক ক্লাস আছে। আমি বিবেচনা করি std::stringএবং std::wstringতাদের মধ্যেও। তারা বিমূর্ত সাথে মোকাবিলা কিন্তু একটি সমৃদ্ধ ইন্টারফেস প্রদান std::vector, std::stringএবং std::wstringএছাড়াও কাঁচা ডেটা অ্যাক্সেস পেতে করার ক্ষমতা প্রদান করে। আমি তাদেরকে খারাপভাবে নকশাকৃত ক্লাস বলার তাগিদ করব না। আমি এই ক্লাসগুলির কাঁচা ডেটা প্রকাশের জন্য ন্যায়সঙ্গততা জানি না। যাইহোক, আমি আমার কাজের মধ্যে লক্ষ লক্ষ জাল নোড এবং সেই জাল নোডের ডেটার সাথে পারফরম্যান্সের কারণে ডিল করার সময় কাঁচা তথ্য প্রকাশের প্রয়োজনীয়তা খুঁজে পেয়েছি।

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

  3. ক্লাসগুলি যা বেশিরভাগ প্রকৃতির ক্রিয়াকলাপযুক্ত। উদাহরণ: std::istream,, std::ostreamএসটিএল পাত্রে পুনরাবৃত্তিকারী। এই শ্রেণীর অভ্যন্তরীণ বিবরণ প্রকাশ করা একেবারে বোকামি।

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

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


আমি মনে করি যে এসটিএল তাদের অভ্যন্তরীণ ডেটা প্রকাশের সবচেয়ে গুরুত্বপূর্ণ কারণটি পয়েন্টার প্রত্যাশা করে এমন সমস্ত কার্যগুলির সাথে সামঞ্জস্যতা, যা অনেক বেশি are
সিয়ুয়ান রেন

0

সরাসরি কাঁচা ডেটা ফেরানোর পরিবর্তে এরকম কিছু চেষ্টা করুন

class ClassA {
  private Things[] things;
  ...
  public Things[] asArray() { return things; }
  public List<Thing> asList() { ... }
  ...
}

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

class ClassA {
  private List<Thing> things;
  ...
  public Things[] asArray() { return things.asArray(); }
  public List<Thing> asList() { return things; }
  ...
}

এখন আপনার কাছে যথাযথ এনক্যাপসুলেশন রয়েছে, প্রয়োগের বিশদটি গোপন করুন এবং পিছনে সামঞ্জস্যতা সরবরাহ করুন (একটি ব্যয় করে)।


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

1
@ ভেক্টর - আপনি সঠিক ফিরিয়ে দেওয়া ডেটা স্ট্রাকচারটি এখনও পরিবর্তনযোগ্য এবং পার্শ্ব-প্রতিক্রিয়াগুলি তথ্য গোপনে হত্যা করবে।
ববডালগাইশ

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

@ BobDalgleish: আসল সংগ্রহের একটি অনুলিপি কেন ফেরত দেবেন না?
জর্জিও

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

0

এই জিনিসগুলির জন্য আপনার ইন্টারফেস ব্যবহার করা উচিত। আপনার ক্ষেত্রে সহায়তা করবে না, যেহেতু জাভার অ্যারে এই ইন্টারফেসগুলি প্রয়োগ করে না, তবে আপনার এখন থেকে এটি করা উচিত:

class ClassA{

    public ClassA(){
        things = new ArrayList<Thing>();
    }

    private List<Thing> things; // stores data

    // stuff omitted

    public List<Thing> getThings(){
        return things;
    }

}

এই ভাবে আপনি পরিবর্তন করতে পারেন ArrayListকরার LinkedListবা অন্য কিছু, এবং আপনি সমস্ত Java সংগ্রহের (অ্যারে পাশে) থাকতে যে যেহেতু কোনো কোড (ছদ্ম?) রেণ্ডম এক্সেস সম্ভবত বাস্তবায়ন করবে না বিরতি হবে List

আপনি এটি ব্যবহার করতে পারেন Collection, এর চেয়ে কম পদ্ধতি প্রস্তাব করে Listতবে এলোমেলো অ্যাক্সেস ছাড়াই সংগ্রহকে সমর্থন Iterableকরতে পারে , বা এটি স্ট্রিমগুলিকে সমর্থন করতে পারে তবে অ্যাক্সেস পদ্ধতির মেয়াদে খুব বেশি প্রস্তাব দেয় না ...


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

@ ভেক্টর হ্যাঁ, আমি ধরে নিচ্ছি ভবিষ্যতের জাভা সংগ্রহগুলি কার্যকর হবে List(বা Collection, বা কমপক্ষে Iterable)। এটি এই ইন্টারফেসের পুরো বিষয়, এবং এটি লজ্জার বিষয় যে জাভা অ্যারেগুলি সেগুলি বাস্তবায়ন করে না, তবে তারা জাভা সংগ্রহের জন্য অফিসিয়াল ইন্টারফেস তাই কোনও জাভা সংগ্রহ তাদের বাস্তবায়ন করবে বলে ধরে নেওয়া এতটা দূরের কথা নয় - যদি না সংগ্রহটি পুরানো হয় তুলনায় List, এবং সেক্ষেত্রে এটি অ্যাবস্ট্রাকলিস্ট দিয়ে মোড়ানো খুব সহজ ।
ইদান আরে

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

1
@Vector হ্যাঁ, ব্যবহারকারীরা কাস্ট করতে পারেন Listমধ্যে ArrayList, কিন্তু এটা বাস্তবায়ন মত 100% সুরক্ষিত হতে পারে না - আপনি যেকোনো সময় আপনার অ্যাক্সেস ব্যক্তিগত ক্ষেত্র প্রতিফলন ব্যবহার করতে পারেন। এটি করা ভ্রূণ্য হয় তবে কাস্টিংটিও ভ্রূণ্য হয় (যদিও তেমনটি হয় না)। এনক্যাপসুলেশন এর বিন্দুটি দূষিত হ্যাকিং প্রতিরোধ করে না - বরং এটি ব্যবহারকারীদের প্রয়োগের বিবরণগুলির উপর নির্ভর করে আপনার পরিবর্তন করতে পারে তা রোধ করা to Listইন্টারফেসটি ব্যবহার করে ঠিক তা হয় - ক্লাসের ব্যবহারকারীরা পরিবর্তিত হতে পারে Listকংক্রিটের ArrayListক্লাসের পরিবর্তে ইন্টারফেসের উপর নির্ভর করতে পারে।
ইদান আরে

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

-2

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


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