সাধারণত ডোমেন অবজেক্টের এমন বৈশিষ্ট্য থাকে যা বিল্ট-ইন টাইপ দ্বারা প্রতিনিধিত্ব করা যেতে পারে তবে যার বৈধ মানগুলি সেই ধরণের দ্বারা প্রতিনিধিত্ব করা হতে পারে এমন মানগুলির একটি উপসেট।
এই ক্ষেত্রে, মানটি অন্তর্নির্মিত প্রকারটি ব্যবহার করে সংরক্ষণ করা যেতে পারে তবে এন্ট্রি করার সময় মানগুলি সর্বদা যাচাই করা হয় তা নিশ্চিত করা প্রয়োজন, অন্যথায় আমরা একটি অবৈধ মান নিয়ে কাজ শেষ করতে পারি।
এটি সমাধানের একটি উপায় হ'ল মানটিকে একটি কাস্টম হিসাবে সংরক্ষণ করা structযা private readonlyবিল্ট-ইন টাইপের একক ব্যাকিং ক্ষেত্র এবং যার কনস্ট্রাক্টর সরবরাহ করা মানকে বৈধ করে। তারপরে আমরা সর্বদা কেবল এই structধরণের ব্যবহার করে বৈধ মানগুলি ব্যবহারের বিষয়ে নিশ্চিত হতে পারি ।
আমরা অন্তর্নির্মিত অন্তর্নির্মিত টাইপ থেকে এবং এর জন্যও কাস্ট অপারেটর সরবরাহ করতে পারি যাতে মানগুলি নির্বিঘ্নে প্রবেশ করে এবং অন্তর্নিহিত প্রকার হিসাবে প্রস্থান করতে পারে।
উদাহরণ হিসাবে বিবেচনা করুন এমন পরিস্থিতিতে যেখানে আমাদের কোনও ডোমেন অবজেক্টের নাম উপস্থাপন করতে হবে এবং বৈধ মানগুলি এমন কোনও স্ট্রিং যা দৈর্ঘ্য সমেত 1 এবং 255 অক্ষরের মধ্যে থাকে। আমরা নিম্নলিখিত কাঠামো ব্যবহার করে এটি উপস্থাপন করতে পারি:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{
return x.ToString();
}
public static explicit operator ValidatedName(string x)
{
if (IsValid(x))
{
return new ValidatedName(x);
}
throw new InvalidCastException();
}
public static bool operator ==(ValidatedName x, ValidatedName y)
{
return x.Equals(y);
}
public static bool operator !=(ValidatedName x, ValidatedName y)
{
return !x.Equals(y);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public override string ToString()
{
return _value;
}
}
উদাহরণস্বরূপ শো পারেন- stringযেমন ঢালাই implicitএই ব্যর্থ না পারে কিন্তু from- stringযেমন ঢালাই explicitএই অবৈধ মানের জন্য নিক্ষেপ করা হবে, কিন্তু অবশ্যই উভয় এই হতে পারেন পারে implicitবা explicit।
এও নোট করুন যে একজন কেবলমাত্র এই কাঠামোটি কেবল aালাইয়ের মাধ্যমেই শুরু stringকরতে পারেন তবে IsValid staticপদ্ধতিটি ব্যবহার করে এই জাতীয় অভিনেত্রী আগে থেকে ব্যর্থ হবে কিনা তা পরীক্ষা করতে পারে ।
এটি সাধারণ ধরণের দ্বারা প্রতিনিধিত্ব করা যেতে পারে এমন ডোমেন মানগুলির বৈধতা প্রয়োগ করার জন্য এটি একটি ভাল প্যাটার্ন বলে মনে হবে, তবে আমি এটি প্রায়শই ব্যবহৃত বা প্রস্তাবিত দেখি না এবং কেন তা করতে আগ্রহী।
সুতরাং আমার প্রশ্নটি: আপনি এই প্যাটার্নটি ব্যবহার করার সুবিধাগুলি এবং অসুবিধাগুলি হিসাবে কী দেখছেন এবং কেন?
আপনি যদি মনে করেন যে এটি একটি খারাপ প্যাটার্ন, তবে আমি বুঝতে চাই কেন এবং আপনি যা অনুভব করছেন এটি সর্বোত্তম বিকল্প।
এনবি আমি প্রথমে স্ট্যাক ওভারফ্লোতে এই প্রশ্নটি জিজ্ঞাসা করেছি তবে এটি প্রাথমিকভাবে মতামত-ভিত্তিক (নিজের মধ্যে বিদ্রূপাত্মক বিষয়গত) হিসাবে ধরে রাখা হয়েছিল - আশা করি এটি এখানে আরও সাফল্য উপভোগ করতে পারে।
উপরে মূল পাঠ্যটি রয়েছে, আরও কয়েকটা চিন্তাভাবনার নীচে, আংশিকভাবে জবাবগুলি ধরে রাখার আগে সেখানে প্রাপ্ত উত্তরগুলির প্রতিক্রিয়াতে:
- উত্তরের দ্বারা তৈরি একটি প্রধান পয়েন্ট ছিল উপরের প্যাটার্নের জন্য প্রয়োজনীয় বয়লার প্লেট কোডের পরিমাণের কাছাকাছি, বিশেষত যখন এই জাতীয় অনেক ধরণের প্রয়োজন হয়। তবে প্যাটার্নের প্রতিরক্ষার ক্ষেত্রে, এটি টেমপ্লেটগুলি ব্যবহার করে মূলত স্বয়ংক্রিয়ভাবে তৈরি হতে পারে এবং আসলে আমার কাছে এটি কোনওভাবেই খারাপ মনে হয় না, তবে এটি কেবল আমার অভিমত my
- ধারণার দৃষ্টিকোণ থেকে, সি # এর মতো দৃ strongly়-টাইপিত ভাষার সাথে কাজ করার সময় কি অদ্ভুত বলে মনে হয় না কেবলমাত্র দৃ strongly়-টাইপ করা নীতিটি সংমিশ্রিত মানগুলিতে প্রয়োগ করার পরিবর্তে, মানগুলিতে প্রসারিত না করে যা কোনও উদাহরণের দ্বারা প্রতিনিধিত্ব করা যায়? অন্তর্নির্মিত টাইপ?