কেবল শ্রেণিবিন্যাসের জন্য ইন্টারফেস ব্যবহার করা কি খারাপ অভ্যাস?


12

উদাহরণ স্বরূপ:

আমি ক্লাস আছে বলুন A, B, C। আমার দুটি ইন্টারফেস রয়েছে, আসুন তাদের কল করুন IAnimalএবং IDogIDogথেকে উত্তরাধিকারী IAnimalAএবং Bহয় IDog, এস যখন Cনয়, কিন্তু এটি একটি হল IAnimal

গুরুত্বপূর্ণ অংশটি হ'ল IDogকোনও অতিরিক্ত কার্যকারিতা সরবরাহ করে না। এটি কেবল নির্দিষ্ট পদ্ধতির আর্গুমেন্ট হিসাবে পাস করার অনুমতি দেওয়ার জন্য Aএবং ব্যবহৃত হয় Bতবে তা নয় C

এটা কি খারাপ অভ্যাস?



5
@ জারোদরবার্সন যখন আমি সম্মতি জানাতে চাই, আপনি যদি নেট ওয়ার্ল্ডে কাজ করেন তবে আপনি একরকম আটকে আছেন (অথবা আপনি যদি অন্যভাবে এটি করেন তবে প্রতিষ্ঠিত সম্মেলনের বিরুদ্ধে যাবেন)।
ড্যানিয়েল বি

2
@JarrodRoberson এই প্রোগ্রামটিতে MyProject.Data.IAnimalএবং MyProject.Data.Animalচেয়ে ভাল MyProject.Data.Interfaces.Animalএবং MyProject.Data.Implementations.Animal
মাইক Koder

1
বিন্দু এমনকি যত্ন কোন কারণে করা উচিত হবে না যদি এটি একটি হল Interfaceবা Implementationএকটি পুনরাবৃত্তিমূলক উপসর্গ বা নামস্থান পারেন কিনা, এটি একটি অনুলাপ উভয় ক্ষেত্রেই হয় এবং শুষ্ক লঙ্ঘন করে। Dogআপনার যত্ন নেওয়া উচিত। PitBull extends Dogহয় বাস্তবায়ন অপ্রয়োজনীয়তা প্রয়োজন হয় না, শব্দটি extendsআমার জানার প্রয়োজন সব আমাকে বলে, আমার মূল মন্তব্যে পোস্ট করা লিংকটি পড়ুন।

1
@ জারোদ: আমার কাছে অভিযোগ করা বন্ধ করুন। .NET দেব দলে অভিযোগ করুন। আমি যদি মানটির বিরুদ্ধে যাই তবে আমার সহকর্মীরা আমার সাহসকে ঘৃণা করবে।
কেন্ডাল ফ্রে

উত্তর:


13

ইন্টারফেস যার কোন সদস্য নেই বা অন্য ইন্টারফেসের সাথে ঠিক একই সদস্য রয়েছে যা মার্কার ইন্টারফেস বলে একই ইন্টারফেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং আপনি এটি চিহ্নিতকারী হিসাবে ব্যবহার করছেন।

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

আমি আত্মবিশ্বাসের সাথে বলতে পারি যে এটি অনুশীলন খারাপ নয় কারণ আমি অর্চার্ড প্রকল্পে ভারী ব্যবহার "মার্কার ইন্টারফেস" প্যাটার্নটি দেখেছি

অর্চার্ড প্রকল্পের নমুনা এখানে ।

public interface ISingletonDependency : IDependency {}

/// <summary>
/// Base interface for services that may *only* be instantiated in a unit of work.
/// This interface is used to guarantee they are not accidentally referenced by a singleton dependency.
/// </summary>
public interface IUnitOfWorkDependency : IDependency {}

/// <summary>
/// Base interface for services that are instantiated per usage.
/// </summary>
public interface ITransientDependency : IDependency {}

পড়ুন দয়া করে মার্কার ইন্টারফেস


বৈশিষ্ট্য / টীকাগুলি সংকলন-সময় চেকিং (সি # একটি রেফারেন্স ভাষা হিসাবে ব্যবহার করে) সমর্থন করবে? আমি জানি যদি অবজেক্টটির বৈশিষ্ট্য না থাকে তবে আমি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারি তবে ইন্টারফেস প্যাটার্নটি সংকলনের সময় ত্রুটিগুলি ক্যাচ করে।
কেন্ডাল ফ্রে

আপনি যদি মার্কার ইন্টারফেস ব্যবহার করে থাকেন তবে আপনার কমপিলে চেক সুবিধাটি মোটেই পান নি। আপনি মূলত ইন্টারফেস দ্বারা টাইপ চেক করছেন।
ফ্রেশব্লুড

আমি বিভ্রান্ত এই 'চিহ্নিতকারী ইন্টারফেস' প্যাটার্নটি সংকলন-সময় চেকগুলি সরবরাহ করে, যাতে আপনি Cকোনও প্রত্যাশার পদ্ধতিতে পাস করতে পারবেন না IDog
কেন্ডল ফ্রে

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

তেলস্তিনের উত্তরের মন্তব্যে আমি যেমনটি করেছি তেমন বর্ণনা করতে দাও। যেমন আমার একটি Kennelক্লাস রয়েছে যা একটি তালিকা সঞ্চয় করে IDog
কেন্ডাল ফ্রে

4

হ্যাঁ, প্রায় প্রতিটি ভাষায় এটি একটি খারাপ অভ্যাস।

ডেটা এনকোড করার জন্য প্রকারগুলি নেই; তারা এমন একটি প্রমাণ যা প্রমাণ করতে পারে যে আপনার ডেটা যেখানে যেতে হবে সেখানে আচরণ করা উচিত এবং আচরণ করা যেমন প্রয়োজন তেমন আচরণ করে। উপ-প্রকারের একমাত্র কারণ হ'ল যদি বহুতল আচরণ পরিবর্তন হয় (এবং তখন সবসময় না)।

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

[সম্পাদনা: স্পষ্টকরণ]

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

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


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

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

@ কেন্ডালফ্রে: হয় আপনি ইন্টারফেসের বাইরে ফেলেছেন (খারাপ), অথবা আপনি একটি কৃত্রিম পার্থক্য তৈরি করছেন যা একটি ভুল বিমূর্তির গন্ধ পাচ্ছে।
তেলস্তিন

2
@ টেলাস্টিন - ইন্টারফেসের মতো উদ্দেশ্য হ'ল একটি মেটাডেটা সরবরাহ করা
ফ্রেশব্লুড

1
@ টেলাস্টিন: সুতরাং সংকলন-সময় পরীক্ষার ক্ষেত্রে কীভাবে বৈশিষ্ট্যগুলি প্রয়োগ হয়? আফাইক, সি # তে, বৈশিষ্ট্যগুলি কেবল রানটাইম ব্যবহার করা যেতে পারে।
কেন্ডাল ফ্রে

2

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

if(animal is IDog)
{
}
if(animal.Type == AnimalType.Dog)
{
}
if(animal.GetType().GetCustomAttributes(typeof(DogAttribute), false).Any())
{
}


var dogs1 = animals.OfType<IDog>();
var dogs2 = animals.Where(a => a.Type == AnimalType.Dog);
var dogs3 = animals.Where(a => a.GetType().GetCustomAttributes(typeof(DogAttribute), false).Any());


var dogsFromDb1 = session.Query<IDog>();
var dogsFromDb2 = session.Query<Animal>().Where(a => a.Type == AnimalType.Dog);
var dogsFromDb3 = session.Query<Animal>().Where(a => a.GetType().GetCustomAttributes(typeof(DogAttribute),false).Any());


public void DoSomething(IDog dog)
{
}
public void DoSomething(Animal animal)
{
    if(animal.Type != AnimalType.Dog)
    {
        throw new ArgumentException("This method should be used for dogs only.");
    }
}
public void DoSomething(Animal animal)
{
    if(!animal.GetType().GetCustomAttributes(typeof(DogAttribute), false).Any())
    {
        throw new ArgumentException("This method should be used for dogs only.");
    }
}

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

আমার একটি সিমিলার ব্যবহারের কেস রয়েছে তবে বেশিরভাগ নেট নেটরা এর বিরুদ্ধে
দৃ strongly়ভাবে

-1

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

উদাহরণস্বরূপ, ধরুন আমার ইন্টারফেস রয়েছে:

ইন্টারফেস IMaybeMutableFoo {
  বার জিনিসটি {get; set;; // এবং পাশাপাশি অন্যান্য বৈশিষ্ট্য
  বুল ইসমুটেবল;
  IImmutableFoo AsImmutable ();
}
ইন্টারফেস IImmutableFoo: IMaybeMutableFoo {};

একটি বাস্তবায়ন IImmutableFoo.AsImmutable()নিজেই ফিরে প্রত্যাশিত হবে; একটি পরিবর্তনীয় শ্রেণি বাস্তবায়নের IMaybeMutableFoo.AsImmutable()মাধ্যমে ডেটাগুলির স্ন্যাপশট যুক্ত নতুন গভীরভাবে-অপরিবর্তনীয় বস্তুর প্রত্যাশা করা হবে। একটি রুটিন যা একটি আটকানো ডেটার স্ন্যাপশট সংরক্ষণ করতে চায় IMaybeMutableFooওভারলোডগুলি দিতে পারে:

পাবলিক অকার্যকর স্টোরডাটা (IImmutableFoo ThingToStore)
{
  // রেফারেন্সটি সংরক্ষণ করা যথেষ্ট হবে, যেহেতু থিংটোস্টোর স্থায়ী হিসাবে পরিচিত
}
পাবলিক অকার্যকর স্টোরডাটা (IMaybeMutableFoo ThingToStore)
{
  StoreData (ThingToStore.AsImmutable ()); // আরও নির্দিষ্ট ওভারলোডকে কল করুন
}

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


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