ইন্টারফেসের নীতিমালাটিতে "আপনার যা প্রয়োজন কেবল তার জন্যই জিজ্ঞাসা করুন"?


9

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

উদাহরণস্বরূপ, যদি আমার মুছতে পারে এমন ধরণের গোছা থাকে তবে আমি একটি Deletableইন্টারফেস তৈরি করব :

interface Deletable {
   void delete();
}

তারপরে আমি জেনেরিক ক্লাস লিখতে পারি:

class Deleter<T extends Deletable> {
   void delete(T t) {
      t.delete();
   }
}

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

এই নীতিটি কি সাধারণ জ্ঞান এবং ইতিমধ্যে একটি স্বীকৃত নাম রয়েছে? এটা কি বিতর্কিত? এটা কি পাঠ্যপুস্তকে আলোচনা করা হয়?


1
আলগা কাপলিং হতে পারে? বা সংকীর্ণ ইন্টারফেস?
tdammers

উত্তর:


16

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


4

ভাদিমের খুব উত্তরের উত্তরটি প্রসারিত করতে আমি "এটি কি বিতর্কিত" প্রশ্নের সাথে "না, সত্যই নয়" এর উত্তর দেব।

সাধারণভাবে, ইন্টারফেস বিভাজন জড়িত বিভিন্ন সামগ্রীর "পরিবর্তনের কারণগুলি" এর সামগ্রিক সংখ্যা হ্রাস করে একটি ভাল জিনিস। মূল নীতিটি হ'ল, যখন একাধিক পদ্ধতির ইন্টারফেস পরিবর্তন করতে হবে, ইন্টারফেসের কোনও একটি প্যারামিটার যুক্ত করতে বলুন, তবে ইন্টারফেসের সমস্ত গ্রাহককে কমপক্ষে পুনরায় সংযুক্ত করতে হবে, এমনকি যদি তারা পরিবর্তিত পদ্ধতিটি ব্যবহার না করে if। "তবে এটি কেবল একটি রিকম্পাইল!", আমি আপনাকে বলতে শুনেছি; এটি সত্য হতে পারে, তবে মনে রাখবেন যে সাধারণত, আপনি যে কোনও কিছু পুনঃনির্মাণ করেন তা অবশ্যই বাইনারিতে পরিবর্তন যত তাড়াতাড়ি গুরুত্বপূর্ণ তা বিবেচনা না করে কোনও সফ্টওয়্যার প্যাচের অংশ হিসাবে আপনাকে বাইরে বের করে দিতে হবে। এই বিধিগুলি মূলত 90 এর দশকের গোড়ার দিকে ধারণা করা হয়েছিল, যখন আপনার পকেটে গড় ডেস্কটপ ওয়ার্কস্টেশনটি ফোনের চেয়ে কম শক্তিশালী ছিল, 14.4k বাউড ডায়াল-আপ ব্লেজিন ছিল, এবং 3.5 "1.44 এমবি" ফ্লপপিস "প্রাথমিক অপসারণযোগ্য মিডিয়া ছিল। এমনকি 3G / 4G এর বর্তমান যুগে, ওয়্যারলেস ইন্টারনেট ব্যবহারকারীরা প্রায়শই সীমাবদ্ধতার সাথে ডেটা প্ল্যান করে থাকেন, তাই আপগ্রেড প্রকাশ করার সময়, যত কম বাইনারি ডাউনলোড করতে হবে, তত ভাল।

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

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

ইন্টারফেস পৃথককরণ ইন্টারফেসের উপর নির্ভরশীল ক্লাসগুলির উপর ভিত্তি করে হওয়া উচিত:

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

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

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


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

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

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

উদাহরণস্বরূপ, অ্যারেগুলি ECRW সমর্থন করবে। একটি অ্যারেলিস্ট ECRWIDNA সমর্থন করবে। একটি থ্রেড-নিরাপদ তালিকা ECRWNA সমর্থন করতে পারে [যদিও এ সাধারণত সাধারণত তালিকা প্রাক-জনপ্রিয়করণের জন্য কার্যকর হবে]। কেবল পঠনযোগ্য অ্যারে র‌্যাপারটি ইসিআরকে সমর্থন করতে পারে। একটি সমবায়ু তালিকা ইন্টারফেস ECRD সমর্থন করতে পারে। একটি জেনেরিক ইন্টারফেস টাইপ-নিরাপদ সমর্থন সি বা সিডি সরবরাহ করতে পারে। যদি অদলবদল একটি বিকল্প ছিল, কিছু ধরণের সিএস সমর্থন করতে পারে তবে ডি (যেমন অ্যারেগুলি) সমর্থন করতে পারে না অন্যরা সিডিএস সমর্থন করবে। প্রতিটি প্রয়োজনীয় ক্ষমতার সংমিশ্রণের জন্য স্বতন্ত্র ইন্টারফেসের ধরণের সংজ্ঞা দেওয়ার চেষ্টা করা দুঃস্বপ্ন হতে পারে।
সুপারক্যাট

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