একটি ইন্টারফেসের কেবলমাত্র একটি অংশ কীভাবে কার্যকর করা যায়


14

ওওপি-তে বিকাশ করার সময়, কখনও কখনও একটি লাইব্রেরি দ্বারা একটি ইন্টারফেস / চুক্তি দেওয়া হয় যা আপনি পরিবর্তন করতে পারবেন না। আসুন এই ইন্টারফেসটি জে।

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

আমি ইন্টারফেস জে কার্যকারিতার একটি উপসেট বাস্তবায়ন করতে চাই, তবে এখনও পর্যন্ত আমার সমাধানগুলি আমাকে সন্তুষ্ট করে না:

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

আমি যখন ইন্টারফেস জে পরিবর্তন করতে সক্ষম হয়েছি তখন আমি একটি "সুপার ইন্টারফেস" কে তৈরি করব যা ইন্টারফেস জে এর কার্যকারিতার এই উপসেটটি ছিল এবং ইন্টারফেস জে কে ইন্টারফেস কে থেকে উত্তরাধিকারী করে তুলবে But তবে আমি ইন্টারফেস জে পরিবর্তন করতে পারি না cannot

এই সমস্যার একটি অবজেক্ট ভিত্তিক সমাধান কী? সর্বোত্তম সমাধানটি এখনও "জাস্ট" ইন্টারফেস জে প্রয়োগ করছে? অথবা কোনও ইন্টারফেস এটিকে পরিবর্তন না করেই "সুপারক্লাস" করার ওওপি-উপায় রয়েছে?


1
সুইংয়ের * অ্যাডাপ্টার ক্লাসগুলি এটি কী করে তা দেখুন।

উত্তর:


9

আপনি যদি ইন্টারফেস জে নিয়ন্ত্রণ না করেন, আপনি আটকে আছেন।

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

সম্ভব হলে পুরো ইন্টারফেস জে পুরোপুরি প্রয়োগ করুন

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


2
আপোস হিসাবে: আপনি ইন্টারফেস জে মালিককে আপনার ছোট ইন্টারফেস সাবজে গঠন করতে বলতে পারেন।
বি

27

একটি ইন্টারফেস বাস্তবায়নের পুরো বিষয়টি হ'ল কলার এবং কলির মধ্যে একটি দৃ contract় চুক্তি প্রদান করা হয় যা বাস্তবায়নের বিশদ আলাদা হতে পারে এমন সময় কখনও পরিবর্তন হয় না।

ইন্টারফেস জে প্রয়োগ করে আপনি বাইরের বিশ্বকে বলছেন যে আপনি কী করতে পারেন।

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


5

যদি আপনার গ্রাহক ক্লাস এ এর ​​সমস্ত ইন্টারফেস জেয়ের প্রয়োজন না হয়, তবে আমি একটি নতুন ইন্টারফেস তৈরি করার পরামর্শ দেব (এটি কে কে বলুন), যা এটির জন্য প্রয়োজনীয় সমস্তগুলি বিশদভাবে বর্ণনা করে।

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

ক্লাস এটিকে কেবল ইন্টারফেস জে প্রয়োগ করে এমন বস্তু গ্রাস করার অনুমতি দেওয়ার জন্য, আপনি একটি মোড়কের ক্লাস সরবরাহ করতে পারেন যা ইন্টারফেস কে প্রয়োগ করে এবং কোনও ইন্টারফেস জে সদস্যের জন্য উপযুক্ত কলগুলি সরবরাহ করে।


3

যদিও আমি বিদ্যমান জবাবগুলির সাথে একমত হই যা বলে যে আপনাকে সত্যিকার অর্থেই জে পুরোপুরি বাস্তবায়ন করতে হবে (বাস্তবায়িত পদ্ধতিগুলির ব্যতিক্রম ছাড়া) বা মোটেও নয়, সম্ভাব্য কাজটি নিম্নরূপ:

  • একটি ছোট ইন্টারফেস কে তৈরি করুন যা জে এর একটি উপসেট এবং প্রয়োজনীয় পদ্ধতিগুলি প্রয়োগ করে।
  • A এর জন্য একটি মোড়ক তৈরি করুন যা জে এবং কে প্রয়োগ করে এমন বস্তু গ্রহণ করে objects
  • জেতে পাসের ক্ষেত্রে এটিকে এটিকে সরিয়ে দিন simply
  • কে পাস করার ক্ষেত্রে, জে এর একটি বেনামে বাস্তবায়ন ইনস্ট্যান্ট করুন, কেবলমাত্র কে থেকে জে পর্যন্ত যে পদ্ধতি রয়েছে সেগুলি কেবল তারের করুন। এ এর উদাহরণে ফলাফলটি পাস করুন

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

  • জে বা এ-তে কোনও পরিবর্তন হয়নি
  • অসম্পূর্ণ যে J এর কোনও "এক্সপোজড" বাস্তবায়ন নেই।

যদি আপনার OO ভাষা বেনামে ইন্টারফেস ইনস্ট্যান্টেশনকে অনুমতি না দেয় তবে আপনি ইন্টারফেসের একটি ডামি বাস্তবায়ন তৈরি করতে পারেন এবং এটি ইনস্ট্যান্ট করতে পারেন।


1

পুরো ইন্টারফেসটি কার্যকর করতে আপনাকে কতক্ষণ সময় নিতে পারে?

যদি এটি আপনার জন্য যথেষ্ট পরিমাণ সময় নেয় তবে এটি কোনও ডিজাইনের সমস্যা নির্দেশ করে, এবং আমি আপনাকে পরামর্শ দেব (স্টিভেন এ আমার আগে যেমন করেছিলেন) মালিকের সাথে যোগাযোগ করতে এবং ভবিষ্যতে এটি পরিবর্তন করা যায় কিনা তা দেখার জন্য আপনাকে পরামর্শ দেব।

আপনি কি ইন্টারফেসের লাইব্রেরি থেকে আলাদা, আপনার নিজের কোডে ইন্টারফেসটি ব্যবহার করেন?

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

আপনার প্রয়োগের জন্য কখনও ইন্টারফেসের অব্যবহৃত সদস্যদের প্রয়োজন হবে?

যদি আপনি 'সমর্থিত নয়' যেহেতু তাদের কখনই ডাকা হবে না এমন প্রত্যাশা করতে পারেন, তবে আমি এটি ব্যবহার করতে পছন্দ করি NotSupportedException। এটি একটি স্পষ্ট ইঙ্গিত দেয় যে আপনি কখনই এই ইন্টারফেসটিকে সমর্থন করবেন না, আপনি এটি প্রয়োগ না করে।


NotSupportedExceptionএটির ব্যবহার সম্পর্কে ভাল ধারণা এটি পরিষ্কার করে দেয় যে আপনি সেই পদ্ধতিটি সমর্থন করেন না।
ক্রিসএফ

@ ক্রিসএফ: আমি কেবলমাত্র NotImplementedExceptionপ্রোডাকশন কোডের জন্য ব্যবহার করি , যেখানে আমি অন্যথায় "TODO: এটি প্রয়োগ করুন" লিখি দুঃখের বিষয়, তারা ভিজ্যুয়াল স্টুডিওর কার্য তালিকায় পপ আপ করে না । তবে অনুশীলনে, আমি খুব কমই কোনও পদ্ধতি দু'দিনের বেশি সময় ধরে অযত্নে রেখেছি। রিশার্পার সাহসী (কমপক্ষে আমার সেটআপ সহ) এই ব্যতিক্রমগুলিও দেখায় । :)
স্টিভেন জিউরিস

0

আপনার যা প্রয়োজন তা বাস্তবায়ন করুন এবং অন্যদের উপর একটি ব্যতিক্রম NoImplementedException নিক্ষেপ করুন।

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

হাতের কাজটির জন্য কাজ করুন এবং অন্যরা যদি ইন্টারফেসটি ব্যবহার করতে চান তবে তাদের অনুসরণ করার জন্য ভাল ট্রেইল রাখুন।

জাভাতে প্রচুর ইন্টারফেস পুরোপুরি প্রয়োগ হয় না।

জিনিসগুলিতে এটি অ্যাপাচি অ্যাপ্রোচ: http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/NotImplementedException.html


আপনি যুক্তি দিতে পারেন কেন আপনি বিশ্বাস করেন যে এটি একটি সঠিক সমাধান। এটি প্রশ্নের কিছু যোগ করে না।
স্টিভেন জিউরিস

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