আমার যদি ইতিমধ্যে একটি বিমূর্ত শ্রেণি থাকে তবে কোনও ইন্টারফেসটি সংজ্ঞায়িত করার অর্থ কী?


12

আমার কিছু ডিফল্ট / ভাগ করা কার্যকারিতা সহ একটি বর্গ রয়েছে। আমি abstract classএটির জন্য ব্যবহার করি:

public interface ITypeNameMapper
{
    string Map(TypeDefinition typeDefinition);
}

public abstract class TypeNameMapper : ITypeNameMapper
{
    public virtual string Map(TypeDefinition typeDefinition)
    {
        if (typeDefinition is ClassDefinition classDefinition)
        {
            return Map(classDefinition);
        }
        ...

        throw new ArgumentOutOfRangeException(nameof(typeDefinition));
    }

    protected abstract string Map(ClassDefinition classDefinition);
}

আপনি দেখতে পাচ্ছেন, আমার ইন্টারফেসটিও রয়েছে ITypeNameMapper। আমার যদি ইতিমধ্যে একটি বিমূর্ত শ্রেণি থাকে TypeNameMapperবা abstract classকেবল যথেষ্ট হয় তবে এই ইন্টারফেসটি সংজ্ঞায়িত করার অর্থ কী?

TypeDefinition এই সর্বনিম্ন উদাহরণে বিমূর্ত।


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

1
ইন্টারফেসের জায়গায় বেস ক্লাস ব্যবহার করা, যদি আপনার একেবারে না থাকে তবে তাকে "বেস বার্নিং" বলা হয়। যদি এটি কোনও ইন্টারফেস দিয়ে করা যায় তবে এটি একটি ইন্টারফেস দিয়ে করুন। বিমূর্ত শ্রেণিটি তখন সহায়ক অতিরিক্ত হয়ে ওঠে। artima.com/intv/dotnet.html বিশেষত, রিমোটিংয়ের জন্য আপনাকে মার্শালবাইরফঅবজেক্ট থেকে নেওয়া দরকার তাই আপনি যদি সরে যেতে চান তবে আপনি অন্য কোনও কিছু থেকে উদ্ভূত হতে পারবেন না
বেন

@ রডনিপি.বাড়বাতি যদি পরিস্থিতি অনুসারে আমি পরিবর্তন করতে পারি একই ধরণের জন্য অনেক ম্যাপার পেতে চাইলে কাজ করবে না
কনরাড

1
@ বেইনটি জ্বলন্ত আকর্ষণীয়। রত্নের জন্য ধন্যবাদ!
কনরাড

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

উত্তর:


31

হ্যাঁ, কারণ সি # ইন্টারফেস বাদে একাধিক উত্তরাধিকারের অনুমতি দেয় না।

সুতরাং যদি আমার কাছে কোনও ক্লাস থাকে যা টাইপনামম্যাপার এবং সামথিনজেলস ম্যাপার উভয়ই আমি করতে পারি:

class MultiFunctionalClass : ITypeNameMapper, ISomethingelseMapper 
{
    private TypeNameMapper map1
    private SomethingelseMapper map2

    public string Map(TypeDefinition typeDefinition) { return map1.Map(typeDefintion);}

    public string Map(OtherDef otherDef) { return map2.Map(orderDef); }
}

4
@ লিয়্যাথ: উত্তরাধিকার কেন প্রয়োজন তা সম্পর্কে একক দায়বদ্ধতা আসলে অবদানের কারণ। তিনটি সম্ভাব্য বৈশিষ্ট্যগুলো বিবেচনা করুন: ICanFly, ICanRun, ICanSwim। আপনাকে 8 টি প্রাণী শ্রেণি তৈরি করতে হবে, প্রতিটি বৈশিষ্ট্যের সমন্বয়ের জন্য একটি (ওয়াইওয়াই, ওয়াইওয়াইএন, ওয়াইএনওয়াই, ..., এনএনওয়াই, এনএনএন)। এসআরপি হ'ল বিশ্লেষণ করে যে আপনি প্রতিটি আচরণ (ফ্লাই, রান, সাঁতার) একবার প্রয়োগ করেন এবং তারপরে 8 টি প্রাণীর উপর পুনরায় প্রয়োগ করুন us রচনা এখানে আরও ভাল হবে, তবে এক সেকেন্ডের জন্য রচনাটিকে উপেক্ষা করে আপনার এসআরপি-র কারণে একাধিক পৃথক পুনরায় ব্যবহারযোগ্য আচরণের উত্তরাধিকারী / প্রয়োগকরণের প্রয়োজনীয়তাটি ইতিমধ্যে দেখতে হবে ।
Flater

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

3
(1) কার্যকর ইন্টারফেস উত্তরাধিকার? (২) প্রশ্নোত্তর উভয়ই যোগ্য হতে হবে। "এটা নির্ভর করে." (3) একাধিক উত্তরাধিকার এতে সতর্কতা স্টিকার লাগবে। (৪) আমি আপনাকে কে এর ক্র্যাকট্যাকুলার আনুষ্ঠানিক অপব্যবহার দেখিয়ে দিতে পারি interface.. বেডে থাকা অপ্রয়োজনীয় বাস্তবায়ন - যা স্বতন্ত্রভাবে বিকশিত হয় !, শর্তযুক্ত লজিক পরিবর্তনগুলি এই জাঙ্কটিকে টেমপ্লেটের পদ্ধতি, ভাঙ্গা এনক্যাপসুলেশন, অ-অযৌক্তিক বিমূর্ততার জন্য চালিত করে driving আমার প্রিয়: 1-পদ্ধতি শ্রেণি প্রতিটি প্রত্যেকে তার নিজস্ব 1-পদ্ধতি প্রয়োগ করে interface, প্রতিটি ডাব্লু / কেবলমাত্র একক উদাহরণ। ... ইত্যাদি, ইত্যাদি, এবং ইত্যাদি
রডারবব

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

4
@radarbob পোয়েটিক Agree _ ^ আমি সম্মত হই; ইন্টারফেসের ব্যয় কম হলেও এটি অস্তিত্বহীন নয়। এগুলি লেখার ক্ষেত্রে তেমন কিছু নয়, তবে একটি ডিবাগিং পরিস্থিতিতে প্রকৃত আচরণে পৌঁছানোর আরও 1-2 টি পদক্ষেপ যা আপনি যখন বিমূর্ততার গভীর অর্ধ-ডজন স্তর পেয়ে যাবেন তখন তা দ্রুত যুক্ত হতে পারে। একটি লাইব্রেরিতে এটি সাধারণত মূল্যবান। তবে একটি অ্যাপ্লিকেশনটিতে, অকাল সাধারণকরণের চেয়ে রিফ্যাক্টরিং ভাল।
এররেসটজ

1

ইন্টারফেস এবং বিমূর্ত শ্রেণি বিভিন্ন উদ্দেশ্যে পরিবেশন করে:

  • ইন্টারফেসগুলি এপিআই'র সংজ্ঞা দেয় এবং প্রয়োগগুলি নয় ক্লায়েন্টদের সাথে সম্পর্কিত।
  • যদি ক্লাসগুলি বাস্তবায়ন ভাগ করে নেয় তবে আপনি একটি বিমূর্ত ক্লাস থেকে উপকৃত হতে পারেন ।

আপনার উদাহরণে, interface ITypeNameMapperক্লায়েন্টদের প্রয়োজনীয়তা সংজ্ঞায়িত করে এবং abstract class TypeNameMapperকোনও মান যুক্ত করা হচ্ছে না।


2
বিমূর্ত শ্রেণি ক্লায়েন্টদেরও অন্তর্গত। আপনি কি বলতে চাইছেন তা আমি জানি না। সমস্ত কিছু যা publicক্লায়েন্টের অন্তর্গত। TypeNameMapperএতে প্রচুর মান যুক্ত হচ্ছে কারণ এটি প্রয়োগকারীকে কিছু সাধারণ যুক্তি রচনা থেকে রক্ষা করে।
কনরাড

2
কোনও ইন্টারফেসটি একটি হিসাবে উপস্থাপিত হয় interfaceবা না কেবল সে ক্ষেত্রে এটি প্রাসঙ্গিক হয় # সম্পূর্ণ একাধিক উত্তরাধিকার নিষিদ্ধ।
উত্সাহীকারী

0

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

এটি স্পষ্টতই বলছে যে কোনও ইন্টারফেসের যে কোনও ব্যবহারের দ্বারা বোঝা যায় যে এর স্পেসিফিকেশনের একাধিক বাস্তবায়ন রয়েছে (বা প্রত্যাশিত)।

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

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


2
"আপনার যদি বিমূর্ত শ্রেণি থাকে, ... একটি ইন্টারফেসের ব্যবহার স্পষ্টভাবে নির্দেশিত।" - আমার উপসংহারটি এর বিপরীত: যদি আপনার কোনও বিমূর্ত শ্রেণি থাকে, তবে এটি এমনভাবে ব্যবহার করুন যেন এটি একটি ইন্টারফেস (যদি ডিআই এটির সাথে না খেলেন তবে আলাদা বাস্তবায়ন বিবেচনা করুন)। কেবলমাত্র যখন এটি সত্যই কার্যকর হয় না, ইন্টারফেস তৈরি করুন - আপনি এটি পরে যে কোনও সময় করতে পারেন।
মার্টিনাস

1
দিতো, @ মার্টিনাস। এবং এমনকি "... যেন এটি একটি ইন্টারফেস নয়।" একটি বর্গ পাবলিক সদস্যদের হয় একটি ইন্টারফেস। এছাড়াও "আপনি পরে যে কোনও সময় এটি করতে পারেন" এর জন্যও ডিট্টো; এটি 101 এর নকশার ফান্ডামেন্টালগুলির হৃদয়ে যায়
রাডারবব

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

1
@ সুপের্যাট আপনি গ্রন্থাগার লিখছেন তা ধরে নিয়ে আমি একমত হতে পারি। যদি এটি কোনও অ্যাপ্লিকেশন হয় তবে আমি সমস্ত উপস্থিতি একবারে প্রতিস্থাপন করতে কোনও সমস্যা দেখতে পাচ্ছি না। আমার গ্রহণটি এটি করতে পারে (জাভা, সি # নয়) তবে এটি যদি না করতে পারে তবে এটি ঠিক find ... -exec perl -pi -e ...তেমনিভাবে এবং সম্ভবত তুচ্ছ সংকলনের ত্রুটিগুলি ঠিক করা। আমার বক্তব্যটি হ'ল: (বর্তমানে) অকেজো জিনিস না রাখার সুবিধা সম্ভাব্য ভবিষ্যতের সাশ্রয়ের চেয়ে অনেক বড়।
মার্টিনাস

প্রথম বাক্যটি সঠিক হবে, যদি আপনি interfaceকোড হিসাবে চিহ্নিত হন (আপনি C # - interfaces সম্পর্কে কথা বলছেন , ক্লাস / ফাংশন / ইত্যাদির কোনও সেটের মতো কোনও বিমূর্ত ইন্টারফেস নয়) এবং এটি শেষ হয়েছে "... তবে এখনও সম্পূর্ণ একাধিককে নিষিদ্ধ ঘোষণা করেছেন উত্তরাধিকার। " interfaceআপনার যদি এমআই থাকে তবে এর দরকার নেই ।
২ed

0

আমরা যদি প্রশ্নের স্পষ্টভাবে উত্তর দিতে চাই, লেখক বলেছেন "আমার কাছে ইতিমধ্যে একটি অ্যাবস্ট্রাক্ট শ্রেণি টাইপনেমম্যাপার বা অ্যাবস্ট্রাক্ট ক্লাস কেবল পর্যাপ্ত থাকলে এই ইন্টারফেসটি সংজ্ঞায়িত করা কি বোধগম্য?"

উত্তর হ্যাঁ এবং না - হ্যাঁ, আপনার ইতিমধ্যে বিমূর্ত বেস ক্লাস থাকা সত্ত্বেও আপনার ইন্টারফেসটি তৈরি করা উচিত (কারণ আপনার কোনও ক্লায়েন্ট কোডে অ্যাবস্ট্রাক্ট বেস ক্লাসটি উল্লেখ করা উচিত নয়), এবং না, কারণ আপনার তৈরি করা উচিত হয়নি একটি ইন্টারফেসের অভাবে বিমূর্ত বেস শ্রেণি।

আপনি যে এপিআই বানাতে চাইছেন তাতে আপনি যথেষ্ট চিন্তাভাবনা করেননি তা স্পষ্ট। প্রথমে এপিআই নিয়ে আসুন, তারপরে আকাঙ্ক্ষিত হলে আংশিক বাস্তবায়ন সরবরাহ করুন। আপনার বিমূর্ত বেস ক্লাসটি কোডে টাইপ চেক করে এমনটি করে যে এটি সঠিক বিমূর্ততা নয় আপনাকে জানাতে যথেষ্ট।

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


-1

বাকি অ্যাপ্লিকেশনটি না জেনে উত্তর দেওয়া বেশ কঠিন।

ধরে নিই যে আপনি কোনও ধরণের ডিআই মডেল ব্যবহার করছেন এবং আপনার কোডটি যথাসম্ভব প্রসারিত হতে ডিজাইন করেছেন (যাতে আপনি TypeNameMapperসহজেই নতুন যুক্ত করতে পারেন) আমি হ্যাঁ বলব।

এর কারণগুলি:

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

এর বিরুদ্ধে কারণগুলি:

  • কড়া কথা বলতে (যেমন আপনি উল্লেখ করেছেন) আপনার আসলে দরকার নেই
  • যদি class/ interfaceপরিবর্তনগুলি কিছুটা অতিরিক্ত ওভারহেড থাকে

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

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