Kendimi bir DDD uzmanı olarak görmüyorum, ancak bir çözüm mimarı olarak mümkün olduğunda en iyi uygulamaları uygulamaya çalışıyorum. DDD’de profesyonel olmayanların ve aleyhtarların (kamu) belirleyicisi "stil" in etrafında çok fazla tartışma olduğunu biliyorum ve tartışmanın her iki tarafını da görebiliyorum. Benim sorunum, her geliştiricinin işleri "doğru" şekilde yapacağına güvenemeyeceğim anlamına gelen beceri, bilgi ve deneyim konusunda geniş bir çeşitliliğe sahip bir ekip üzerinde çalışıyorum. Örneğin, eğer etki alanımızdaki nesneler nesnenin içsel durumundaki değişikliklerin bir yöntemle yapılacağı, ancak kamu mülk belirleyicileri sağlayacak şekilde tasarlanması halinde, birisi yöntemi çağırmak yerine, özelliği kaçınılmaz olarak belirleyecektir. Bu örneği kullanın:
public class MyClass
{
public Boolean IsPublished
{
get { return PublishDate != null; }
}
public DateTime? PublishDate { get; set; }
public void Publish()
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
PublishDate = DateTime.Today;
Raise(new PublishedEvent());
}
}
Benim çözümüm, mülk belirleyicileri özel yapmaktı, çünkü nesneleri hidratlamak için kullandığımız ORM, yansıtıcı kullanıyor, böylece özel belirleyicilere erişebiliyordu. Ancak, bu birim testleri yazmaya çalışırken bir sorun sunar. Örneğin, yeniden yayınlayamayacağımızın gerekliliğini doğrulayan bir birim testi yazmak istediğimde, nesnenin zaten yayınlandığını belirtmem gerekiyor. Bunu iki kez Yayınla'yı arayarak kesinlikle yapabilirim, ancak testim Yayınlama'nın ilk çağrı için doğru şekilde uygulandığını varsayıyor. Bu biraz koklamak görünüyor.
Senaryoyu şu kodla biraz daha gerçek hale getirelim:
public class Document
{
public Document(String title)
{
if (String.IsNullOrWhiteSpace(title))
throw new ArgumentException("title");
Title = title;
}
public String ApprovedBy { get; private set; }
public DateTime? ApprovedOn { get; private set; }
public Boolean IsApproved { get; private set; }
public Boolean IsPublished { get; private set; }
public String PublishedBy { get; private set; }
public DateTime? PublishedOn { get; private set; }
public String Title { get; private set; }
public void Approve(String by)
{
if (IsApproved)
throw new InvalidOperationException("Already approved.");
ApprovedBy = by;
ApprovedOn = DateTime.Today;
IsApproved = true;
Raise(new ApprovedEvent(Title));
}
public void Publish(String by)
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
if (!IsApproved)
throw new InvalidOperationException("Cannot publish until approved.");
PublishedBy = by;
PublishedOn = DateTime.Today;
IsPublished = true;
Raise(new PublishedEvent(Title));
}
}
Aşağıdakileri doğrulayan birim testleri yazmak istiyorum:
- Belge onaylanmadıkça yayınlayamam
- Bir Dokümanı tekrar yayınlayamıyorum
- Yayımlandığında PublishedBy ve PublishedOn değerleri uygun şekilde ayarlandı
- Yayına girdiğinde PublishedEvent yükseltildi
Belirleyicilere girmeden, nesneyi testleri gerçekleştirmek için gereken duruma koyamıyorum. Ayarlayıcılara erişimi açmak, erişimi engelleme amacını yendi.
Bu problemi nasıl çözersiniz (d)?