Erişimciler alanlardan daha fazlasıdır. Diğerleri zaten birkaç önemli farklılığa dikkat çekti ve ben bir tane daha ekleyeceğim.
Özellikler arabirim sınıflarında yer alır. Örneğin:
interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
Bu arayüz çeşitli şekillerde tatmin edilebilir. Örneğin:
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;
}
}
...
}
Bu uygulamada, Person
sınıfın geçersiz duruma geçmesini ve arayanın atanmamış mülkten boş kalmasını önlüyoruz.
Ancak tasarımı daha da ileriye taşıyabiliriz. Örneğin, arabirim ayarlayıcıyla ilgilenmeyebilir. IPerson
Arayüz tüketicilerinin , mülkün ayarlanmasıyla değil, sadece mülkle ilgilendiklerini söylemek oldukça meşrudur :
interface IPerson
{
string FirstName { get; }
string LastName { get; }
}
Person
Sınıfın önceki uygulaması bu arabirimi karşılar. Arayanın özellikleri ayarlamasına izin vermesi, (tüketen IPerson
) tüketicilerin bakış açısından anlamsızdır . Somut uygulamanın ek işlevselliği, örneğin inşaatçı tarafından dikkate alınır:
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);
}
Bu kodda, tüketici mülkiyet belirleyicileri bilmiyor - bunu bilmek onun işi değil. Tüketicinin sadece alıcılara ihtiyacı vardır ve alıcıları arayüzden, yani sözleşmeden alır.
Tamamen geçerli bir başka uygulaması, IPerson
değişmez bir kişi sınıfı ve ilgili bir kişi fabrikası olacaktır:
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);
}
Bu kodda örnek tüketici bir kez daha özellikleri doldurma bilgisine sahip değildir. Tüketici sadece alıcılar ve somut uygulamalarla ilgilenir (ve arkasındaki iş mantığı, adın boş olup olmadığını test etmek gibi) uzman sınıflara bırakılır - inşaatçılar ve fabrikalar. Tüm bu işlemler tarlalarla tamamen imkansızdır.