"ইন্টারফেসে প্রোগ্রাম করার" অর্থ কী?


813

আমি এটি কয়েকবার উল্লেখ করেছি এবং এর অর্থ কী তা সম্পর্কে আমি পরিষ্কার নই not আপনি কখন এবং কেন এই কাজ করবেন?

ইন্টারফেসগুলি কী করে তা আমি জানি তবে এ সম্পর্কে আমি স্পষ্ট নই আমাকে মনে হয় যে আমি সেগুলি সঠিকভাবে ব্যবহার করতে চাইছি।

এটি করা যদি আপনি ঠিক তেমন করেন:

IInterface classRef = new ObjectWhatever()

আপনি প্রয়োগ করে যে কোনও ক্লাস ব্যবহার করতে পারেন IInterface? আপনার কখন এটি করা দরকার? কেবলমাত্র আমি ভাবতে পারি তা যদি আপনার কোনও পদ্ধতি থাকে এবং আপনি বাস্তবায়ন না করে কোন বস্তুটি পাস হবে তা সম্পর্কে আপনি অনিশ্চিত IInterface। আপনার কত ঘন ঘন এটি করা দরকার তা আমি ভাবতে পারি না।

এছাড়াও, আপনি কীভাবে এমন একটি পদ্ধতি লিখতে পারেন যা একটি ইন্টারফেস প্রয়োগ করে এমন একটি অবজেক্ট গ্রহণ করে? এটা কি সম্ভব?


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

18
@ অ্যান্ড টার্নার: এটি খুবই খারাপ পরামর্শ। 1)। "আপনার প্রোগ্রামটি সর্বোত্তম হওয়া দরকার" ইন্টারফেসগুলি অদলবদলের পক্ষে ভাল কারণ নয়! তারপরে আপনি বলছেন "যদিও আপনার কোড প্রোগ্রামিং ইন্টারফেসগুলিতে বিতরণ করুন ..." তাই আপনি পরামর্শ দিচ্ছেন যে প্রদত্ত প্রয়োজনীয়তাটি (1) আপনি তারপরে সাব-অনুকূল কোডটি প্রকাশ করবেন?!?
মিচ গম

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

2
@ অ্যাপলডুড 217 এটিই পুরো পৃষ্ঠার সেরা উত্তর। কমপক্ষে শিরোনামে প্রশ্নের জন্য, যেহেতু এখানে কমপক্ষে 3 টি ভিন্ন ভিন্ন প্রশ্ন রয়েছে ...
অ্যান্ড্রু স্পেন্সার

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

উত্তর:


1633

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

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

উদাহরণস্বরূপ - বলুন আপনার সিম গেম রয়েছে এবং নিম্নলিখিত ক্লাসগুলি রয়েছে:

class HouseFly inherits Insect {
    void FlyAroundYourHead(){}
    void LandOnThings(){}
}

class Telemarketer inherits Person {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}
}

স্পষ্টতই, সরাসরি উত্তরাধিকারের ক্ষেত্রে এই দুটি বস্তুর কোনও মিল নেই। তবে, আপনি বলতে পারেন যে তারা উভয়ই বিরক্তিকর।

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

উপলব্ধি করার মূল বিষয়টিটি হ'ল এ Telemarketerএবং HouseFlyমডেলিংয়ের ক্ষেত্রে তারা উভয়ই একই রকম কিছু না হলেও একটি সাধারণ আলগাভাবে ব্যাখ্যা করা আচরণ ভাগ করে নেয়। সুতরাং, আসুন একটি ইন্টারফেস তৈরি করুন যা উভয়ই প্রয়োগ করতে পারে:

interface IPest {
    void BeAnnoying();
}

class HouseFly inherits Insect implements IPest {
    void FlyAroundYourHead(){}
    void LandOnThings(){}

    void BeAnnoying() {
        FlyAroundYourHead();
        LandOnThings();
    }
}

class Telemarketer inherits Person implements IPest {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}

    void BeAnnoying() {
        CallDuringDinner();
        ContinueTalkingWhenYouSayNo();
    }
}

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

class DiningRoom {

    DiningRoom(Person[] diningPeople, IPest[] pests) { ... }

    void ServeDinner() {
        when diningPeople are eating,

        foreach pest in pests
        pest.BeAnnoying();
    }
}

এখানে আমাদের কাছে একটি ডাইনিং রুম রয়েছে যা বেশ কয়েকটি ডিনার এবং বিভিন্ন কীটপতঙ্গ গ্রহণ করে - ইন্টারফেসের ব্যবহারটি নোট করুন। এর অর্থ হল যে আমাদের ছোট্ট পৃথিবীতে pestsঅ্যারের সদস্য আসলে কোনও Telemarketerবস্তু বা বস্তু হতে পারে HouseFly

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

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


3
আরেকটি বিষয় বিবেচনা করার বিষয় হ'ল কিছু ক্ষেত্রে যেগুলি বিরক্তিকর হতে পারে এমনগুলির জন্য একটি ইন্টারফেস রাখা কার্যকর হতে পারে এবং BeAnnoyingকোনও অপ-বিকল্প হিসাবে প্রয়োগ করা বিভিন্ন সামগ্রীর বৈচিত্র্য থাকতে পারে ; এই ইন্টারফেসের জায়গায় অস্তিত্ব নাও থাকতে পারে, বা, যে জিনিস বিরক্তিকর জন্য ইন্টারফেস ছাড়াও (যদি উভয় ইন্টারফেস অস্তিত্ব, "যে জিনিস হয় বিরক্তিকর" ইন্টারফেস "যে জিনিস থেকে উত্তরাধিকারী উচিত হতে পারে বিরক্তিকর" ইন্টারফেস)। এই ধরনের ইন্টারফেস ব্যবহারের অসুবিধা হ'ল "বিরক্তিকর" সংখ্যার স্টাব পদ্ধতি বাস্তবায়নের ক্ষেত্রে বাস্তবায়নগুলি বোঝা হতে পারে। সুবিধা হলো ... হয়
supercat

4
পদ্ধতিগুলি বিমূর্ত পদ্ধতি উপস্থাপনের উদ্দেশ্যে নয় - তাদের প্রয়োগটি ইন্টারফেসগুলিতে কেন্দ্রীভূত প্রশ্নের সাথে অপ্রাসঙ্গিক।
পিটার মেয়ার

33
আইপেষ্টের মতো এনক্যাপসুলেটিং আচরণগুলি কৌশল প্যাটার্ন হিসাবে পরিচিত কেবল যদি কেউ সেই বিষয়ে আরও উপাদান নিয়ে অনুসরণ করতে আগ্রহী ...
nckbrz

9
মজার ব্যাপার হচ্ছে, আপনি খুঁজে নির্দেশ করে না যে কারণ বস্তু IPest[]IPest রেফারেন্স হয়, আপনি কল করতে পারেন BeAnnoying(), কারণ তারা যে পদ্ধতি আছে যখন আপনি একটি ঢালাই ছাড়া অন্যান্য পদ্ধতি কল করতে পারবেন না। যাইহোক, প্রতিটি বস্তু পৃথক BeAnnoying()পদ্ধতি কল করা হবে।
ডি বেন নোবল

4
খুব ভাল ব্যাখ্যা ... আমার এখানে এটি বলা দরকার : আমি ইন্টারফেসটি কোনও ধরণের looseিলে inheritালা উত্তরাধিকারের ব্যবস্থা বলে শুনিনি, তবে পরিবর্তে আমি জানি যে উত্তরাধিকারকে ইন্টারফেসগুলি সংজ্ঞায়িত করার জন্য দুর্বল প্রক্রিয়া হিসাবে ব্যবহৃত হচ্ছে (উদাহরণস্বরূপ, নিয়মিত পাইথনে আপনি এটি সর্বদা করুন)।
কার্লোস এইচ রোমানো

282

শিক্ষার্থীদের আমি যে নির্দিষ্ট উদাহরণটি দিয়েছিলাম তা হ'ল তাদের লেখা উচিত

List myList = new ArrayList(); // programming to the List interface

পরিবর্তে

ArrayList myList = new ArrayList(); // this is bad

একটি সংক্ষিপ্ত প্রোগ্রামে এগুলি দেখতে একই রকম, তবে আপনি যদি myListআপনার প্রোগ্রামে 100 বার ব্যবহার করতে যান তবে আপনি কোনও পার্থক্য দেখতে শুরু করতে পারেন। প্রথম ঘোষণাটি নিশ্চিত করে যে আপনি কেবলমাত্র সেই পদ্ধতিগুলিকে কল myListকরে যা Listইন্টারফেস দ্বারা নির্ধারিত হয় (সুতরাং কোনও ArrayListনির্দিষ্ট পদ্ধতি নেই)। আপনি যদি এইভাবে ইন্টারফেসটিতে প্রোগ্রাম করে থাকেন তবে পরে আপনি সিদ্ধান্ত নিতে পারেন যে আপনার আসলেই দরকার

List myList = new TreeList();

এবং আপনাকে কেবল সেই এক জায়গায় আপনার কোড পরিবর্তন করতে হবে। আপনি ইতিমধ্যে জানেন যে আপনার বাকী কোডটি এমন কোনও কিছু করে না যা বাস্তবায়ন পরিবর্তন করে ভেঙে যাবে কারণ আপনি ইন্টারফেসে প্রোগ্রাম করেছেন ।

আপনি যখন পদ্ধতি প্যারামিটার এবং রিটার্ন মানগুলির কথা বলছেন তখন সুবিধাগুলি আরও সুস্পষ্ট (আমার মনে হয়) হয়। উদাহরণস্বরূপ এটি নিন:

public ArrayList doSomething(HashMap map);

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

public List doSomething(Map map);

এখন Listআপনি কী ধরণের ফিরে আসেন বা Mapপ্যারামিটার হিসাবে কোন ধরণের পাস হয়েছিল তা বিবেচ্য নয়। doSomethingপদ্ধতির অভ্যন্তরে আপনি যে পরিবর্তনগুলি করছেন তা কলিং কোড পরিবর্তন করতে আপনাকে বাধ্য করবে না।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
Yvette

খুব স্পষ্ট ব্যাখ্যা। খুব সহায়ক
সামুয়েল লসওয়াতা

আপনি উল্লেখ করার কারণ নিয়ে আমার একটি প্রশ্ন রয়েছে "প্রথম ঘোষণাটি নিশ্চিত করে যে আপনি কেবলমাত্র মাইলিস্টে এমন পদ্ধতিগুলি কল করবেন যা তালিকা ইন্টারফেস দ্বারা সংজ্ঞায়িত হয়েছে (সুতরাং কোনও অ্যারেলিস্ট নির্দিষ্ট পদ্ধতি নেই)। আপনি যদি এইভাবে ইন্টারফেসে প্রোগ্রামিং করেন তবে পরে আপনার উপর আপনার সিদ্ধান্ত নিতে পারে যে আমার সত্যিকারের তালিকাটি MyList = নতুন TreeList () দরকার; এবং আপনাকে কেবলমাত্র সেই কোডটিতে আপনার কোড পরিবর্তন করতে হবে "" হতে পারে আমি ভুল বুঝেছি, আমি অবাক হয়েছি যে আপনি যদি "মাইলিস্টে কেবলমাত্র পদ্ধতিগুলি কল করেন" তা নিশ্চিত করতে চাইলে আপনার অ্যারেলিস্টটি ট্রিলিস্টে পরিবর্তন করতে হবে কেন?
ব্যবহারকারী 3014901

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

73

একটি ইন্টারফেসে প্রোগ্রামিং বলছে, "আমার এই কার্যকারিতাটি দরকার এবং কোথা থেকে আসে তা আমি যত্ন করি না।"

(জাভাতে), Listইন্টারফেস বনাম ArrayListএবং LinkedListকংক্রিট ক্লাসগুলি বিবেচনা করুন। আমার যদি কেবল যত্ন করা হয় তবে আমার কাছে এমন একটি ডেটা স্ট্রাকচার রয়েছে যাতে একাধিক ডেটা আইটেম থাকে যা আমার পুনরাবৃত্তির মাধ্যমে অ্যাক্সেস করা উচিত, আমি একটি বেছে নেব List(এবং এটি সময়ের 99%)। যদি আমি জানি যে তালিকার উভয় প্রান্ত থেকে আমার ধ্রুবক-সময় সন্নিবেশ / মুছে ফেলা প্রয়োজন, তবে আমি LinkedListকংক্রিট বাস্তবায়ন বেছে নিতে পারি (বা সম্ভবত আরও, ক্যু ইন্টারফেসটি ব্যবহার করতে পারি )। যদি আমি জানতে পারি যে সূচক অনুসারে আমার এলোমেলো অ্যাক্সেস দরকার, আমি ArrayListকংক্রিটের ক্লাসটি বেছে নেব ।


1
সম্পূর্ণরূপে একমত হয় যা করা হয় তার মধ্যে স্বাধীনতা বনাম এটি কীভাবে করা হয়। একটি সিস্টেমকে স্বাধীন উপাদানগুলির সাথে বিভক্ত করে, আপনি এমন একটি সিস্টেমের সাথে সমাপ্ত হন যা এটি সহজ এবং পুনঃব্যবহারযোগ্য (
ক্লোজিউর

38

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

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

সম্পাদনা: নীচে একটি নিবন্ধের লিঙ্ক দেওয়া আছে যেখানে এরিক গামা তার উক্তিটি নিয়ে আলোচনা করেছেন, "একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়।"

http://www.artima.com/lejava/articles/designprinciples.html


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

খুব ভাল সাক্ষাত্কার। দয়া করে, ভবিষ্যতের পাঠকদের জন্য সাবধান থাকুন, সাক্ষাত্কারে চারটি পৃষ্ঠা রয়েছে। ব্রাউজারটি দেখার আগে আমি প্রায় বন্ধ করে দিতাম।
বিজ্ঞাপন ইনফিনিটাম

37

একটি ইন্টারফেসে প্রোগ্রামিংয়ের অ্যাবস্ট্রাক্ট ইন্টারফেসগুলির সাথে একেবারে কিছুই করার নেই যেমন আমরা জাভা বা .NET তে দেখি। এটি এমনকি একটি ওওপি ধারণাও নয়।

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

সম্পাদনা: এবং ডাটাবেসগুলির সাথে এর অর্থ প্রত্যক্ষ টেবিল অ্যাক্সেসের পরিবর্তে ভিউ এবং সঞ্চিত পদ্ধতি ব্যবহার করা।


5
সেরা উত্তর. গামা এখানে একটি অনুরূপ ব্যাখ্যা দিন: artima.com/lejava/articles/designprصولles.html (পৃষ্ঠা 2 দেখুন)। তিনি ওও ধারণাটি উল্লেখ করছেন তবে আপনি সঠিক: এটি তার চেয়ে বড়।
সিলভাইন

36

আপনার নিয়ন্ত্রণের বিপরীত দিকে নজর দেওয়া উচিত:

এমন পরিস্থিতিতে আপনি এটি লিখবেন না:

IInterface classRef = new ObjectWhatever();

আপনি এই জাতীয় কিছু লিখবেন:

IInterface classRef = container.Resolve<IInterface>();

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

আমরা যদি আইওসিটিকে টেবিলের বাইরে ছেড়ে দিই, আপনি কোড লিখতে পারেন যা জানে যে এটি এমন কোনও বস্তুর সাথে কথা বলতে পারে যা নির্দিষ্ট কিছু করে , তবে কোন ধরণের অবজেক্ট বা এটি কীভাবে এটি করে তা নয় not

পরামিতিগুলি পাস করার সময় এটি কাজে আসবে।

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

public void DoSomethingToAnObject(IInterface whatever) { ... }

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

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

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

আমি আপনাকে একটি দৃ concrete় উদাহরণ দিতে দিন।

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

এখন থেকে যেহেতু নিয়ন্ত্রণগুলি পূর্বনির্ধারিত শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে আসে যে আমাদের কোনও নিয়ন্ত্রণ নেই তাই আমরা তিনটি জিনিসের মধ্যে একটি করতে পারি:

  1. এটি কোন ধরণের নিয়ন্ত্রণের সাথে কাজ করছে তা নির্দিষ্ট করে সনাক্ত করতে আমাদের অনুবাদ সিস্টেমের জন্য সমর্থন তৈরি করুন এবং সঠিক বিটগুলি অনুবাদ করুন (রক্ষণাবেক্ষণের দুঃস্বপ্ন)
  2. বেস ক্লাসে সমর্থন তৈরি করুন (অসম্ভব, যেহেতু সমস্ত নিয়ন্ত্রণ বিভিন্ন পূর্বনির্ধারিত শ্রেণীর থেকে উত্তরাধিকারী)
  3. ইন্টারফেস সমর্থন যোগ করুন

সুতরাং আমরা এনআর করেছি। ৩. আমাদের সমস্ত নিয়ন্ত্রণ ILocalizable বাস্তবায়ন করে, যা একটি ইন্টারফেস যা আমাদের একটি পদ্ধতি দেয়, "নিজেই" অনুবাদ করার পাঠ্য / নিয়মের একটি ধারক হিসাবে অনুবাদ করার ক্ষমতা দেয়। এই হিসাবে, ফর্মটি এটি কোন ধরণের নিয়ন্ত্রণের সন্ধান পেয়েছে তা জানা দরকার নেই, কেবল এটি নির্দিষ্ট ইন্টারফেস প্রয়োগ করে এবং জানে যে এমন একটি পদ্ধতি রয়েছে যেখানে এটি নিয়ন্ত্রণকে স্থানীয়করণের জন্য কল করতে পারে।


31
প্রথমদিকে আইওসির উল্লেখ কেন এটি আরও বিভ্রান্তি যুক্ত করবে।
কেভিন লে - খনলে

1
সম্মত হন, আমি বলব ইন্টারফেসের বিরুদ্ধে প্রোগ্রামিং করা আইওসিটিকে সহজ এবং নির্ভরযোগ্য করার একটি কৌশল মাত্র is
টেরজেটাইল

28

ইন্টারফেসের কোড কোড বাস্তবায়নের জাভার সাথে কিছু করার নেই, না এর ইন্টারফেসেরও নির্মাণ রয়েছে।

এই ধারণাটি প্যাটার্নস / গ্যাং অফ ফোর বইয়ে সর্বাধিকরূপে আনা হয়েছিল তবে সম্ভবত তার আগে এটি বেশ ভাল ছিল। জাভাটির অস্তিত্বের আগে ধারণাটি অবশ্যই খুব ভাল ছিল।

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

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

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

'প্রোগ্রাম থেকে ইন্টারফেস, বাস্তবায়ন নয়' ধারণার সাথে জাভা ইন্টারফেসের যা কিছু করা উচিত তা এই ভাবনাটিকে কাঁপুন। তারা ধারণা প্রয়োগ পারেন, তবে তারা না ধারণা।


1
প্রথম বাক্যটি সব বলেছে। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
মাদুমলাও

14

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

// if I want to add search capabilities to my application and support multiple search
// engines such as Google, Yahoo, Live, etc.

interface ISearchProvider
{
    string Search(string keywords);
}

তারপরে আমি গুগল সার্চপ্রোভাডার, ইয়াহু সার্চপ্রোভাডার, লাইভসন্ধানপ্রোভিডার ইত্যাদি তৈরি করতে পারি

// if I want to support multiple downloads using different protocols
// HTTP, HTTPS, FTP, FTPS, etc.
interface IUrlDownload
{
    void Download(string url)
}

// how about an image loader for different kinds of images JPG, GIF, PNG, etc.
interface IImageLoader
{
    Bitmap LoadImage(string filename)
}

তারপরে জেপিজিমেজলোডার, জিফাইমেজলোডার, পিএনজিআইমেজলোডার ইত্যাদি তৈরি করুন

বেশিরভাগ অ্যাড-ইনস এবং প্লাগইন সিস্টেমগুলি ইন্টারফেস বন্ধ করে দেয়।

আর একটি জনপ্রিয় ব্যবহার হ'ল সংগ্রহস্থল প্যাটার্নের জন্য for বলুন আমি বিভিন্ন উত্স থেকে জিপ কোডের একটি তালিকা লোড করতে চাই

interface IZipCodeRepository
{
    IList<ZipCode> GetZipCodes(string state);
}

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

পদ্ধতিগুলি যেমন ইন্টারফেস গ্রহণ করতে পারে:

PrintZipCodes(IZipCodeRepository zipCodeRepository, string state)
{
    foreach (ZipCode zipCode in zipCodeRepository.GetZipCodes(state))
    {
        Console.WriteLine(zipCode.ToString());
    }
}

10

আপনি যখন একই জাতীয় ক্লাসের সেট রাখেন এটি আপনার কোডটিকে অনেক বেশি বর্ধনযোগ্য এবং বজায় রাখা সহজ করে তোলে। আমি একজন জুনিয়র প্রোগ্রামার, সুতরাং আমি কোনও বিশেষজ্ঞ নই, তবে আমি সবেমাত্র একটি প্রকল্প শেষ করেছি যার জন্য অনুরূপ কিছু প্রয়োজন।

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

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

আমি এই উপাদানগুলির জন্য একটি সাধারণ ইন্টারফেস সংজ্ঞায়িত করেছি এবং সমস্ত বেস ক্লাসগুলি এই ইন্টারফেসের সাথে কথা বলে। এখন যখন আমি কিছু পরিবর্তন করি তখন এটি সর্বত্র 'ঠিক কাজ করে' এবং আমার কোনও কোড নকল নেই।


9

অনেক ব্যাখ্যা এখানে, কিন্তু আরও সহজ করতে। উদাহরণস্বরূপ নিন a List। যেভাবে একটি তালিকা প্রয়োগ করতে পারে:

  1. একটি অভ্যন্তরীণ অ্যারে
  2. একটি লিঙ্কযুক্ত তালিকা
  3. অন্যান্য বাস্তবায়ন

একটি ইন্টারফেসে বিল্ডিং দ্বারা, বলুন List। আপনি কেবল তালিকার সংজ্ঞা হিসাবে বা কোডটি ব্যবহার করেন যা Listবাস্তবে means

আপনি অভ্যন্তরীণভাবে কোনও arrayবাস্তবায়ন বলতে পারেন কোনও প্রয়োগ বলে । তবে ধরুন আপনি কোনও কারণে কোনও বাস্তবায়ন পরিবর্তন করতে চান তবে একটি বাগ বা কর্মক্ষমতা বলুন। তারপরে আপনাকে ঠিক ঘোষণাটি পরিবর্তন List<String> ls = new ArrayList<String>()করতে হবে List<String> ls = new LinkedList<String>()

কোডে আর কোথাও নেই, আপনাকে অন্য কিছু পরিবর্তন করতে হবে; কারণ বাকি সমস্ত কিছুই সংজ্ঞা অনুসারে নির্মিত হয়েছিল List


8

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


কোনও উন্নত ড্রাইভার উপলব্ধ হওয়ার ক্ষেত্রে এটি কেবল কার্যকর নয়, এটি ডাটাবেস বিক্রেতাকে পুরোপুরি পরিবর্তন করা সম্ভব করে।
কেন লিউ

3
জেডিবিসি এতটাই খারাপ যে এর পরিবর্তনের দরকার পড়ে। অন্য একটি উদাহরণ সন্ধান করুন।
জোশুয়া

জেডিবিসি খারাপ তবে কোনও কারণে ইন্টারফেস বনাম বাস্তবায়ন বা বিমোচনার স্তরের সাথে করণীয় নয়। এবং সুতরাং প্রশ্নে ধারণাটি চিত্রিত করার জন্য, এটি ঠিক নিখুঁত।
এরউইন স্মাউট

8

ইন্টারফেসগুলিতে প্রোগ্রামিং দুর্দান্ত, @ লাসেভেক যেমন উল্লেখ করেছেন, নিয়ন্ত্রণের বিপরীতমুখীকরণ এটির দুর্দান্ত ব্যবহার।

এছাড়াও, সলড প্রিন্সিপালগুলি দেখুনএখানে একটি ভিডিও সিরিজ দেওয়া হয়েছে

এটি একটি হার্ড কোডিং (দৃ strongly়ভাবে মিলিত উদাহরণ) এর মধ্য দিয়ে যায় তারপরে ইন্টারফেসগুলি দেখায়, অবশেষে IoC / DI সরঞ্জামে অগ্রসর হয় (এনআইজেক্ট)


7

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

এতে বলা হয়েছে, পি। 18:

একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়

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

এবং তার উপরে, এটি দিয়ে শুরু হয়েছিল:

বিমূর্ত শ্রেণীর দ্বারা সংজ্ঞায়িত ইন্টারফেসের ক্ষেত্রে পুরোপুরি অবজেক্টগুলি ম্যানিপুলেট করার দুটি সুবিধা রয়েছে:

  1. গ্রাহকরা নির্দিষ্ট ধরণের অবজেক্টগুলি ব্যবহার করেন সে সম্পর্কে অজানা থাকে, যতক্ষণ না ক্লায়েন্টরা প্রত্যাশা করে যে ইন্টারফেসগুলি ইন্টারফেসের সাথে যুক্ত থাকে।
  2. ক্লায়েন্টরা এই বিষয়গুলি প্রয়োগ করে এমন ক্লাসগুলি সম্পর্কে অজানা থাকে। গ্রাহকরা কেবল ইন্টারফেসটি সংজ্ঞায়িত বিমূর্ত ক্লাস (এস) সম্পর্কে জানেন।

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


6

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


5

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


4

এটি ইউনিট পরীক্ষার জন্যও ভাল, আপনি নিজের ক্লাস (যে ইন্টারফেসের প্রয়োজনীয়তাগুলি পূরণ করে) তার উপর নির্ভর করে এমন একটি ক্লাসে ইনজেক্ট করতে পারেন can


4

ইন্টারফেসগুলিতে প্রোগ্রাম করা সুবিধাজনক হতে পারে, এমনকি যখন আমরা বিমূর্তির উপর নির্ভর করে না।

ইন্টারফেসে প্রোগ্রামিং আমাদেরকে কোনও বস্তুর প্রসঙ্গত উপযুক্ত উপসেট ব্যবহার করতে বাধ্য করে । এটি সাহায্য করে কারণ এটি:

  1. প্রসঙ্গত অনুপযুক্ত জিনিসগুলি করতে আমাদের বাধা দেয় এবং
  2. আমাদের ভবিষ্যতে কার্যকরভাবে পরিবর্তন বাস্তবায়ন করতে দিন।

উদাহরণস্বরূপ, এমন একটি Personশ্রেণী বিবেচনা করুন Friendযা Employeeইন্টারফেসটি কার্যকর করে ।

class Person implements AbstractEmployee, AbstractFriend {
}

ব্যক্তির জন্মদিনের প্রসঙ্গে আমরা Friendব্যক্তির মতো আচরণ করা রোধ করতে ইন্টারফেসটিতে প্রোগ্রাম করি Employee

function party() {
    const friend: Friend = new Person("Kathryn");
    friend.HaveFun();
}

ব্যক্তির কাজের প্রসঙ্গে, Employeeকর্মক্ষেত্রের অস্পষ্টতা সীমাবদ্ধতা রোধ করতে আমরা ইন্টারফেসে প্রোগ্রাম করি ।

function workplace() {
    const employee: Employee = new Person("Kathryn");
    employee.DoWork();
}

গ্রেট। আমরা বিভিন্ন প্রসঙ্গে উপযুক্তভাবে আচরণ করেছি এবং আমাদের সফ্টওয়্যারটি ভালভাবে কাজ করছে।

ভবিষ্যতের অনেক দূরে, যদি আমাদের ব্যবসায় কুকুরের সাথে কাজ করতে পরিবর্তিত হয় তবে আমরা সফ্টওয়্যারটি মোটামুটি সহজেই পরিবর্তন করতে পারি। প্রথমত, আমরা একটি Dogবর্গ তৈরি করি যা উভয় Friendএবং কার্যকর করে Employee। তারপরে, আমরা নিরাপদে পরিবর্তিত new Person()হই new Dog()। এমনকি যদি উভয় ফাংশনেই কয়েক হাজার লাইনের কোড থাকে তবে সাধারণ সম্পাদনাটি কাজ করবে কারণ আমরা জানি যে নিম্নলিখিতটি সত্য:

  1. ফাংশনটি partyকেবলমাত্র Friendউপসেট ব্যবহার করে Person
  2. ফাংশনটি workplaceকেবলমাত্র Employeeউপসেট ব্যবহার করে Person
  3. ক্লাস Dogউভয় Friendএবং Employeeইন্টারফেস প্রয়োগ করে ।

অন্যদিকে, যদি হয় partyবা এর workplaceবিরুদ্ধে প্রোগ্রাম করা হয় তবে Person, Personস্পেসিফিক কোড উভয়েরই ঝুঁকি থাকবে । থেকে পরিবর্তন Personকরার Dogজন্য আমাদের কোডের মাধ্যমে চিরুনি দেওয়া দরকার Personযে Dogকোনও বিশেষ কোড যা সমর্থন করে না ex

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


1
ধরে নিচ্ছি আপনার অতিরিক্ত ব্রড ইন্টারফেস নেই, এটি।
কেসি

4

যদি আমি Swimmerকার্যকারিতা যুক্ত করতে একটি নতুন শ্রেণি লিখছি swim()এবং ক্লাস বলার কোনও অবজেক্ট ব্যবহার করা দরকার Dogএবং এই Dogশ্রেণিটি ইন্টারফেস প্রয়োগ Animalকরে যা ঘোষণা করে swim()

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

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


3

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

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


3

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

এটি এটি কোনও নির্দিষ্ট প্লাগইন শ্রেণীর থেকে সম্পূর্ণ স্বতন্ত্র করে তোলে - ক্লাসগুলি কী তা বিবেচ্য নয়। এটি কেবল যত্ন করে যে তারা ইন্টারফেসের বিশদটি পূরণ করে।

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

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


3

সি ++ ব্যাখ্যা।

আপনার শ্রেণিগুলি সর্বজনীন পদ্ধতি হিসাবে একটি ইন্টারফেস ভাবেন।

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

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

এইগুলির মূল বিষয়টি হ'ল আপনি যে কোনও ভিন্ন অনুসন্ধান অ্যালগরিদম / শ্রেণি সরবরাহ করতে পারতেন যতক্ষণ না এটি ভেক্টর নির্ভর করে এমন ইন্টারফেস সরবরাহ করে (বুদ্বুদ অনুসন্ধান, ক্রমানুসারে অনুসন্ধান, দ্রুত অনুসন্ধান)।

আপনি অন্যান্য পাত্রে (তালিকাগুলি, সারি) ডিজাইন করতেও পারেন যা ভেক্টর হিসাবে একই অনুসন্ধান অ্যালগরিদমকে তাদের অনুসন্ধানের অ্যালগরিদমের উপর নির্ভর করে এমন ইন্টারফেস / চুক্তিটি সম্পাদন করে দেবে।

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

জিনিসগুলি কীভাবে পরিচালিত হয় সে সম্পর্কে 'মিসিং আউট'; বড়-সময় (কমপক্ষে সি ++ এ), কারণ বেশিরভাগ স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরির ফ্রেমওয়ার্কটি কাজ করে।

অবশ্যই উত্তরাধিকার এবং বিমূর্ত ক্লাস ব্যবহার করার সময় একটি ইন্টারফেসে প্রোগ্রামিংয়ের পদ্ধতি পরিবর্তিত হয়; তবে নীতিটি হ'ল আপনার পাবলিক ফাংশন / পদ্ধতিগুলি আপনার ক্লাস ইন্টারফেস।

এটি একটি বিশাল বিষয় এবং ডিজাইন প্যাটার্নসের অন্যতম ভিত্তি principles


3

জাভাতে এই কংক্রিট ক্লাসগুলি সমস্তই চারসেকেন্স ইন্টারফেস প্রয়োগ করে:

চারবফার, স্ট্রিং, স্ট্রিংবুফার, স্ট্রিংবুডার

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

তবুও এই শ্রেণীর প্রত্যেকটিই চারসেকেন্স ইন্টারফেসের পদ্ধতিগুলি যথাযথভাবে প্রয়োগ করতে সক্ষম:

char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()

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

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

বাফারড্রাইটার, চারআরাইরাইটার, চারবার্ফার, ফাইল রাইটার, ফিল্টার রাইটার, লগস্ট্রিম, আউটপুট স্ট্রিম রাইটার, পাইপড্রাইটার, প্রিন্ট স্ট্রিম, প্রিন্ট রাইটার, স্ট্রিংবফার, স্ট্রিংবিল্ডার, স্ট্রিং রাইটার, রাইটার


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

... ক্রিয়াকলাপগুলি indexOfদ্রুতগতির মতো , কোনও উপায় নেই যে কোনও কলার যাঁর নির্দিষ্ট প্রয়োগের সাথে পরিচিত না CharSequenceহন তিনি charAtপ্রতিটি স্বতন্ত্র চরিত্র পরীক্ষা করার জন্য ব্যবহার না করে বরং এটি করতে বলতে পারেন ।
সুপারক্যাট

3

ছোট গল্প: একজন পোস্টম্যানকে বাড়ির পরে বাড়িতে যেতে এবং কভারগুলি (চিঠি, নথি, চেক, উপহার কার্ড, অ্যাপ্লিকেশন, প্রেমের চিঠি) সরবরাহ করার জন্য লিখিত ঠিকানাটি সহ তাকে জিজ্ঞাসা করা হয়।

মনে করুন কোনও প্রচ্ছদ নেই এবং পোস্টম্যানকে বাড়ির পরে বাড়িতে যেতে এবং সমস্ত জিনিস গ্রহণ করতে এবং অন্য লোকের কাছে পৌঁছে দিতে বলে, পোস্টম্যান বিভ্রান্ত হতে পারে।

সুতরাং এটি কভার দিয়ে আরও ভালভাবে মুড়িয়ে দিন (আমাদের গল্পে এটি ইন্টারফেস) তবে সে তার কাজটি ভাল করে নেবে।

এখন পোস্টম্যানের কাজটি কেবল কভারগুলি গ্রহণ এবং বিতরণ করা (তিনি কভারের ভিতরে থাকা বিষয়গুলিই উদ্বিগ্ন করবেন না)।

interfaceআসল টাইপ নয় এমন একটি প্রকার তৈরি করুন , তবে প্রকৃত প্রকারের সাথে এটি প্রয়োগ করুন।

ইন্টারফেসে তৈরি করার অর্থ আপনার উপাদানগুলি বাকী কোডে সহজেই ফিট হয়ে যায়

আমি একটি উদাহরণ দিচ্ছি।

আপনার নীচের মতো এয়ারপ্লেইন ইন্টারফেস রয়েছে।

interface Airplane{
    parkPlane();
    servicePlane();
}

ধরুন আপনার প্লেনের কন্ট্রোলার ক্লাসে এমন পদ্ধতি রয়েছে

parkPlane(Airplane plane)

এবং

servicePlane(Airplane plane)

আপনার প্রোগ্রামে প্রয়োগ করা হয়েছে। এটি আপনার কোডটি BREAK করবে না । আমি বোঝাতে চাইছি যতক্ষণ এটি যুক্তি স্বীকার করে ততক্ষণ তার পরিবর্তন করার দরকার নেই AirPlane

কারণ এটা প্রকৃত টাইপ সত্ত্বেও কোনো উড়োজাহাজ গ্রহণ করবে, flyer, highflyr, fighter, ইত্যাদি

এছাড়াও, একটি সংগ্রহে:

List<Airplane> plane; // আপনার সমস্ত প্লেন নেবে।

নীচের উদাহরণটি আপনার বুঝতে পরিষ্কার করবে।


আপনার কাছে একটি যুদ্ধবিমান রয়েছে যা এটি কার্যকর করে

public class Fighter implements Airplane {

    public void  parkPlane(){
        // Specific implementations for fighter plane to park
    }
    public void  servicePlane(){
        // Specific implementatoins for fighter plane to service.
    }
}

হাইফ্লায়ার এবং অন্যান্য অনুমানের জন্য একই জিনিস:

public class HighFlyer implements Airplane {

    public void  parkPlane(){
        // Specific implementations for HighFlyer plane to park
    }

    public void  servicePlane(){
        // specific implementatoins for HighFlyer plane to service.
    }
}

এখন আপনার নিয়ন্ত্রণকারী ক্লাসগুলি AirPlaneবেশ কয়েকবার ব্যবহার করে ভাবেন ,

মনে করুন আপনার নিয়ামক শ্রেণিটি নীচের মতো কন্ট্রোলপ্লেন,

public Class ControlPlane{ 
 AirPlane plane;
 // so much method with AirPlane reference are used here...
}

এখানে যাদু আসার সাথে সাথে আপনি নিজের নতুন AirPlaneটাইপের উদাহরণগুলি যতটা চান তৈরি করতে পারেন এবং আপনি ControlPlaneক্লাসের কোড পরিবর্তন করছেন না ।

আপনি একটি উদাহরণ যোগ করতে পারেন ...

JumboJetPlane // implementing AirPlane interface.
AirBus        // implementing AirPlane interface.

আপনি পূর্বে তৈরির ধরণের উদাহরণগুলিও সরিয়ে ফেলতে পারেন।


2

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

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


2

প্রশ্ন: - ... "আপনি এমন কোনও ক্লাস ব্যবহার করতে পারবেন যা একটি ইন্টারফেস প্রয়োগ করে?"
উত্তর: - হ্যাঁ

প্রশ্ন: - ... "কখন আপনার এটি করা দরকার?"
উত্তর: - প্রতিবার আপনার এমন একটি ক্লাস (এস) দরকার যা ইন্টারফেস প্রয়োগ করে।

দ্রষ্টব্য: আমরা কোনও শ্রেণি দ্বারা প্রয়োগ করা হয়নি এমন একটি ইন্টারফেস ইনস্ট্যান্ট করতে পারি না - সত্য।

  • কেন?
  • কারণ ইন্টারফেসের কেবলমাত্র পদ্ধতি প্রোটোটাইপ রয়েছে, সংজ্ঞা নয় (কেবলমাত্র ফাংশনের নাম, তাদের যুক্তি নয়)

AnIntf anInst = new Aclass();
// আমরা কেবল তখনই এটি করতে পারতাম যদি অ্যাক্লাস অ্যান্টিফ প্রয়োগ করে ments
// annst এ অ্যাক্লাস রেফারেন্স থাকবে।


দ্রষ্টব্য: এখন আমরা বুঝতে পারি যদি বিসি ক্লাস এবং সিস ক্লাস একই ডিন্টফ প্রয়োগ করে তবে কী ঘটেছিল।

Dintf bInst = new Bclass();  
// now we could call all Dintf functions implemented (defined) in Bclass.

Dintf cInst = new Cclass();  
// now we could call all Dintf functions implemented (defined) in Cclass.

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

গ্রন্থলিপি: প্রোটোটাইপস - উইকিপিডিয়া


1

একটি ইন্টারফেসে প্রোগ্রামটি বিনা বাধায় ইন্টারফেস দ্বারা সংজ্ঞায়িত চুক্তির প্রয়োগ পরিবর্তন করতে দেয়। এটি চুক্তি এবং নির্দিষ্ট প্রয়োগের মধ্যে আলগা সংযোগের অনুমতি দেয়।

IInterface classRef = new ObjectWhatever()

আপনি যে কোনও শ্রেণি ব্যবহার করতে পারেন যা IInterface প্রয়োগ করে? আপনার কখন এটি করা দরকার?

ভাল উদাহরণের জন্য এই এসই প্রশ্নটি দেখুন।

জাভা ক্লাসের ইন্টারফেসটি কেন পছন্দ করা উচিত?

একটি ইন্টারফেস হিট পারফরম্যান্স ব্যবহার করে?

অনেক, কিভাবে যদি তাই হয়?

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

কোডের দুটি বিট না রেখে আপনি কীভাবে এড়াতে পারবেন?

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

একটি ভাল ব্যবহারের ক্ষেত্রে: কৌশল নিদর্শন প্রয়োগ:

কৌশল প্যাটার্ন রিয়েল ওয়ার্ল্ড উদাহরণ


1

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

আমি এই বিধিগুলি আমাকে সাহায্য করে:

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

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

সেগুলি কখন ব্যবহার করবেন সে সম্পর্কে দুটি উপায় বিবেচনা করুন। আশাকরি এটা সাহায্য করবে.


0

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

অংশ পরিক্ষাকরণ

গত দু'বছর ধরে, আমি একটি শখের প্রকল্প লিখেছি এবং এর জন্য আমি ইউনিট পরীক্ষা লিখি না। প্রায় 50K লাইন লেখার পরে আমি জানতে পেরেছিলাম ইউনিট পরীক্ষা লিখতে এটি সত্যই প্রয়োজন হবে। আমি ইন্টারফেস (বা খুব স্বচ্ছভাবে) ব্যবহার করিনি ... এবং যখন আমি আমার প্রথম ইউনিট পরীক্ষা করলাম তখন আমি জানতে পারি এটি জটিল। কেন?

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

ইন্টারফেস ভয় তাই আমি ইন্টারফেস ব্যবহার করার সিদ্ধান্ত নিয়েছে। আমার ভয় হ'ল আমাকে একাধিকবার সর্বত্র (সমস্ত ব্যবহৃত ক্লাসে) সমস্ত কার্যকারিতা প্রয়োগ করতে হয়েছিল। কোনও উপায়ে এটি সত্য, তবে উত্তরাধিকার ব্যবহার করে এটি অনেক হ্রাস করা যায়।

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

public interface IPricable
{
    int Price { get; }
}

public interface ICar : IPricable

public abstract class Article
{
    public int Price { get { return ... } }
}

public class Car : Article, ICar
{
    // Price does not need to be defined here
}

ইন্টারফেস (আইসিআর) হিসাবে গাড়ি ব্যবহার করার সুবিধা থাকা সত্ত্বেও এইভাবে অনুলিপি কোডটি প্রয়োজনীয় নয়।


0

প্রথমে কিছু সংজ্ঞা দিয়ে শুরু করা যাক:

ইন্টারফেস n। কোনও বস্তুর ক্রিয়াকলাপ দ্বারা সংজ্ঞায়িত সমস্ত স্বাক্ষরগুলির সেটটিকে অবজেক্টটির ইন্টারফেস বলা হয়

টাইপ এন। একটি বিশেষ ইন্টারফেস

একটি একটি সহজ উদাহরণ ইন্টারফেস উপরের হিসাবে সংজ্ঞায়িত যেমন সব PDO বস্তুর পদ্ধতি হবে query(), commit(), close()ইত্যাদি, সামগ্রিকভাবে, আলাদাভাবে নয়। এই পদ্ধতিগুলি, অর্থাত্ এটির ইন্টারফেস বার্তাগুলির সম্পূর্ণ সেটকে সংজ্ঞায়িত করে, অনুরোধগুলি যা বস্তুকে প্রেরণ করা যায়।

উপরে বর্ণিত একটি ধরণ একটি নির্দিষ্ট ইন্টারফেস। আমি প্রকট তৈরি আপ আকৃতি ইন্টারফেস ব্যবহার করা হবে: draw(), getArea(), getPerimeter()ইত্যাদি ..

একটি বস্তু ডাটাবেস ধরনের হয়, তাহলে আমরা মানে এটি বার্তা / ডাটাবেসের ইন্টারফেসের অনুরোধ গ্রহণ করে, query(), commit()ইত্যাদি .. অবজেক্টস অনেক ধরনের হতে পারে। আপনার ডাটাবেস অবজেক্টটি আকারের ধরণের হতে পারে যতক্ষণ না এটি তার ইন্টারফেসটি প্রয়োগ করে, এক্ষেত্রে এটি সাব-টাইপিং হবে

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

ক্লায়েন্ট কেবল ইন্টারফেস সম্পর্কে সচেতন হবে, বাস্তবায়ন নয়।

সুতরাং একটি ইন্টারফেসে সারাংশ প্রোগ্রামিং যেমন বিমূর্ত বর্গ কিছু টাইপ উপার্জন জড়িত করা হবে Shapeশুধুমাত্র নির্দিষ্ট অর্থাত ইন্টারফেসের সাথে draw(), getCoordinates(), getArea()ইত্যাদি .. এবং তারপর বিভিন্ন কংক্রিট শ্রেণীর যেমন একটি বৃত্ত বর্গ, স্কয়ার বর্গ, ত্রিভুজ বর্গ হিসাবে যারা ইন্টারফেসগুলি বাস্তবায়ন আছে। সুতরাং একটি ইন্টারফেস একটি প্রোগ্রাম বাস্তবায়ন নয়।


0

"ইন্টারফেস থেকে ইন্টারফেস" এর অর্থ হার্ড কোডটি সঠিকভাবে সরবরাহ না করা, যার অর্থ আপনার কোডটি আগের কার্যকারিতা ভঙ্গ না করে প্রসারিত করা উচিত। কেবল এক্সটেনশানগুলি, পূর্ববর্তী কোডটি সম্পাদনা করছে না।

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