ইন্টারফেস কখন তৈরি করব তা আমি কীভাবে জানব?


196

আমি আমার বিকাশ শেখার এমন এক পর্যায়ে পৌঁছেছি যেখানে আমার মনে হচ্ছে ইন্টারফেস সম্পর্কে আমার আরও শিখতে হবে।

আমি প্রায়শই সেগুলি সম্পর্কে পড়ি তবে মনে হয় কেবল সেগুলি ধরতে পারি না।

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

আমি কী মিস করছি? আমার কাছে কেন এতো কঠিন ধারণা! আমি কেবল এই কারণে ভয় পেয়েছি যে আমি কখনই তার প্রয়োজনের কোন দৃ concrete় প্রয়োজন অনুধাবন করতে পারি না - বেশিরভাগ কারণেই এগুলি বোঝার কোনও অনুপস্থিত দিক রয়েছে! এটি আমার বোধ করে যে আমি বিকাশকারী হিসাবে শীর্ষে কিছু মিস করছি! কারও যদি এর মতো অভিজ্ঞতা থাকে এবং একটি অগ্রগতি হয় আমি কীভাবে এই ধারণাটি বোঝার জন্য কয়েকটি টিপসকে উপলব্ধি করব। ধন্যবাদ.


1
আপনি খুঁজে বার করো আবশ্যক stackoverflow.com/q/8531292/1055241
gprathour

উত্তর:


151

এটি এই কংক্রিট সমস্যা সমাধান করে:

আপনার কাছে 4 টি বিভিন্ন ধরণের একটি, বি, সি, ডি রয়েছে। আপনার সমস্ত কোড জুড়ে আপনার কাছে এমন কিছু রয়েছে:

a.Process();
b.Process();
c.Process();
d.Process();

কেন তাদের আইপি্রোসেসেবল বাস্তবায়ন করতে হবে না এবং তারপরেও

List<IProcessable> list;

foreach(IProcessable p in list)
    p.Process();

আপনি যখন যোগ করবেন, বলবেন, 50 টি ধরণের ক্লাস যা সমস্ত একই কাজ করে তখন এটি আরও ভাল স্কেল হবে।


আর একটি কংক্রিট সমস্যা:

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


2
এটা সাহায্য করে। প্রসেস () পদ্ধতির জন্য কেবলমাত্র সকলেরই প্রকারভেদ রয়েছে তার চেয়ে ইন্টারফেস উপস্থিত থাকার সুবিধা কী?
ব্যবহারকারী53885

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

প্রক্রিয়া পদ্ধতি সহ 50 টি ভিন্ন শ্রেণীর বিপরীতে আপনাকে কাস্ট করতে হবে না। সি # "হাঁসের টাইপিং" ব্যবহার করে না, সুতরাং কেবল কারণ এ এর ​​প্রসেস () এবং বি প্রক্রিয়া রয়েছে () এর অর্থ এই নয় যে হয় কল করার কোনও জেনেরিক উপায় আছে। তার জন্য আপনার একটি ইন্টারফেস দরকার।
ব্যবহারকারী 7116

ঠিক আছে। উদাহরণটি আরও বোঝাতে আমি সবেমাত্র "var" কে "IProcessable" এ পরিবর্তন করেছি।
জিমি

2
@ রোজারিও: আমি জেনেরিক হওয়ার চেষ্টা করছিলাম। মূল বিষয়টি এমন নয় যে "যখন আপনার কাছে একটি প্রক্রিয়া () ফাংশন থাকে তখন" এটি "থাকে যখন আপনার কাছে এমন কিছু জিনিস থাকে যা পদ্ধতিগুলির একটি সাধারণ সেট ভাগ করে দেয়"। উদাহরণটি সহজেই পরিবর্তিত হতে পারেforeach(IMyCompanyWidgetFrobber a in list) a.Frob(widget, context);
জিমি

133

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

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


9
আপনি কী এসেছেন তা আমি পছন্দ করি - "এটি একটি সক্ষমতা নির্দেশ করে"। ইন্টারফেসগুলি সত্যই প্রয়োজন যখন আপনাকে সক্ষমতার সংজ্ঞা দিতে হয় 'কারণ বেসিকগুলি তার "বেস" শ্রেণিতে আটকে থাকতে হয়।
রমিজ উদ্দিন 12

71

একই কার্যকারিতা বাস্তবায়ন যখন পৃথক হবে ইন্টারফেস ব্যবহার করুন।

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


8
প্রথমটির একটিকে বহুত্ববাদ বলে। দ্বিতীয়টি হ'ল সাপের তেল - যদি না সাবলকাস বেসক্লাস হয় (লিসকভের প্রতিস্থাপনের নীতি লঙ্ঘন হয় না), আপনার উত্তরাধিকারের তুলনায় রচনাটি সমর্থন করা উচিত।
আরনিস ল্যাপসা

@ আরনিসলাপসা "সাবলকাস বেসক্লাস না হলে" আপনি কী বোঝাতে চেয়েছেন তা আমি পুরোপুরি বুঝতে পারি না। যখন একটি সাবক্লাস বেসক্লাসটি "হবে" না? ( is
মূলশব্দ

32

একটি চুক্তির মতো ইন্টারফেসের কথা ভাবুন। এটি বলার একটি উপায়, "এই ক্লাসগুলির এই নিয়মগুলির সেটগুলি অনুসরণ করা উচিত।"

সুতরাং আইনিমাল উদাহরণে, এটি বলার একটি উপায় যা "IAnimal বাস্তবায়ন করে এমন ক্লাসগুলিতে আমি রান, ওয়াক ইত্যাদি কল করতে সক্ষম হব।"

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

public void RunThenWalk(Monkey m) {
    m.Run();
    m.Walk();
}

public void RunThenWalk(Dog d) {
    d.Run();
    d.Walk();
}

... এবং এটি পুনরাবৃত্তি করুন যা আপনি জানেন এমন সমস্ত বস্তুর জন্য যা চালানো এবং হাঁটতে পারে। তবে আপনার আইআনিমাল ইন্টারফেসের সাহায্যে আপনি নিম্নলিখিতটি একবারে ফাংশনটি সংজ্ঞায়িত করতে পারেন:

public void RunThenWalk(IAnimal a) {
    a.Run();
    a.Walk();
}

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

এই সম্পর্কিত প্রশ্নে একটি ভাল আলোচনাও রয়েছে ।


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

18

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

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

if(myObject is Boat)
    ((Boat)myObject).Drive()
else
    if (myObject is Car)
        ((Car)myObject).Drive()

এটি লেখা অনেক সহজ হবে:

((IDrivable)myObject).Drive()

16

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

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


15

আমি সেনাবাহিনীর উপমা পছন্দ করি।

সার্জেন্ট আপনাকে যত্ন করে না আপনি কোনও সফটওয়্যার বিকাশকারী , সংগীতজ্ঞ বা আইনজীবি কিনা ।
আপনি সৈনিক হিসাবে বিবেচিত হয় ।

ইউএমএল

এটা সহজ সার্জেন্ট ব্যক্তি তিনি সঙ্গে, কাজ করছে নির্দিষ্ট বিবরণ সঙ্গে বিরক্ত করতে জন্য
সৈনিক বিমূর্ত যেমন আচরণ সবাই (... এবং তাদের শাস্তি যখন তারা বেশী মত আচরণ করতে ব্যর্থ)।

সৈন্যদের মতো আচরণ করার ক্ষমতা ব্যক্তিকে পলিমারফিজম বলে।

ইন্টারফেসগুলি এমন একটি সফ্টওয়্যার নির্মাণ যা বহুবিজ্ঞান অর্জনে সহায়তা করে।

দরকার অর্জন করার সরলতা আপনার প্রশ্নের উত্তর হয় বিমূর্ত বিবরণ এতে।

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

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


14

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

অন্যান্য অনেকগুলি কারণ রয়েছে যা আমি ইন্টারফেসগুলিতে রিফ্যাক্টরিংয়ের ভাল অনুশীলনকে আরও দৃforce়তরূপে খুঁজে পেয়েছি তবে ইউনিট টেস্টিং / বিদ্রূপের বিষয়টিই ব্যবহারিক অভিজ্ঞতার অন্তর্নিহিত "আহা মুহুর্ত" সরবরাহ করেছিল।

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


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

@ অরনিস - ইউনিট পরীক্ষা করা একটি "ভুল কারণ", পরীক্ষায় নির্ভরতা অপসারণের জন্য ক্লাসকে সহজেই বিদ্রূপ করা একটি "ভুল কারণ" " দুঃখিত, তবে আমি একমত নই
tvanfosson

1
কোডগুলি পরীক্ষাযোগ্য না হলে প্রতিক্রিয়া প্রদানের মাধ্যমে পরীক্ষাগুলি পরোক্ষভাবে নকশাকে প্রভাবিত করে । টেস্টিবিলিটি উন্নত করতে এক্সটেনসিবিলিটি পয়েন্ট যুক্ত করা প্রতারণার মতো। আমি মনে করি মার্ক সিমন এটির চেয়ে ভাল পরিমাণে যোগফল দেয় ly///২০১৮ ডাব্লুপি
অরণিস ল্যাপসা

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

কেবল এটুকু বলছি যে পচা যা তথাকথিত প্রাকৃতিক জয়েন্টগুলির সাথে নয় এটি কম সংহতি এবং অপ্রয়োজনীয় জটিলতার দিকে পরিচালিত করে।
অ্যারিস ল্যাপসা

10

কিছু অ-প্রোগ্রামিং উদাহরণ যা আপনাকে প্রোগ্রামিংয়ে ইন্টারফেসের উপযুক্ত ব্যবহারগুলি দেখতে সহায়তা করতে পারে।

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

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

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

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


5

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

আপনার ইন্টারফেসের প্রয়োজন কেন আমি তা বলতে পারি না, তবে আমাদের বর্তমান প্রকল্পে আমরা সেগুলি কোথায় ব্যবহার করি তার একটি তালিকা দিতে পারি:

  1. আমাদের প্লাগ-ইন মডেলটিতে আমরা ইন্টারফেসের মাধ্যমে প্লাগ-ইনগুলি লোড করি এবং সেই ইন্টারফেসটি প্লাগ-ইন লেখকদের মেনে চলার জন্য সরবরাহ করি।

  2. আমাদের আন্তঃমাচীন মেসেজিং সিস্টেমে, বার্তা ক্লাসগুলি সমস্ত একটি নির্দিষ্ট ইন্টারফেস প্রয়োগ করে এবং ইন্টারফেসটি ব্যবহার করে "মোড়কানো" থাকে।

  3. আমাদের কনফিগারেশন পরিচালন সিস্টেমটি কনফিগারেশন সেটিংস সেট এবং পুনরুদ্ধার করতে ব্যবহৃত একটি ইন্টারফেসকে সংজ্ঞায়িত করে।

  4. আমাদের একটি ইন্টারফেস রয়েছে যা আমরা কোনও বাজে বৃত্তাকার রেফারেন্স সমস্যা এড়াতে ব্যবহার করি। (আপনার যদি না করতে হয় তবে এটি করবেন না))

আমার মনে হয় যদি কোনও নিয়ম থাকে তবে এটি ইন্টারফেস ব্যবহার করা উচিত যখন আপনি একটি সম্পর্কের মধ্যে কয়েকটি শ্রেণি গোষ্ঠী করতে চান তবে আপনি বেস শ্রেণিতে কোনও বাস্তবায়ন দিতে চান না।


5

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

interface ILogger
{
    void Log();
}
class FileLogger : ILogger
{
    public void Log() { }
}
class DataBaseLogger : ILogger
{
    public void Log() { }
}
public class MySpecialLogger : SpecialLoggerBase, ILogger
{
    public void Log() { }
}

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

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


4

আমি এখন এবং তার পরে ইন্টারফেস ব্যবহার করেছি এবং এখানে আমার সর্বশেষ ব্যবহার (নামগুলি সাধারণীকরণ করা হয়েছে):

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

myBusinessObject.Save(controlA.Data);
myBusinessObject.Save(controlB.Data);
myBusinessObject.Save(controlC.Data);

এই প্রয়োগের ক্ষেত্রে সমস্যাটি হ'ল যে কোনও সময় আমি কোনও নিয়ন্ত্রণ যুক্ত করি তখন আমার "ডেটা সংরক্ষণ করুন" পদ্ধতিতে গিয়ে নতুন নিয়ন্ত্রণ যুক্ত করতে হয়।

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

foreach(Control c in Controls)
{
  ISaveable s = c as ISaveable;

  if( s != null )
      s.SaveToBusinessObject(myBusinessObject);
}

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

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


4

আপনার ক্লাসের জন্য কোনও আচরণকে বাধ্য করার জন্য আপনার ইন্টারফেসটি সংজ্ঞায়িত করা উচিত।

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

আর একটি ব্যবহারিক উদাহরণ হ'ল অ্যাকশনলিস্টনার (বা চলমান) ইন্টারফেস। আপনি যখন কোনও নির্দিষ্ট ইভেন্টের উপর নজর রাখেন তখন আপনি সেগুলি বাস্তবায়ন করবেন। অতএব, actionPerformed(Event e)আপনার ক্লাসে (বা সাবক্লাস) পদ্ধতিটির জন্য আপনাকে প্রয়োগকরণ সরবরাহ করতে হবে । একইভাবে, চলমান ইন্টারফেসের জন্য, আপনি public void run()পদ্ধতিটির জন্য বাস্তবায়ন সরবরাহ করুন ।

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

আর একটি উদাহরণ যেখানে ইন্টারফেসগুলি ব্যবহৃত হয় (জাভাতে) সি ++ এ দেওয়া একাধিক উত্তরাধিকার প্রয়োগ করা।


3
দয়া করে Godশ্বর তাদের ইন্টারফেসের ক্ষেত্রে একাধিক উত্তরাধিকারের মতো কথা বলা বন্ধ করুন। আপনি কোনও শ্রেণিতে ইন্টারফেসের উত্তরাধিকারী হন না । আপনি বাস্তবায়ন করুন।
আন্দ্রে রেনিয়া

4

ধরুন আপনি বিরক্তি মডেল করতে চান যা আপনি যখন ঘুমাতে যাওয়ার চেষ্টা করবেন তখন ঘটতে পারে।

ইন্টারফেসের আগে মডেল

এখানে চিত্র বর্ণনা লিখুন

class Mosquito {
    void flyAroundYourHead(){}
}

class Neighbour{
    void startScreaming(){}
}

class LampJustOutsideYourWindow(){
    void shineJustThroughYourWindow() {}
}

আপনি স্পষ্ট দেখতে পাওয়ায় অনেকগুলি 'জিনিস' বিরক্তিকর হতে পারে যখন আপনি ঘুমানোর চেষ্টা করেন।

ইন্টারফেস ছাড়াই ক্লাসের ব্যবহার

কিন্তু যখন এই ক্লাসগুলি ব্যবহার করার কথা আসে তখন আমাদের একটি সমস্যা হয়। তাদের কিছু মিল নেই। আপনাকে প্রতিটি পদ্ধতি পৃথকভাবে কল করতে হবে।

class TestAnnoyingThings{
    void testAnnoyingThinks(Mosquito mosquito, Neighbour neighbour, LampJustOutsideYourWindow lamp){
         if(mosquito != null){
             mosquito.flyAroundYourHead();
         }
         if(neighbour!= null){
             neighbour.startScreaming();
         }
         if(lamp!= null){
             lamp.shineJustThroughYourWindow();
         }
    }
}

ইন্টারফেস সহ মডেল

এই প্রোবটি কাটিয়ে ওঠার জন্য আমরা একটি ইটারফেস চালু করতে পারিএখানে চিত্র বর্ণনা লিখুন

interface Annoying{
   public void annoy();

}

এবং এটি ক্লাসের মধ্যে প্রয়োগ করুন

class Mosquito implements Annoying {
    void flyAroundYourHead(){}

    void annoy(){
        flyAroundYourHead();
    }
}

class Neighbour implements Annoying{
    void startScreaming(){}

    void annoy(){
        startScreaming();
    }
}

class LampJustOutsideYourWindow implements Annoying{
    void shineJustThroughYourWindow() {}

    void annoy(){
        shineJustThroughYourWindow();
    }
}

ইন্টারফেসের সাথে ব্যবহার

যা এই ক্লাসগুলির ব্যবহারকে আরও সহজ করে তুলবে

class TestAnnoyingThings{
    void testAnnoyingThinks(Annoying annoying){
        annoying.annoy();
    }
}

ঠিক আছে, কিন্তু নেই Neighbourএবং LampJustOutsideYourWindowবাস্তবায়ন এছাড়াও আছে Annoying?
স্টারডাস্ট

হ্যাঁ, এটি নির্দেশ করার জন্য ধন্যবাদ। আমি এই পরিবর্তনটি দিয়ে একটি সম্পাদনা করেছি
মার্সিন সিজেমজাক

2

সবচেয়ে সহজ উদাহরণটি হল পেমেন্ট প্রসেসরের মতো কিছু something (পেপাল, পিডিএস ইত্যাদি)।

বলুন আপনি একটি ইন্টারফেস আইপেমেন্টপ্রসেসর তৈরি করেন যাতে প্রসেসাচ এবং প্রসেসক্রিডিটকার্ড পদ্ধতি রয়েছে।

আপনি এখন একটি কংক্রিট পেপাল বাস্তবায়ন বাস্তবায়ন করতে পারেন। এই পদ্ধতিগুলি তৈরি করে পেপালকে সুনির্দিষ্ট ফাংশনগুলি কল করুন।

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


2

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

http://www.nmock.org/


2

যদি আপনি .NET ফ্রেমওয়ার্ক অ্যাসেম্বলিগুলি ব্রাউজ করেন এবং স্ট্যান্ডার্ড অবজেক্টগুলির জন্য বেস ক্লাসগুলিতে ড্রিল করেন তবে আপনি অনেকগুলি ইন্টারফেস লক্ষ্য করবেন (সদস্যরা আইসোমেনেম নামে পরিচিত)।

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

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

ক্লাসিক উদাহরণ: আইডিস্পোজেবল ইন্টারফেস বাস্তবায়ন না করে আপনি সি # তে "ব্যবহার করে ()" কীওয়ার্ড কনস্ট্রাক্ট ব্যবহার করতে পারবেন না, কারণ এর জন্য প্রয়োজন যে প্যারামিটার হিসাবে নির্দিষ্ট যে কোনও অবজেক্টকে সুস্পষ্টভাবে আইডিসপোজেবল কাস্ট করা যেতে পারে।

কমপ্লেক্স উদাহরণ: আরও জটিল উদাহরণ হ'ল সিস্টেম.কম্পোনেন্টমোডেল C কম্পোনেন্ট ক্লাস। এই শ্রেণিটি আইডিস্পোজেবল এবং আইসি কমপোয়েন্টি উভয়ই প্রয়োগ করে। বেশিরভাগ, সমস্ত কিছু না থাকলে .NET অবজেক্টগুলির সাথে ভিজ্যুয়াল ডিজাইনার যুক্ত তাদের আইসিম্পোম্পোনটি প্রয়োগ করে যাতে আইডিই উপাদানটির সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হয়।

উপসংহার: আপনি নেট নেট ফ্রেমওয়ার্কের সাথে আরও পরিচিত হওয়ার সাথে সাথে অবজেক্ট ব্রাউজারে বা .NET রিফ্লেক্টর (ফ্রি) টুলের ( http://www.red-gate.com ) এর মধ্যে নতুন ক্লাসের মুখোমুখি হওয়ার সময় আপনি প্রথমটি করবেন do / পণ্য / প্রতিচ্ছবি / ) এটি কোন শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এটি প্রয়োগ করে এমন ইন্টারফেসগুলিও পরীক্ষা করে দেখানো হয়। .NET রিফ্লেক্টর অবজেক্ট ব্রাউজারের চেয়ে আরও ভাল কারণ এটি আপনাকে উত্পন্ন ক্লাসগুলিও দেখতে দেয়। এটি আপনাকে নির্দিষ্ট শ্রেণীর থেকে প্রাপ্ত সমস্ত অবজেক্ট সম্পর্কে জানার অনুমতি দেয় এবং এর ফলে সম্ভাব্যভাবে ফ্রেমওয়ার্কের কার্যকারিতা সম্পর্কে শিখতে পারে যা আপনি জানেন না। .NET ফ্রেমওয়ার্কে আপডেট বা নতুন নেমস্পেস যুক্ত করা হলে এটি বিশেষত তাৎপর্যপূর্ণ।


2

আপনি প্রথম ব্যক্তি শুটিং গেম করছেন বিবেচনা করুন। খেলোয়াড়ের কাছে বেছে নিতে একাধিক বন্দুক রয়েছে।

আমাদের একটি ইন্টারফেস থাকতে পারে Gunযা একটি ফাংশন সংজ্ঞায়িত করে shoot()

আমাদের Gunক্লাসের বিভিন্ন সাবক্লাস প্রয়োজন যথা ShotGun Sniperইত্যাদি।

ShotGun implements Gun{
    public void shoot(){
       \\shotgun implementation of shoot.
    } 
}

Sniper implements Gun{
    public void shoot(){
       \\sniper implementation of shoot.
    } 
}

শ্যুটার ক্লাস

শ্যুটারের তার আর্মারে সমস্ত বন্দুক রয়েছে। Listএটি উপস্থাপন করতে একটি তৈরি করতে দেয় ।

List<Gun> listOfGuns = new ArrayList<Gun>();

শ্যুটারটি তার বন্দুকগুলি দিয়ে যখন প্রয়োজন হয় তখন ফাংশনটি ব্যবহার করে cles switchGun()

public void switchGun(){
    //code to cycle through the guns from the list of guns.
    currentGun = //the next gun in the list.
}

উপরের ফাংশনটি ব্যবহার করে আমরা বর্তমান বন্দুক সেট করতে পারি এবং shoot()যখন fire()ডাকা হয় তখন কেবল ফাংশন কল করতে পারি ।

public void fire(){
    currentGun.shoot();
}

এর বিভিন্ন বাস্তবায়ন অনুযায়ী শ্যুট ফাংশনের আচরণে পৃথক হবে Gunইন্টারফেসের ।

উপসংহার

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

যেমন ক্লাস fire()থেকে ফাংশন Shooterবন্দুকের প্রত্যাশা করে ( Sniper, ShotGun) shoot()ফাংশনটি বাস্তবায়িত করে । সুতরাং আমরা যদি বন্দুক এবং সুইচ সুইচ।

shooter.switchGun();
shooter.fire();

আমরা fire()ফাংশনের আচরণ পরিবর্তন করেছি ।


1

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


1

ইন্টারফেসগুলি সাধারণত ব্যবহৃত হয় যখন আপনি কোনও আচরণের সংজ্ঞা দিতে চান যা অবজেক্টগুলি প্রদর্শন করতে পারে।

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

(ডিসপোজ () পদ্ধতিটি ভিবি.এনইটি এবং সি # এর জন্য ল্যাংগুয়েজ কনস্ট্রাক্ট ব্যবহার করে ডাকা হয় , যা কেবলমাত্র কাজ করেIDisposable )

মনে রাখবেন যে কোনও বস্তু TypeOf ... Is(ভিবি.এনইটি), is(সি #), instanceof(জাভা) ইত্যাদির মতো কনস্ট্রাক্ট ব্যবহার করে কোনও নির্দিষ্ট ইন্টারফেস প্রয়োগ করে কিনা তা আপনি পরীক্ষা করতে পারেন ...


1

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

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

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

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


1

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

যথারীতি এখানে একটি বাণিজ্য বন্ধ রয়েছে: রক্ষণাবেক্ষণের উপর নমনীয়তা। কোনটি আরও গুরুত্বপূর্ণ? কোনও উত্তর নেই - এটি প্রকল্পের উপর নির্ভর করে। তবে কেবল মনে রাখবেন যে প্রতিটি সফ্টওয়্যারই বজায় রাখতে হবে ...

সুতরাং আমার পরামর্শ: আপনার সত্যিকারের প্রয়োজন না হওয়া পর্যন্ত ইন্টারফেস ব্যবহার করবেন না। (ভিজ্যুয়াল স্টুডিওর সাহায্যে আপনি বিদ্যমান সেকেন্ড থেকে 2 সেকেন্ডের মধ্যে একটি ইন্টারফেস বের করতে পারেন - তাই তাড়াতাড়ি করবেন না))

এটি বলার পরে, আপনার কখন একটি ইন্টারফেস তৈরি করতে হবে?

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

এবং এটি কাজ করে: ও)

একটি ব্যতিক্রম: আমি যখন বস্তুগুলি উপহাস করি তখন ইন্টারফেসটি ব্যবহার করা আরও সহজ। সুতরাং আমি প্রায়শই এই জন্য ইন্টারফেস তৈরি।

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

শুভেচ্ছা, সিলভাইন।


1

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

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

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

একটি ইন্টারফেসে কোডিং সম্পর্কে এই সম্পর্কিত প্রশ্নটিও দেখুন ।


1

ইন্টারফেস ব্যবহারের জন্য অনেকগুলি উদ্দেশ্য রয়েছে।

  1. পলিমারফিক আচরণে ব্যবহার করুন। যেখানে আপনি শিশু শ্রেণির নির্দিষ্ট পদ্ধতিগুলিতে কল করতে চান যেখানে ইন্টারফেসের সাথে শিশু শ্রেণির একটি উল্লেখ রয়েছে।

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

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

যেমন IUser, IOrder, IOrderItem

public interface IUser()
{

void AddUser(string name ,string fname);

}

// Same for IOrder and IOrderItem
//


public class  BusinessLayer: IUser, IOrder, IOrderItem

{    
    public void AddUser(string name ,string fname)
    {
        // Do stuffs here.
    }

    // All methods from all interfaces must be implemented.

}

আপনি যদি কেবল কোনও ব্যবহারকারী যুক্ত করতে চান তবে এটি করুন:

IUser user = new (IUser)BusinessLayer();

// It will load  all methods into memory which are declared in the IUser interface.

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