Część naszej bazy kodu napisana jest w następującym stylu:
// IScheduledTask.cs
public interface IScheduledTask
{
string TaskName { get; set; }
int TaskPriority { get; set; }
List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein
}
// ScheduledTaskImpl.cs
public class ScheduledTaskImpl : IScheduledTask
{
public string TaskName { get; set; }
public int TaskPriority { get; set; }
public List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein,
// perhaps a constructor or two for convenience.
}
Oznacza to, że istnieje duża liczba interfejsów określających tylko zestaw właściwości bez zachowania, z których każda ma jedną implementację, która implementuje je za pomocą właściwości automatycznych. Kod jest napisany przez kogoś dość starszego (o wiele bardziej niż ja) i poza tym używaniem interfejsów rozsądny kod proceduralny. Zastanawiałem się, czy ktokolwiek inny zetknął się / użył tego stylu i czy ma on jakąkolwiek przewagę nad zwykłym używaniem konkretnych DTO bez interfejsów.
Odpowiedzi:
Oto moje dwa centy:
ScheduledTask
,ScheduledJob
,ScheduledEvent
,ScheduledInspection
, itp, powinny być segregowane tylko jedenSchedulable
interfejs podjęciem szeregowaniu zadań implementor.TaxSheet
może zmienić się,SessionAwareTaxSheet
ponieważ dokonano znacznego przeglądu, aleITaxSheet
prawdopodobnie nazwa interfejsu nie będzie tak łatwa.Konkluzja:
źródło
Szczególnym problemem, jaki widziałem w przypadku DTO korzystających z interfejsów, jest to, że pozwala na to:
Widziałem ten wzorzec zastosowany jako szybki, brudny hack w celu wdrożenia pewnych krytycznych zachowań. Prowadzi to do kodu, który może mieć bardzo mylące zachowanie:
Jest to trudne do utrzymania i mylące przy próbach rozplątywania lub refaktoryzacji. IMO, dodanie zachowania do DTO narusza zasadę pojedynczej odpowiedzialności. Celem DTO jest reprezentowanie danych w formacie, który można utrwalić i zapełnić w ramach utrwalania.
DTO nie są modelami domenowymi. Nie powinniśmy się martwić, jeśli DTO są anemiczne. Cytując dyskusję Martina Fowlera na temat modelu anemicznego :
źródło