আমি বেশিরভাগ সময় স্পষ্টত ইন্টারফেস প্রয়োগ করি। এখানে মূল কারণ রয়েছে।
রিফ্যাক্টরিং নিরাপদ
কোনও ইন্টারফেস পরিবর্তন করার সময়, সংকলক এটি পরীক্ষা করতে পারলে ভাল। অন্তর্নিহিত বাস্তবায়ন সহ এটি আরও শক্ত।
দুটি সাধারণ ক্ষেত্রে মাথায় আসে:
একটি ইন্টারফেসে একটি ফাংশন যুক্ত করা, যেখানে একটি বিদ্যমান শ্রেণি যা এই ইন্টারফেসটি প্রয়োগ করে ইতিমধ্যে নতুনটির মতো একই স্বাক্ষরের একটি পদ্ধতি রয়েছে । এটি অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে এবং বেশ কয়েকবার আমাকে কঠোর কামড় দিয়েছে। ডিবাগ করার সময় "দেখা" এটি মুশকিল কারণ কারণ ফাংশনটি ফাইলের অন্যান্য ইন্টারফেস পদ্ধতির (সম্ভবত নীচে উল্লিখিত স্ব-ডকুমেন্টিং ইস্যু) উপস্থিত নেই is
একটি ইন্টারফেস থেকে একটি ফাংশন সরানো । সুস্পষ্টভাবে প্রয়োগকৃত পদ্ধতিগুলি হঠাৎ করে ডেড কোড হয়ে যাবে, তবে স্পষ্টতই প্রয়োগ করা পদ্ধতিগুলি সংকলনের ত্রুটির দ্বারা ধরা পড়বে। এমনকি ডেড কোডটি চারপাশে রাখা ভাল, আমি এটি পর্যালোচনা করতে এবং প্রচার করতে বাধ্য হতে চাই।
এটি দুর্ভাগ্যজনক যে সি # এর একটি কীওয়ার্ড নেই যা কোনও পদ্ধতিকে একটি অন্তর্নিহিত বাস্তবায়ন হিসাবে চিহ্নিত করতে বাধ্য করে, তাই সংকলক অতিরিক্ত চেক করতে পারে। ভার্চুয়াল পদ্ধতিতে 'ওভাররাইড' এবং 'নতুন' এর প্রয়োজনীয় ব্যবহারের কারণে উপরের সমস্যার কোনওটিই নেই।
দ্রষ্টব্য: স্থির বা খুব কমই পরিবর্তিত ইন্টারফেসের জন্য (সাধারণত বিক্রেতা এপিআই এর), এটি কোনও সমস্যা নয়। আমার নিজের ইন্টারফেসের জন্য, তবে তারা কখন / কীভাবে পরিবর্তিত হবে তা আমি অনুমান করতে পারি না can't
এটি স্ব-ডকুমেন্টিং
যদি আমি কোনও ক্লাসে 'পাবলিক বুল এক্সিকিউট ()' দেখি, তবে এটি কোনও ইন্টারফেসের অংশ বলে তা জানতে অতিরিক্ত কাজ করা যাচ্ছে take কাউকে সম্ভবত এটি বলার জন্য মন্তব্য করতে হবে, বা এটিকে অন্য কোনও ইন্টারফেস বাস্তবায়নের একটি গোষ্ঠীতে রাখতে হবে, সমস্তই একটি অঞ্চলের অধীনে বা "আইটিস্কের বাস্তবায়ন" বলে মন্তব্য করার গ্রুপিংয়ের অন্তর্ভুক্ত। অবশ্যই, এটি কেবল তখনই কাজ করে যদি গ্রুপ শিরোনামটি অফস্ক্রিন না করে ..
যেখানে: 'বুল আইটাস্ক.এক্সেকিউট ()' স্পষ্ট এবং দ্ব্যর্থহীন।
ইন্টারফেস বাস্তবায়ন পৃথক পৃথক
আমি ইন্টারফেসগুলিকে পাবলিক পদ্ধতির চেয়ে বেশি 'পাবলিক' বলে মনে করি কারণ তারা কংক্রিটের ধরণের পৃষ্ঠের ক্ষেত্রফলের কিছুটা অংশ উন্মুক্ত করার জন্য তৈরি করা হয়। এগুলি প্রকারভেদ, আচরণ, বৈশিষ্ট্য ইত্যাদির ধরনকে হ্রাস করে এবং প্রয়োগের ক্ষেত্রে, আমি মনে করি এই বিচ্ছেদটি রাখা কার্যকর useful
আমি যেমন ক্লাসের কোডটি সন্ধান করছি, যখন আমি স্পষ্ট ইন্টারফেস বাস্তবায়নগুলি দেখতে পাই তখন আমার মস্তিষ্ক "কোড চুক্তি" মোডে স্থানান্তরিত হয়। প্রায়শই এই বাস্তবায়নগুলি কেবল অন্য পদ্ধতির দিকে অগ্রসর হয় তবে কখনও কখনও তারা অতিরিক্ত স্টেট / প্যারাম চেকিং, অভ্যন্তরীণ প্রয়োজনীয়তার সাথে আরও ভাল মেলে অভ্যন্তরীণ পরামিতিগুলি রূপান্তর করতে পারে, বা এমনকি সংস্করণকরণের উদ্দেশ্যে অনুবাদ করে (অর্থাত্ ইন্টারফেসের একাধিক প্রজন্ম সমস্ত সাধারণ বাস্তবায়নে ডুবে থাকে)।
(আমি বুঝতে পারি যে পাবলিকগুলিও কোড চুক্তি, তবে ইন্টারফেসগুলি আরও শক্তিশালী হয়, বিশেষত একটি ইন্টারফেস-চালিত কোডবেসে যেখানে কংক্রিটের ধরণের সরাসরি ব্যবহার সাধারণত অভ্যন্তরীণ-কেবল কোডের লক্ষণ sign)
সম্পর্কিত: জোনের উপরোক্ত কারণ 2 ।
ইত্যাদি
প্লাস এখানে অন্যান্য উত্তরে ইতিমধ্যে উল্লিখিত সুবিধাগুলি:
সমস্যা
এটা সব মজা এবং সুখ নয়। কিছু ঘটনা রয়েছে যেখানে আমি জড়িত থাকি:
- মান ধরণের, কারণ এর জন্য বক্সিং এবং নিম্ন পারফের প্রয়োজন হবে। এটি কোনও কঠোর নিয়ম নয় এবং এটি ইন্টারফেস এবং এটি কীভাবে ব্যবহার করা হবে তা নির্ভর করে। IComparable? অন্তর্নিহিত। IFormattable? সম্ভবত সুস্পষ্ট।
- তুচ্ছ সিস্টেম ইন্টারফেসগুলিতে এমন পদ্ধতি রয়েছে যা ঘন ঘন সরাসরি বলা হয় (যেমন আইডিস্পোজেবল is ডিসপোজ)।
এছাড়াও, আপনি যখন কংক্রিটের ধরণ রাখেন এবং একটি স্পষ্টত ইন্টারফেস পদ্ধতিতে কল করতে চান তখন ingালাই করতে ব্যথা হতে পারে। আমি দুটি পদ্ধতির একটিতে এটি মোকাবেলা করেছি:
- জনসাধারণ যুক্ত করুন এবং প্রয়োগের জন্য তাদের কাছে ইন্টারফেসের পদ্ধতিগুলি এগিয়ে রাখুন। সাধারণত অভ্যন্তরীণভাবে কাজ করার সময় সহজ ইন্টারফেসগুলির সাথে ঘটে।
- (আমার পছন্দসই পদ্ধতি) একটি যুক্ত করুন
public IMyInterface I { get { return this; } }
(যা অন্তর্ভুক্ত হওয়া উচিত) এবং কল করুন foo.I.InterfaceMethod()
। যদি একাধিক ইন্টারফেসের এই দক্ষতার প্রয়োজন হয় তবে আমি ছাড়িয়ে এই নামটি প্রসারিত করুন (আমার অভিজ্ঞতাতে আমার এই প্রয়োজনটি বিরল)।