ক্লাসে বয়লারপ্লেট হ্রাস করা যা রচনার মাধ্যমে ইন্টারফেস প্রয়োগ করে


11

আমার একটি ক্লাস রয়েছে: Aএটি বেশ কয়েকটি ছোট ক্লাসের সংমিশ্রণ B, Cএবং D

B, C, এবং Dইন্টারফেস বাস্তবায়ন IB, ICএবং IDযথাক্রমে।

যেহেতু Aসব কার্যকারিতা সমর্থন B, Cএবং D, Aকার্যকরী IB, ICএবং IDসেইসাথে, কিন্তু এই দুর্ভাগ্যবশত অনেক বাড়ে বাস্তবায়নের পুনরায় রাউটিংA

তাই ভালো:

interface IB
{
    int Foo {get;}
}

public class B : IB
{
    public int Foo {get {return 5;}}
}

interface IC
{
    void Bar();
}

public class C : IC
{
    public void Bar()
    {
    }
}

interface ID
{
    string Bash{get; set;}
}

public class D: ID
{
    public string Bash {get;set;}
}

class A : IB, IC, ID
{
    private B b = new B();
    private C c = new C();
    private D d = new D();

    public int Foo {get {return b.Foo}}

    public A(string bash)
    {
        Bash = bash;
    }

    public void Bar()
    {
        c.Bar();
    }

    public string Bash
    {
         get {return d.Bash;}
         set {d.Bash = value;}
    }
}

এই বয়লারপ্লেট পুনর্নির্দেশের কোনওটি থেকে মুক্তি পাওয়ার কোনও উপায় আছে A? B, Cএবং Dসব ভিন্ন কিন্তু সাধারণ কার্যকারিতা বাস্তবায়ন, এবং আমি যে মত Aকার্যকরী IB, ICএবং IDকারণ এটা মানে আমি পাস করতে পারেন Aযারা ইন্টারফেসগুলি মিলে নির্ভরশীলতার হিসাবে নিজেকে, এবং ভেতরের সাহায্যকারী পদ্ধতি এক্সপোজ করতে হবে না।


আইবি, আইসি, আইডি বাস্তবায়নের জন্য আপনার ক্লাস এ-এর দরকার কেন, সে সম্পর্কে আপনি কিছুটা বলতে পারেন? শুধু বিসিডিকে জনসমক্ষে প্রকাশ করবেন না কেন?
এসবেন স্কভ পেডারসেন

1
আমি পছন্দ জন্য আমার প্রাথমিক কারণ মনে Aবাস্তবায়ন IB, ICএবং IDএটা লিখতে আরো ইন্দ্রিয়গ্রাহ্য মতানুযায়ী Person.Walk()হিসাবে বিরোধিতা Person.WalkHelper.Walk()উদাহরণস্বরূপ,।
নিক উডেল

উত্তর:


7

আপনি যা খুঁজছেন তাকে সাধারণত মিক্সিন বলা হয় । দুঃখের বিষয়, সি # তাদের স্থানীয়ভাবে সমর্থন করে না।

কয়েকটি কর্মক্ষেত্র রয়েছে: এক , দুই , তিন এবং আরও অনেক কিছু।

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

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


2

যদিও কোডটিতে এটি বয়লারপ্লেটটি হ্রাস করে না, ভিজ্যুয়াল স্টুডিও 2015 এখন আপনার জন্য স্বয়ংক্রিয়ভাবে বয়লারপ্লেট উত্পন্ন করার জন্য একটি রিফ্যাক্টরিং বিকল্প নিয়ে আসে।

এটি ব্যবহার করতে, প্রথমে আপনার ইন্টারফেস IExampleএবং বাস্তবায়ন তৈরি করুন Example। তারপরে আপনার নতুন ক্লাসটি তৈরি করুন Compositeএবং উত্তরাধিকারী করুন IExample, তবে ইন্টারফেসটি প্রয়োগ করবেন না।

Exampleআপনার Compositeশ্রেণিতে একটি সম্পত্তি বা প্রকারের ক্ষেত্র যুক্ত করুন, IExampleআপনার Compositeশ্রেণি ফাইলের টোকনে দ্রুত-ক্রিয়া মেনুটি খুলুন এবং "উদাহরণ" এর মাধ্যমে ইন্টারফেস প্রয়োগ করুন যেখানে এই ক্ষেত্রে ক্ষেত্র বা সম্পত্তির নাম 'উদাহরণ' রয়েছে।

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


1

আপনার ক্লাসটি অনেক বেশি করছে, এজন্য আপনাকে এত বেশি বয়লারপ্লেট প্রয়োগ করতে হবে। আপনি মন্তব্যগুলিতে বলেছেন:

পার্সন.ওয়াল্কহেল্পার.ওয়ালকের (বিপরীতে) ব্যক্তিকে লিখতে এটি আরও সংবেদনশীল মনে হয় W

আমি একমত নই হাঁটার কাজটি সম্ভবত অনেকগুলি বিধি জড়িত হতে পারে এবং Personশ্রেণিতে অন্তর্ভুক্ত নয় - এটি এমন একটি WalkingServiceক্লাসের সাথে সম্পর্কিত walk(IWalkable)যেখানে একটি ব্যক্তি প্রয়োগ করে IWalkable

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


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

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

0

আপনি যা অনুসন্ধান করছেন তা একাধিক উত্তরাধিকার। তবে সি # বা জাভা উভয়ই এর কাছে নেই।

আপনি এ থেকে বি প্রসারিত করতে পারেন এটি বি এর জন্য ব্যক্তিগত ক্ষেত্রের পাশাপাশি পুনর্নির্দেশের আঠাকেও দূর করবে। তবে আপনি কেবল বি, সি বা ডি-এর একটিতে এটি করতে পারেন

এখন আপনি যদি বি থেকে সি, এবং ডি থেকে ডি উত্তরাধিকারী হয়ে উঠতে পারেন তবে আপনার কেবলমাত্র একটি এক্সটেন্ড ডি ...;) থাকতে হবে - তবে স্পষ্টভাবে বলতে গেলে, আমি এই উদাহরণে আসলে উত্সাহ দিচ্ছি না কারণ কোনও ইঙ্গিত নেই since এর জন্য.

সি ++ এ আপনি বি, সি এবং ডি থেকে একটি উত্তরাধিকারী হতে সক্ষম হবেন

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

কিছুটা মনে হচ্ছে আপনি রচনা এবং উত্তরাধিকারের মিশ্রণের চেষ্টা করছেন। যদি এটি সি ++ হয় তবে আপনি খাঁটি উত্তরাধিকার সমাধানটি ব্যবহার করতে পারেন। তবে এটি যেহেতু আমি রচনাটি আলিঙ্গন করার পরামর্শ দেব না।


2
অপশন যেমন আপনার উদাহরণ কোডটিতে করেছে ঠিক তেমনই জাভা এবং সি # উভয় ক্ষেত্রেই ইন্টারফেস ব্যবহার করে আপনি একাধিক উত্তরাধিকার পেতে পারেন।
রবার্ট হার্ভে

1
কেউ কেউ ইন্টারফেসকে একাধিক উত্তরাধিকার হিসাবে সমান বিবেচনা করতে পারে (সি ++ তে বলা আছে)। অন্যরা দ্বিমত পোষণ করবে, কারণ ইন্টারফেসগুলি উত্তরাধিকারসূত্রে দৃষ্টান্তমূলক পদ্ধতিগুলি উপস্থাপন করতে পারে না, যদি আপনার একাধিক উত্তরাধিকার থাকে তবে আপনার কী হবে। সি # তে, আপনি একাধিক বেস ক্লাসগুলি প্রসারিত করতে পারবেন না, তাই আপনি একাধিক ক্লাস থেকে উদাহরণ পদ্ধতি প্রয়োগের উত্তরাধিকারী হতে পারবেন না, এজন্য আপনার সমস্ত বয়লারপ্লেট প্রয়োজন ...
এরিক tদট

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