কেন ইন্টারফেসগুলি আলগা দম্পতি অর্জনে সুপারক্লাসগুলির চেয়ে বেশি সহায়ক?


15

( এই প্রশ্নের উদ্দেশ্যে, যখন আমি বলি 'ইন্টারফেস' বলতে আমি ভাষাটি নির্মাণের অর্থ করিinterface এবং শব্দের অন্য অর্থে 'ইন্টারফেস' না, অর্থাত কোনও শ্রেণি বাইরের বিশ্বের সাথে কথা বলার জন্য যে সকল পাবলিক পদ্ধতি সরবরাহ করে এবং এটিকে কাজে লাগান ))

কোনও বস্তু কংক্রিটের পরিবর্তে কোনও বিমূর্ততার উপর নির্ভর করে আলগা মিলন অর্জন করা যায়।

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

উদাহরণস্বরূপ, একটি শ্রেণি Carএবং দুটি উপশ্রেণী বিবেচনা করুন Volvoএবং Mazda

যদি আপনার কোডটি একটির উপর নির্ভর করে তবে Carএটি রানটাইমের সময় একটি Volvoবা একটি ব্যবহার করতে পারে Mazda। এছাড়াও পরে নির্ভরযোগ্য কোড পরিবর্তন করার প্রয়োজন ছাড়াও অতিরিক্ত সাবক্লাসে যোগ করা যেতে পারে।

এছাড়াও, Car- একটি বিমূর্ততা যা - চেয়ে পরিবর্তনের সম্ভাবনা কম হয় Volvoবা Mazda। বেশিরভাগ সময় গাড়ি সাধারণত একই ছিল, তবে ভলভোস এবং মাজদাসের পরিবর্তনের সম্ভাবনা অনেক বেশি। অর্থাৎ বিমূর্ততা কংক্রিটের ধরণের চেয়ে বেশি স্থিতিশীল।

এই সমস্ত কিছুই এটি দেখানোর জন্য ছিল যে আমি বুঝতে পারি যে শিথিল মিলন কী এবং এটি কীভাবে বিমূর্তির উপর নির্ভর করে নয় এবং কনক্রেশনির উপর নির্ভর করে কীভাবে অর্জন করা হয়। (আমি যদি কিছু ভুল লিখেছি দয়া করে তাই বলুন)।

আমি যা বুঝতে পারি না তা হ'ল:

বিমূর্ততা সুপারক্লাস বা ইন্টারফেস হতে পারে।

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

কেবলমাত্র তফাতগুলি আমি দেখছি: 1- ইন্টারফেসগুলি একক উত্তরাধিকার দ্বারা সীমাবদ্ধ নয়, তবে আলগা সংযোগের বিষয়টির সাথে এর তেমন কিছু করার নেই। 2- ইন্টারফেসগুলি আরও 'বিমূর্ত' কারণ তাদের বাস্তবায়নের কোনও যুক্তি নেই। তবে এখনও, আমি দেখতে পাচ্ছি না কেন এটি এত বড় পার্থক্য করে।

দয়া করে আমাকে ব্যাখ্যা করুন কেন ইন্টারফেসগুলি আলগা সংযোগের অনুমতি দেওয়ার ক্ষেত্রে দুর্দান্ত বলে অভিহিত হয়, যখন সাধারণ সুপারক্লাসগুলি না হয়।


3
বেশিরভাগ ভাষা (যেমন জাভা, সি #) যার "ইন্টারফেস" রয়েছে কেবলমাত্র একক উত্তরাধিকারকে সমর্থন করে। যেহেতু প্রতিটি শ্রেণীর কাছে কেবলমাত্র একটি তাত্ক্ষণিক সুপারক্লাস থাকতে পারে, (একমূর্ত) সুপারক্লাসগুলি একাধিক বিমূর্ততা সমর্থন করার জন্য খুব সীমিত limited আধুনিক বিকল্পের জন্য বৈশিষ্ট্যগুলি (যেমন স্কেলা বা পার্লের ভূমিকা ) পরীক্ষা করে দেখুন যা একাধিক উত্তরাধিকার সহ " হীরার সমস্যা " এড়িয়ে চলে ।
আমন

@ এ্যামন তাই আপনি বলছেন যে আলগা দম্পতি অর্জনের চেষ্টা করার সময় বিমূর্ত ক্লাসগুলিতে ইন্টারফেসের সুবিধা কী সেগুলি একক উত্তরাধিকারের দ্বারা সীমাবদ্ধ নয়?
আভিভ কোহন

না, কম্পাইলারের ক্ষেত্রে আমি ব্যয়বহুল বলতে চাইছিলাম যখন এটি একটি বিমূর্ত শ্রেণি পরিচালনা করে তবে এটি সম্ভবত অবহেলিত হতে পারে।
পাস্তি

2
দেখে মনে হচ্ছে @ আমন সঠিক পথে রয়েছে, আমি এই পোস্টটি পেয়েছি যেখানে বলা হয়েছে যে: interfaces are essential for single-inheritance languages like Java and C# because that's the only way in which you can aggregate different behaviors into a single class(যা আমাকে সি ++ এর সাথে তুলনা করার জন্য প্রেরণা দেয় যেখানে ইন্টারফেসগুলি খাঁটি ভার্চুয়াল ফাংশন সহ কেবল ক্লাস)।
পাস্তি

কে বলছেন সুপার ক্লাস খারাপ তা দয়া করে বলুন।
তুলাইনস কর্ডোভা

উত্তর:


11

পরিভাষা: আমি ভাষাটি ইন্টারফেসinterface হিসাবে কনস্ট্রাক্ট , এবং কোনও ধরণের বা বস্তুর ইন্টারফেসকে পৃষ্ঠ হিসাবে (আরও ভাল শব্দটির অভাবে) উল্লেখ করব।

কোনও বস্তু কংক্রিটের পরিবর্তে কোনও বিমূর্ততার উপর নির্ভর করে আলগা মিলন অর্জন করা যায়।

সঠিক।

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

একদম সঠিক নয়। বর্তমান ভাষা সাধারণত প্রত্যাশা করে না যে বিমূর্ততা পরিবর্তিত হবে (যদিও এটি হ্যান্ডেল করার জন্য কিছু নকশার ধরণ রয়েছে)। সাধারণ বিষয় থেকে বিশদ আলাদা করা বিমূর্ততা। এটি সাধারণত বিমূর্ততার কিছু স্তর দ্বারা করা হয় । এই স্তরটি কোডটি না ভেঙে কিছু অন্যান্য নির্দিষ্টকরণে পরিবর্তন করা যেতে পারে যা এই বিমূর্তির উপর ভিত্তি করে - আলগা সংযোগ অর্জন করে। অ-ওওপি উদাহরণ: একটি sortরুটিনটি কুইকসোর্ট থেকে সংস্করণ ১-এ টিম সাজ্টরে সংস্করণ ২-এ পরিবর্তিত হতে পারে কোডটি যা কেবল বাছাই করা ফলাফলের উপর নির্ভর করে (যেমন sortবিমূর্তির উপর ভিত্তি করে ) তাই প্রকৃত বাছাইকরণ বাস্তবায়ন থেকে ডিকপলড হয়।

আমি উপরের পৃষ্ঠটিকে যা বলেছি তা হ'ল বিমূর্তনের সাধারণ অংশ । এটি এখন ওওপি-তে ঘটেছিল যে কোনও একটি বস্তুর মাঝে মাঝে একাধিক বিমূর্তি সমর্থন করতে হবে। একটি খুব অনুকূল উদাহরণ: জাভা java.util.LinkedListউভয় সমর্থন করেList ইন্টারফেসকে যা "অর্ডার করা, সূচকযোগ্য সংগ্রহ" বিমূর্ততা সম্পর্কে এবং Queueইন্টারফেসটিকে সমর্থন করে যা (মোটামুটি ভাষায়) "ফিফো" বিমূর্ততা সম্পর্কে about

কীভাবে কোনও বস্তু একাধিক বিমূর্তি সমর্থন করতে পারে?

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

এখানে সমস্যাটি হ'ল একাধিক উত্তরাধিকার হীরা সমস্যা তৈরি করতে পারে , যেখানে কোনও পদ্ধতি প্রয়োগের জন্য ক্লাসগুলি অনুসন্ধান করা হয় তার ক্রম (এমআরও: পদ্ধতি সমাধানের আদেশ) "বৈপরীত্য" হতে পারে। এটির জন্য দুটি প্রতিক্রিয়া রয়েছে:

  1. একটি বুদ্ধিমান অর্ডার সংজ্ঞায়িত করুন এবং সেই অর্ডারগুলি প্রত্যাখ্যান করুন যা সংবেদনশীলভাবে রৈখিক হতে পারে না। C3 এ ম্রো মোটামুটি যুক্তিসম্মত এবং ভাল কাজ করে। এটি 1996 প্রকাশিত হয়েছিল।

  2. সহজ রুটটি ধরুন এবং জুড়ে একাধিক উত্তরাধিকার প্রত্যাখ্যান করুন।

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

ফলাফলটি হ'ল এমআরও সুস্পষ্ট (কেবলমাত্র প্রতিটি সুপারক্লাসকে ক্রমে দেখুন) এবং আমাদের অবজেক্টের যে কোনও সংখ্যক বিমূর্ততার জন্য একাধিক পৃষ্ঠ থাকতে পারে।

এটি বরং অসন্তুষ্ট হতে দেখা যায়, কারণ প্রায়শই বেশিরভাগ আচরণ পৃষ্ঠের অংশ হিসাবে থাকে। একটি Comparableইন্টারফেস বিবেচনা করুন:

interface Comparable<T> {
    public int cmp(T that);
    public boolean lt(T that);  // less than
    public boolean le(T that);  // less than or equal
    public boolean eq(T that);  // equal
    public boolean ne(T that);  // not equal
    public boolean ge(T that);  // greater than or equal
    public boolean gt(T that);  // greater than
}

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

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

Comparableইন্টারফেস হিসাবে Scala প্রকাশ করা যেতে পারে

trait Comparable[T] {
    def cmp(that: T): Int
    def lt(that: T): Boolean = this.cmp(that) <  0
    def le(that: T): Boolean = this.cmp(that) <= 0
    ...
}

কোনও শ্রেণি তখন সেই বৈশিষ্ট্য ব্যবহার করে, অন্যান্য পদ্ধতিগুলি শ্রেণীর সংজ্ঞাতে যুক্ত হয়:

// "extends" isn't different from Java's "implements" in this case
case class Inty(val x: Int) extends Comparable[Inty] {
    override def cmp(that: Inty) = this.x - that.x
    // lt etc. get added automatically
}

তাই Inty(4) cmp Inty(6)হবে -2এবং Inty(4) lt Inty(6)হবে true

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

দুর্ভাগ্যক্রমে, বৈশিষ্ট্যগুলি মোটামুটি সাম্প্রতিক আবিষ্কার (2002) এবং এগুলি বৃহত্তর মূলধারার ভাষাগুলিতে মোটামুটি বিরল।


উত্তম উত্তর, তবে আমি যুক্ত করব যে একক-উত্তরাধিকারের ভাষাগুলি রচনা সহ ইন্টারফেসগুলি ব্যবহার করে একাধিক উত্তরাধিকারকে ঝুঁকতে পারে

4

আমি যা বুঝতে পারি না তা হ'ল:

বিমূর্ততা সুপারক্লাস বা ইন্টারফেস হতে পারে।

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

প্রথমত, সাবটাইপিং এবং বিমূর্ততা দুটি পৃথক জিনিস। কেবলমাত্র সাবটাইপিংয়ের অর্থ হ'ল আমি অন্য ধরণের মানগুলির জন্য এক প্রকারের মান প্রতিস্থাপন করতে পারি - কোনও প্রকারের বিমূর্তকরণের প্রয়োজন হয় না।

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

ইন্টারফেস বাস্তবায়ন আপনাকে ইন্টারফেস ব্যতীত অন্য কোনও কিছুর সাথে জুটি দেয় না, যার কোনও আচরণ নেই।


উত্তর করার জন্য ধন্যবাদ. আমি বুঝতে পেরেছি কিনা তা দেখতে: আপনি যখন A নামক কোনও অবজেক্টটি C নামক বিমূর্তনের কংক্রিট প্রয়োগের পরিবর্তে B নামক একটি বিমূর্ততার উপর নির্ভর করতে চান, তখন বি দ্বারা বিস্তৃত সুপারক্লাসের পরিবর্তে সি দ্বারা প্রয়োগ করা ইন্টারফেস হওয়া আরও ভাল often সি এর কারণ: সি সাবক্লাসিং বি শক্তভাবে দম্পতি সি থেকে বি দম্পতি করে যদি বি পরিবর্তন হয় - সি পরিবর্তন হয়। তবে সি প্রয়োগকারী বি (বি একটি ইন্টারফেস হওয়ায়) বি থেকে সি দ্বিগুণ হয় না: বি কেবল পদ্ধতির একটি তালিকা যা সি প্রয়োগ করতে হবে, এইভাবে কোনও দৃ tight় সংযোগ নয়। তবে বস্তু এ (নির্ভরশীল) সম্পর্কিত, বি শ্রেণি বা ইন্টারফেস কিনা তা বিবেচ্য নয়।
আভিভ কোহন

সঠিক? ..... ....।
আভিভ কোহন

আপনি কেন কোনও ইন্টারফেসকে যেকোনো কিছুর সাথে মিলিত হতে বিবেচনা করবেন?
মাইকেল শ

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

@ প্রোগ আপনার চিন্তার রেখাটি বেশিরভাগ ক্ষেত্রে সঠিক, তবে আবার বিমূর্তি এবং সাবটাইপিং দুটি পৃথক বিষয়। যখন আপনি বলছেন you want an object named A to depend on an abstraction named B instead of a concrete implementation of that abstraction named Cআপনি ধরে নিচ্ছেন যে ক্লাসগুলি কোনওভাবে বিমূর্ত নয়। বিমূর্ততা এমন কিছু যা বাস্তবায়নের বিশদটি গোপন করে, তাই বেসরকারী ক্ষেত্রগুলির সাথে একটি শ্রেণি একই পাবলিক পদ্ধতিগুলির সাথে একটি ইন্টারফেসের মতো বিমূর্ত।
ডোভাল

1

পিতা-মাতার এবং শিশুদের ক্লাসগুলির মধ্যে সংযোগ রয়েছে, যেহেতু শিশু পিতামাতার উপর নির্ভর করে।

বলুন আমাদের ক্লাস এ আছে এবং বি শ্রেণীর উত্তরাধিকার সূত্রে তা রয়েছে। আমরা যদি ক্লাস এ এ গিয়ে জিনিস পরিবর্তন করি তবে ক্লাস বিও বদলে যায়।

বলুন আমাদের একটি ইন্টারফেস রয়েছে I এবং ক্লাস বি এর প্রয়োগ করে। যদি আমরা ইন্টারফেস I পরিবর্তন করি তবে ক্লাস বি সম্ভবত এটি আর প্রয়োগ করে না, ক্লাস বি অপরিবর্তিত রয়েছে।


আমি কৌতূহল বোধ করি যে ডাউনটা লোকদের কোনও কারণ ছিল, নাকি কেবল খুব খারাপ দিন কাটছিল।
মাইকেল শ

1
আমি ডাউনওয়েট করি নি, তবে আমি মনে করি এটি প্রথম বাক্যটি দিয়ে করতে পারে। শিশু ক্লাসগুলি অভিভাবক শ্রেণিতে মিলিত হয়, অন্যভাবে নয়। পিতা-মাতার সন্তানের সম্পর্কে কিছু জানা দরকার না, তবে সন্তানের পিতা-মাতার সম্পর্কে অন্তরঙ্গ জ্ঞান প্রয়োজন।

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