আমার পক্ষে এটি বোধগম্য হয় কারণ এটি জেনেরিক নামডেন্টিটির উপর নির্ভর না করে ক্লাসকে একটি কংক্রিট নাম দেয়। অন্যদিকে, এমন অনেকগুলি ক্লাস রয়েছে যার কেবল কোনও অতিরিক্ত সম্পত্তি নেই।
এই পদ্ধতির কোনও ডাউনসাইড রয়েছে?
পদ্ধতিটি খারাপ নয়, তবে আরও ভাল সমাধান পাওয়া যায়। সংক্ষেপে, একটি ইন্টারফেস এর জন্য আরও ভাল সমাধান হবে। ইন্টারফেস এবং উত্তরাধিকার পৃথক হওয়ার মূল কারণটি হ'ল আপনি কেবলমাত্র একটি শ্রেণি থেকে উত্তরাধিকারী হতে পারেন তবে আপনি অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারেন ।
উদাহরণস্বরূপ, বিবেচনা করুন যে আপনি সত্তার নাম দিয়েছেন এবং অডিটেড সত্তা। আপনার কয়েকটি সত্ত্বা রয়েছে:
One
নিরীক্ষিত সত্তা বা নামযুক্ত সত্তা নয়। এটি সহজ:
public class One
{ }
Two
নামযুক্ত সত্তা তবে নিরীক্ষিত সত্তা নয়। এটি আপনার কাছে এখন মূলত:
public class NamedEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Two : NamedEntity
{ }
Three
উভয় একটি নামযুক্ত এবং নিরীক্ষিত এন্ট্রি। এখানেই আপনি কোনও সমস্যায় পড়েছেন। আপনি একটি AuditedEntity
বেস শ্রেণি তৈরি করতে পারেন , তবে আপনি উভয়ইThree
উত্তরাধিকারী করতে পারবেন না এবং : AuditedEntity
NamedEntity
public class AuditedEntity
{
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
}
public class Three : NamedEntity, AuditedEntity // <-- Compiler error!
{ }
যাইহোক, আপনি AuditedEntity
উত্তরাধিকারসূত্রে থাকার দ্বারা একটি workaround চিন্তা করতে পারেন NamedEntity
। এটি নিশ্চিত করার জন্য এটি একটি চালাক হ্যাক যা প্রতিটি শ্রেণীর কেবলমাত্র অন্য কোনও শ্রেণীর থেকে উত্তরাধিকারী (সরাসরি) হওয়া দরকার।
public class AuditedEntity : NamedEntity
{
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
}
public class Three : AuditedEntity
{ }
এটি এখনও কাজ করে। তবে আপনি এখানে যা করেছেন তা উল্লেখ করা হয়েছে যে প্রতিটি নিরীক্ষিত সত্তা সহজাতভাবে একটি নামকৃত সত্তাও । যা আমার শেষ উদাহরণে নিয়ে আসে। Four
নিরীক্ষিত সত্তা তবে নামযুক্ত সত্তা নয়। তবে আপনি অডিটডেন্টিটি নেমটেইনটি` এর মধ্যে উত্তরাধিকারের কারণে এটিকে Four
উত্তরাধিকার সূত্রে পরিণত করতে পারবেন না `AuditedEntity
NamedEntity
and
উত্তরাধিকার ব্যবহার করে, দু'টি তৈরি করার Three
এবং Four
কাজ করার কোনও উপায় নেই যতক্ষণ না আপনি অনুলিপি ক্লাসগুলি শুরু করেন (যা সমস্যার সম্পূর্ণ নতুন সেট উন্মুক্ত করে)।
ইন্টারফেস ব্যবহার করে, এটি সহজেই অর্জন করা যায়:
public interface INamedEntity
{
int Id { get; set; }
string Name { get; set; }
}
public interface IAuditedEntity
{
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
public class One
{ }
public class Two : INamedEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Three : INamedEntity, IAuditedEntity
{
public int Id { get; set; }
public string Name { get; set; }
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
public class Four : IAuditedEntity
{
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
}
এখানে কেবলমাত্র ছোটখাটো ব্যর্থতা হ'ল আপনাকে এখনও ইন্টারফেসটি প্রয়োগ করতে হবে। আপনি যখন কোনও নির্দিষ্ট সত্তার জন্য একাধিক সাধারণ ধরণের পরিবর্তনের প্রয়োজন হয় তখন কোনও পুনরায় ব্যবহারযোগ্য টাইপ না করেই আপনি সমস্ত সুবিধা পান।
তবে আপনার বহুত্ববাদ অটুট রয়েছে:
var one = new One();
var two = new Two();
var three = new Three();
var four = new Four();
public void HandleNamedEntity(INamedEntity namedEntity) {}
public void HandleAuditedEntity(IAuditedEntity auditedEntity) {}
HandleNamedEntity(one); //Error - not a named entity
HandleNamedEntity(two);
HandleNamedEntity(three);
HandleNamedEntity(four); //Error - not a named entity
HandleAuditedEntity(one); //Error - not an audited entity
HandleAuditedEntity(two); //Error - not an audited entity
HandleAuditedEntity(three);
HandleAuditedEntity(four);
অন্যদিকে, এমন অনেকগুলি ক্লাস রয়েছে যার কেবল কোনও অতিরিক্ত সম্পত্তি নেই।
এটি চিহ্নিতকারী ইন্টারফেস প্যাটার্নে একটি প্রকরণ , যেখানে আপনি কোনও ফাঁকা ইন্টারফেস কার্যকরভাবে ইন্টারফেস প্রকারটি ব্যবহার করতে সক্ষম হন তা পরীক্ষা করার জন্য কোনও প্রদত্ত শ্রেণি এই ইন্টারফেসের সাথে "চিহ্নিত" রয়েছে কিনা তা পরীক্ষা করতে পারেন।
আপনি প্রয়োগিত ইন্টারফেসের পরিবর্তে উত্তরাধিকারসূত্রে ক্লাস ব্যবহার করছেন, তবে লক্ষ্যটি একই, সুতরাং আমি এটিকে একটি "চিহ্নিত শ্রেণি" হিসাবে উল্লেখ করব।
ফেস ভ্যালুতে, চিহ্নিতকারী ইন্টারফেস / ক্লাসগুলির সাথে কোনও ভুল নেই। এগুলি সিনট্যাক্টিক্যালি এবং টেকনিক্যালি বৈধ এবং এগুলি ব্যবহারের ক্ষেত্রে কোনও অন্তর্নিহিত ত্রুটি নেই তবে শর্ত থাকে যে চিহ্নিতকারী সর্বজনীনভাবে সত্য (সংকলন সময়ে) এবং শর্তসাপেক্ষ নয় ।
বেসিক পদ্ধতির তুলনায় বাস্তবে কোনও অতিরিক্ত বৈশিষ্ট্য / পদ্ধতি না থাকলেও বিভিন্ন ব্যতিক্রমগুলির মধ্যে ঠিক কীভাবে আপনার আলাদা হওয়া উচিত।
সুতরাং এটি করার সহজাতভাবে কোনও ভুল নেই, তবে আমি সতর্কতার সাথে এটি ব্যবহার করার পরামর্শ দেব, এটি নিশ্চিত করে যে আপনি কেবল খারাপভাবে ডিজাইন করা পলিমারফিজম দিয়ে কোনও বিদ্যমান স্থাপত্য ভুলকে আবরণ করার চেষ্টা করছেন না।
OrderDateInfo
যে অন্যান্য সাথে প্রাসঙ্গিক থেকে গুলিNamedEntity
গুলি