Bir etki alanı modeli ve bunun uygulanması arasında bir ayrım vardır. Senin modeli bir ilişki olduğunu göstermektedir sırf Person ---> Campaign ---> Event
Bu şekilde uygulamak zorunda olduğu anlamına gelmez. IOW, modeliniz bir nesne yönelimli bir şekilde analizi ve tasarımı gösterir, ama sen o kodda bu modeli çoğaltmak ne kadar iyi sınırlıdır OOP'deki bu modeli uygulamak.
Aşağıdaki düşünün.
A Person
bir Campaign
kendi mülkiyeti ile tanımlanmış değildir, bu nedenle kampanya bilgisi responsibities dışında bırakılabilir. Öte yandan, bir Campaign
, yürütme parçası olarak ortaya Event
s tarafından tanımlanan, bu yüzden bir kampanya içinde olayların bir koleksiyona sahip adil olduğunu. Ben yapıyorum nokta her sınıf bunu bütün yapmak için yeterli davranış ve bilgiye sahip olmasıdır.
Etki ve kalıcılık katmanları arasındaki iletişim gibi, diğer ilgili değildir, iki çok farklı sistemler olarak onları düşünün. Hepsi her bilir onun sorumluluklarının ne olduğunu ve ne yapar duyuruları. Örneğin, sebat katman kendisine iletilen verileri kalıcı ve veri kaydedildi olduğunu duyurmak için nasıl bilir. Ancak, sebat katman mutlaka etki alanı nesneleri anlamak gerekmez. Benzer şekilde, etki alanı katman Person
, Campaign
anlar, ve Event
ama kalıcılığı hakkında hiçbir şey bilmiyor.
Yukarıdakilerin dolaylı etki katman başına bir bütün olmasını ve veri sebat tabaka bağımlı olmamalı gerekiyor. Ancak, yine de kendi sorumluluklarını yerine veri ile birlikte gerekiyor. Bu veriler kullanıcı arabirimi veya veritabanı ya gelebilir ve etki alanı ve sebat katmanları hem de bilen bir üçüncü taraf aracılığı geçirilir.
Yani, kod (pseudo-C #) ...
namespace DomainLayer
{
interface IDomainListener
{
void PersonCreated(Person person);
}
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
class Domain
{
private IDomainListener listener;
public Domain(IDomainListener listener) {
this.listener = listener;
}
public void CreatePerson(string name) {
Person person = new Person(name);
listener.PersonCreated(person);
}
}
}
namespace PersistenceLayer
{
interface IPersistenceListener
{
void PersonDataSaved(int id, object data);
}
class Persistence
{
private IPersistenceListener listener;
public Persistence(IPersistenceListener listener)
{
this.listener = listener;
}
public void SaveData(object data)
{
int id = ...; // save data and return identifier
listener.DataSaved(id, data);
}
}
}
namespace MyApplication
{
class MyController : IDomainListener, IPersistenceListener
{
public void CreatePersonButton_Clicked()
{
Domain domain = new Domain(this);
domain.CreatePerson(NameTextbox.Text);
}
public void PersonCreated(Person person)
{
Persistence persistence = new Persistence(this);
persistence.SavePersonData(person.Name);
}
public void DataSaved(int id, object data)
{
// display data on UI
}
}
}
Gördüğünüz gibi, ad alanları farklı katman temsil eder. XYZListener
arayüzleri XYZ
katmanı tarafından yapılan duyurular tanımlar. Bu duyurular ilgilenen ve onlara cevap verecek başka bir katmanda bizim MyApplication
katmanlı yaptığı gibi, bu arayüzleri uygulamak gerekir.
"Yaratmak düğmesi" tıklandığında, kontrolör etki alanı katman için Domain
cephe nesnesi oluşturur ve bir dinleyici olarak kendisini kaydeder. Daha sonra Person
sonra bu yeni örneği ileterek, yapılması gerektiğini açıkladı başlatır CreatePerson
yöntemini çağırır. Denetleyicisi sebat katmanın bir cephe çoğaltılır ve tekrar dinleyici olarak kendisini kaydeder PersonCreated
Uygulamanın bu duyuruya yanıt verir. Daha sonra çağıran SaveData
yöntem whichannounces DataSaved
tamamlandığında. Bu yöntemin uygulama ardından UI üzerinde verileri görüntüler.
Gördüğünüz gibi, etki tabakası ve sebat katman Her sadece tmemselves farkındayız ve diğer sorumlulukları ile ilgili değildir. Bu kontrolörü olarak burada tecelli uygulama mantığı olduğunu, bu teller birbirine iki.
Geri belirli bir soruna, size duyurmak hangi, sebat bir yöntemi FindPerson
olabilir PersonFound(int id)
. Kontrolör tarafından tepki daha sonra Person
oluşturmak için bu verilerle etki katmanı diyoruz, kampanya ve olaylar hakkında veri almak için kalıcılık katmanı aramak olacaktır.
Uzun cevap için özür dilerim ...