কেন জাভা সংগ্রহগুলি ইন্টারফেসে "alচ্ছিক পদ্ধতি" দিয়ে প্রয়োগ করা হয়েছিল?


69

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

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

সেখানে বিষয় একটি চমৎকার সারাংশ এখানে

দুটি ইন্টারফেস বাস্তবায়নের পরিবর্তে alচ্ছিক পদ্ধতিগুলি কেন বেছে নেওয়ার কোনও উপযুক্ত কারণ ছিল?


আইএমও, এর কোনও ভাল কারণ নেই। সি ++ এসটিএল 80 এর দশকের গোড়ার দিকে স্টেপানভ তৈরি করেছিলেন। যদিও এর ব্যবহারযোগ্যতা বিশ্রী সি ++ টেম্পলেট বাক্য গঠন দ্বারা সীমাবদ্ধ ছিল তবে জাভা সংগ্রহ শ্রেণীর তুলনায় এটি ধারাবাহিকতা এবং ব্যবহারের যোগ্যতা para
কেভিন cline

জাভাতে একটি সি ++ এসটিএল 'পোর্টিং' ছিল। তবে এটি শ্রেণি গণনায় 5 গুণ বড় ছিল। এই মনের সাথে আমি এটি ক্রয় করি না যে বৃহত্তরটি আরও সুসংগত এবং ব্যবহারযোগ্য। docs.oracle.com/javase/6/docs/technotes/guides/collections/…
m3th0dman

@ m3th0dman এটি জাভাতে অনেক বড় কারণ জাভাতে সি ++ টেমপ্লেটের সাথে পাওয়ারের সমতুল্য কিছুই নেই।
কেভিন cline

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

উত্তর:


28

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


6
জাভাতে constসি ++ এর মতো কীওয়ার্ড থাকলে এগুলি সব এড়ানো যেত ।
এটিয়েন ডি মার্টেল

@ এটিয়েন: পাইথনের মতো মেটাক্লাস ভাল হবে। তারপরে আপনি প্রোগ্রামক্রমে ইন্টারফেসের সংযুক্ত নম্বর তৈরি করতে পারেন। Const সঙ্গে সমস্যা এটি কেবলমাত্র আপনি এক বা দুই মাত্রার দেয়: vector<int>, const vector<int>, vector<const int>, const vector<const int>। এ পর্যন্ত সব ঠিকই, কিন্তু তারপর আপনি গ্রাফ বাস্তবায়ন চেষ্টা করুন, এবং আপনি গ্রাফ গঠন ধ্রুবক করতে চাই, কিন্তু নোড সংশোধনযোগ্য বৈশিষ্ট্যাবলী, ইত্যাদি
নিল জি

2
@ ইটিয়েন, আমার করণীয় তালিকায় "শিখুন স্কালা" ছড়িয়ে দেওয়ার আরও একটি কারণ!
glenviewjeff

2
আমি যা বুঝতে পারি না তা হ'ল, তারা কেন এমন কোনও canপদ্ধতি তৈরি করেনি যা কোনও অপারেশন সম্ভব হলে পরীক্ষা করবে? এটি ইন্টারফেসটি সহজ এবং দ্রুত রাখবে।
মেহরদাদ

3
@ এটিয়েন ডি মার্টেল ননসেন্স। এই মিশ্রণ বিস্ফোরণে কীভাবে সহায়তা করবে?
টম হাটিন -

10

এটি আমার কাছে মনে হয় Interface Segregation Principleযেমনটি এখনকার মতো আগের মতো সন্ধান করা হয়নি; সলিড এবং আইএসপি মানের কোডের জন্য ডি-ফ্যাক্টোর স্ট্যান্ডার্ড হওয়ার আগে এই জিনিসগুলি করার পদ্ধতি (যেমন আপনার ইন্টারফেসে সমস্ত সম্ভাব্য ক্রিয়াকলাপ অন্তর্ভুক্ত রয়েছে এবং আপনার "অবক্ষয়" পদ্ধতি রয়েছে যা আপনার প্রয়োজন হয় না তার জন্য ব্যতিক্রম ছুঁড়ে ফেলে) was


2
কেন ডাউনটা? কেউ আইএসপি পছন্দ করে না?
ওয়েইন মোলিনা

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

4

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

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

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

নোট করুন যে "alচ্ছিক সক্ষমতা" এর অস্তিত্ব কিছু ক্ষেত্রে সামগ্রিক সংগ্রহগুলি এমন কিছু উপায়ে বাস্তবায়ন করতে পারে যা বাস্তবায়নের অস্তিত্বের দ্বারা ক্ষমতাগুলি সংজ্ঞায়িত করা সম্ভব হলে তার চেয়ে অনেক বেশি দক্ষ ছিল। উদাহরণস্বরূপ, ধরুন, concatenateঅন্য দুটি পদ্ধতির মধ্যে একটি সমন্বিত সংগ্রহ গঠনের জন্য কোনও পদ্ধতি ব্যবহার করা হয়েছিল, যার মধ্যে প্রথমটি হয়েছিল 1,000,000 উপাদানগুলির সাথে অ্যারেলিস্ট এবং এর মধ্যে শেষটি একটি বিশ-উপাদান সংগ্রহ যা কেবল শুরু থেকে পুনরাবৃত্তি হতে পারে। যদি সংমিশ্রণ সংগ্রহটি 10,000,013 তম উপাদানটির জন্য (সূচক 1000,012) জিজ্ঞাসা করা হয়, তবে এটি অ্যারেলিস্টটিকে কতগুলি আইটেম রয়েছে (যেমন 1,000,000) জিজ্ঞাসা করতে পারে, অনুরোধ করা সূচক (12 টির ফলক) থেকে বিয়োগ করে, দ্বিতীয়টি থেকে বারোটি উপাদান পড়ে এবং এড়িয়ে যায় সংগ্রহ করুন এবং তারপরে পরবর্তী উপাদানটি ফিরিয়ে দিন।

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


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

1
দুঃখিত, অসম্পূর্ণ মন্তব্য। আমি বলতে যাচ্ছিলাম যে "" সংগ্রহের বিষয়ে জিজ্ঞাসার উপায়গুলি ... "" রান-টাইমে সংকলন-সময় যাচাই করা উচিত moves
কেভিন cline 18

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

... তবে এতে উপস্থিত বৈশিষ্ট্যটি থেকে উপকৃত হবেন, কোডটি সেই ধরণের বৈশিষ্ট্যটিকে সমর্থন করে কিনা সে বিষয়ে টাইপ সিস্টেমটিকে জিজ্ঞাসা করার চেয়ে বৈশিষ্ট্যটিকে সমর্থন করে কিনা সেটিকে জিজ্ঞাসা করা ভাল। যদি কোনও নির্দিষ্ট "নির্দিষ্ট" ইন্টারফেসটি ব্যাপকভাবে ব্যবহৃত হয়, তবে AsXXXবেস ইন্টারফেসে এমন একটি পদ্ধতি অন্তর্ভুক্ত থাকতে পারে যা যদি সেই ইন্টারফেসটি প্রয়োগ করে তবে যে বস্তুটির উপর এটি চাওয়া হয় তা ফিরিয়ে দেয়, যদি সম্ভব হয় তবে সেই ইন্টারফেসটিকে সমর্থন করে এমন একটি মোড়কের বস্তুটি ফিরিয়ে দেবে, বা নিক্ষেপ করবে ব্যতিক্রম না হলে। উদাহরণস্বরূপ, কোনও ImmutableCollectionইন্টারফেসের জন্য চুক্তির প্রয়োজন হতে পারে ...
সুপারক্যাট

2
আপনার প্রস্তাবনায় একটি সমস্যা আছে: কোনও "জিজ্ঞাসা করুন তখন করুন" প্যাটার্নটির একটি সম্মতিযুক্ত সমস্যা রয়েছে যদি কোনও সামগ্রীর জীবদ্দশায় তার ক্ষমতা পরিবর্তন করতে পারে। (যদি আপনাকে যাইহোক কোনও ব্যতিক্রম ঝুঁকিপূর্ণ হতে হয়, তবে আপনি জিজ্ঞাসা করাও বিরক্ত করবেন না ...)
ঝুমিনাল

-1

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

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

অবশ্যই এটি সমস্ত বুনো জল্পনা, আমি সন্দেহ করি যে আমরা কখনই এটির জবাব দিতে পারতাম না যদি না মূল সংগ্রহগুলির মধ্যে একজন স্থপতি চিমস না করে।


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

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

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

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