ক্ষেত্রের চেয়ে অ্যাকসেসর বেশি। অন্যরা ইতিমধ্যে বেশ কয়েকটি গুরুত্বপূর্ণ পার্থক্য চিহ্নিত করেছে এবং আমি আরও একটি যুক্ত করতে যাচ্ছি।
বৈশিষ্ট্য ইন্টারফেস ক্লাসে অংশ নেয়। উদাহরণ স্বরূপ:
interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
এই ইন্টারফেসটি বিভিন্ন উপায়ে সন্তুষ্ট হতে পারে। উদাহরণ স্বরূপ:
class Person: IPerson
{
private string _name;
public string FirstName
{
get
{
return _name ?? string.Empty;
}
set
{
if (value == null)
throw new System.ArgumentNullException("value");
_name = value;
}
}
...
}
এই বাস্তবায়নে আমরা উভয় Person
শ্রেণিকে একটি অবৈধ অবস্থায় প্রবেশের হাত থেকে রক্ষা করছি , সেই সাথে কলারকে স্বাক্ষরিত সম্পত্তি থেকে বাতিল করা থেকে রক্ষা করব।
তবে আমরা ডিজাইনটি আরও এগিয়ে যেতে পারি। উদাহরণস্বরূপ, ইন্টারফেস সেটারের সাথে ডিল করতে পারে না। এটি বলা মোটেও বৈধ যে IPerson
ইন্টারফেসের গ্রাহকরা কেবল সম্পত্তি অর্জনে আগ্রহী, এটি সেট করার ক্ষেত্রে নয়:
interface IPerson
{
string FirstName { get; }
string LastName { get; }
}
Person
শ্রেণীর পূর্ববর্তী প্রয়োগ এই ইন্টারফেসটিকে সন্তুষ্ট করে। এটি যে কলারকেও বৈশিষ্ট্যগুলি সেট করতে দেয় তা ভোক্তাদের দৃষ্টিকোণ থেকে (যারা গ্রাস করে IPerson
) অর্থহীন । কংক্রিট বাস্তবায়নের অতিরিক্ত কার্যকারিতা বিবেচনা করা হয়, উদাহরণস্বরূপ, নির্মাতা:
class PersonBuilder: IPersonBuilder
{
IPerson BuildPerson(IContext context)
{
Person person = new Person();
person.FirstName = context.GetFirstName();
person.LastName = context.GetLastName();
return person;
}
}
...
void Consumer(IPersonBuilder builder, IContext context)
{
IPerson person = builder.BuildPerson(context);
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
এই কোডটিতে, ভোক্তা সম্পত্তি সেটটারগুলি সম্পর্কে জানেন না - এটি সম্পর্কে জানা তাঁর ব্যবসা নয়। গ্রাহককে কেবল গ্রাহক প্রয়োজন, এবং তিনি ইন্টারফেস থেকে অর্থাত্ চুক্তি থেকে গ্রাহক হন।
এর অপর একটি সম্পূর্ণ বৈধ বাস্তবায়ন IPerson
হবে অপরিবর্তনীয় ব্যক্তি শ্রেণি এবং সংশ্লিষ্ট ব্যক্তির কারখানা:
class Person: IPerson
{
public Person(string firstName, string lastName)
{
if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
throw new System.ArgumentException();
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; private set; }
public string LastName { get; private set; }
}
...
class PersonFactory: IPersonFactory
{
public IPerson CreatePerson(string firstName, string lastName)
{
return new Person(firstName, lastName);
}
}
...
void Consumer(IPersonFactory factory)
{
IPerson person = factory.CreatePerson("John", "Doe");
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
এই কোডে নমুনা ভোক্তার আবারও সম্পত্তি পূরণ করার কোন জ্ঞান নেই। গ্রাহক কেবল গ্রাহকগণ এবং কংক্রিট বাস্তবায়নের সাথে ডিল করেন (এবং এর পিছনে ব্যবসায়ের যুক্তি যেমন নাম খালি থাকলে পরীক্ষার মতো) বিশেষ শ্রেণিবদ্ধ - বিল্ডার এবং কারখানাগুলিতে ছেড়ে যায়। ক্ষেত্রগুলি সহ এই সমস্ত অপারেশন সম্পূর্ণ অসম্ভব।