ডেটাটাইপগুলির জন্য ইন্টারফেসগুলি কী কোনও অ্যান্টি-প্যাটার্ন ব্যবহার করে?


9

ধরুন আমার মডেলটিতে (ইএফ ব্যবহার করে) আমার বিভিন্ন সত্ত্বা রয়েছে, ব্যবহারকারী, পণ্য, চালান এবং অর্ডার বলুন।

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

সংক্ষিপ্তসারগুলির মধ্যে কেবল একটি আইডি এবং বিবরণ থাকবে, তাই আমি এটির জন্য একটি সাধারণ ইন্টারফেস তৈরি করি:

 public interface ISummarizableEntity {     
       public string ID { get; }    
       public string Description { get; } 
 }

তারপরে প্রশ্নে থাকা সত্তাগুলির জন্য, আমি একটি আংশিক শ্রেণি তৈরি করি যা এই ইন্টারফেসটি প্রয়োগ করে:

public partial class User : ISummarizableEntity
{
    public string ID
    {
        get{ return UserID.ToString(); }
    }

    public string Description 
    {
        get{ return String.Format("{0} {1} is from {2} and is {3} years old", FirstName, LastName, Country, Age); }
    }
}

public partial class Product: ISummarizableEntity
{
    public string ID
    {
        get{ return ProductID.ToString(); }
    }

    public string Description 
    {
        get{ return String.Format("{0} weighs {1}{2} and belongs in the {3} department", ProductName, WeightValue, WeightUnit, Department); }
    }
}

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

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

আমার মনে যে সমাধানটি আমি ব্যবহার করছি তা হ'ল রক্ষণাবেক্ষণযোগ্য, এক্সটেনসিবল, টেস্টেবল এবং মোটামুটি শক্ত। আপনি কি এখানে অ্যান্টি-প্যাটার্নটি দেখতে পাচ্ছেন?


সেখানে কোন কারণে ভালো কিছু না থাকার উপর আপনি এই পছন্দ করা হয় EntitySummaryসঙ্গে, Userএবং Productপ্রতিটি মত একটি পদ্ধতি হচ্ছে public EntitySummary GetSummary()?
বেন অ্যারনসন

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

@ কেন্টএন্ডারসন এই শ্রেণীর সামগ্রিক ইন্টারফেস এবং সংক্ষিপ্তসারগুলি কীভাবে ব্যবহৃত হয় তার উপর নির্ভর করে এটি আসলে একটি ভাল ধারণা হতে পারে বা নাও পারে।
বেন অ্যারনসন

উত্তর:


17

ইন্টারফেসগুলি আচরণের বর্ণনা দেয় না। বেশ বিপরীত, কখনও কখনও।

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

এটি ইন্টারফেসের একটি নিখুঁত ব্যবহার। এখানে কোনও অ্যান্টি-প্যাটার্ন নেই।


2
"ইন্টারফেসগুলি আচরণের বর্ণনা দেয় না।" কীভাবে "নিজেকে সংক্ষেপিত করা" আচরণ নয়?
ডোভাল

2
@ থমাসস্ট্রিঞ্জার, ওও পিউরিস্ট ভিউ থেকে উত্তরাধিকার, একটি সাধারণ বংশকে বোঝায় (উদাহরণস্বরূপ, একটি বর্গ এবং একটি বৃত্ত উভয় আকার )। ওপির উদাহরণে, কোনও ব্যবহারকারী এবং পণ্য কোনও যুক্তিসঙ্গত সাধারণ বংশধর ভাগ করে না। এই ক্ষেত্রে উত্তরাধিকার সুস্পষ্ট বিরোধী প্যাটার্ন হবে be
কেন্ট এ।

2
@ ডোভাল: আমার ধারণা, ইন্টারফেসের নামটি প্রত্যাশিত আচরণটি বর্ণনা করতে পারে। তবে তা করার দরকার নেই; ইন্টারফেসটির সমানভাবে IHasIdAndDescript নামকরণ করা যেতে পারে এবং উত্তরটি একই হবে। ইন্টারফেস নিজেই আচরণ বর্ণনা করে না, এটি প্রত্যাশা বর্ণনা করে।
পিডিআর

2
@pdr আপনি যদি 20V কে হেডফোন জ্যাকের মাধ্যমে প্রেরণ করেন তবে খারাপ কিছু ঘটবে। আকৃতি যথেষ্ট নয়; সেই প্লাগটি দিয়ে কী ধরণের সংকেত আসতে চলেছে তার একটি খুব বাস্তব এবং খুব গুরুত্বপূর্ণ প্রত্যাশা রয়েছে। এ কারণেই ইন্টারফেসের সাথে আচরণের নির্দিষ্টকরণের সংযুক্তি না থাকার ভান করা ভুল is Listতালিকার মতো আচরণ না করে আপনি কী করতে পারেন ?
ডোভাল

3
উপযুক্ত ইন্টারফেস সহ একটি বৈদ্যুতিক প্লাগ আউটলেটে ফিট করতে পারে তবে এর অর্থ এই নয় যে এটি বিদ্যুৎ পরিচালনা করবে (পছন্দসই আচরণ)।
জেফো

5

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


3
ইন্টারফেসের উত্তরাধিকারের সাথে কোনও সম্পর্ক নেই।
ডগএম

1
@ ডগএম, সম্ভবত আমি এটি ভাল করে বলিনি, তবে আমি নিশ্চিত যে আমরা সম্মত।
ক্যান্ট এ 13

1

কেবলমাত্র বৈশিষ্ট্য বহনকারী ইন্টারফেসগুলি এড়ানো উচিত :

  • এটি উদ্দেশ্যটিকে অবিচ্ছিন্ন করে তোলে: আপনার কেবলমাত্র একটি ডেটা ধারক প্রয়োজন
  • এটি উত্তরাধিকারকে উত্সাহ দেয়: সম্ভাবনা যে ভবিষ্যতে কেউ উদ্বেগের সাথে মিশে যাবে
  • এটি সিরিয়ালাইজেশন প্রতিরোধ করে

এখানে আপনি দুটি উদ্বেগের মিশ্রণ করছেন:

  • ডেটা হিসাবে সংক্ষিপ্তসার
  • একটি চুক্তি হিসাবে সারাংশ

একটি সংক্ষিপ্তসার দুটি স্ট্রিং দ্বারা তৈরি করা হয়: একটি আইডি এবং একটি বিবরণ। এটি সরল তথ্য:

public class Summary {
    private readonly string id;
    private readonly string description;
    public Summary(string id, string description) {
        this.id = id;
        this.description = description;
    }
    public string Id { get { return id; } }
    public string Description { get { return description; } }
}

এখন আপনি সংজ্ঞাটি সংজ্ঞায়িত করতে চান এমন সংক্ষিপ্তসারটি সংজ্ঞা দিয়ে দিয়েছেন:

public interface ISummarizableEntity {
    public Summary GenerateSummary();
}

নোট করুন যে গেটরসগুলিতে বুদ্ধি ব্যবহার করা একটি অ্যান্টি-প্যাটার্ন এবং এড়ানো উচিত: পরিবর্তে এটি ফাংশনগুলিতে অবস্থিত হওয়া উচিত। বাস্তবায়নগুলি দেখতে কেমন তা এখানে রয়েছে:

public partial class User : ISummarizableEntity {
    public Summary GenerateSummary() {
        var id = UserID.ToString();
        var description = String.Format("{0} {1} is from {2} and is {3} years old", FirstName, LastName, Country, Age);
        return new Summary(id,description);
    }
}

public partial class Product : ISummarizableEntity {
    public Summary GenerateSummary() {
        var id = ProductID.ToString();
        var description = String.Format("{0} weighs {1}{2} and belongs in the {3} department", ProductName, WeightValue, WeightUnit, Department);
        return new Summary(id,description);
    }
}

"কেবলমাত্র সম্পত্তি বহনকারী ইন্টারফেসগুলি এড়ানো উচিত" আমি একমত নই। আপনি কেন এমন ভাবেন তা যুক্তি সরবরাহ করুন।
ইওফোরিক

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