У приложения, которое я помогаю поддерживать, нет реальных бизнес-объектов, о которых можно говорить, несмотря на то, что это значительный, якобы n-уровневый проект. То, что наша команда называет «бизнес-объектами», на самом деле представляет собой не что иное, как автоматически сгенерированные оболочки вокруг строк нашей базы данных, и вся действующая бизнес-логика смешивается с кодом веб-интерфейса. Что касается новых функциональных возможностей, мне бы очень хотелось, чтобы наша команда начала работать с / кодировать объекты, которые действительно представляют данные и поведение бизнес-сущностей, и максимально не допускают бизнес-логику в пользовательский интерфейс. Однако существует некоторый конфликт о том, как должны моделироваться отношения.
Чтобы значительно упростить домен для целей здесь, скажем, у вас есть Персоны и Задачи. Каждой задаче назначен человек.
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Как должно моделироваться задание?
public class Task
{
public int ID { get; set; }
public string Title { get; set; }
public int AssignedPersonID { get; set; }
}
OR
public class Task
{
public int ID { get; set; }
public string Title { get; set; }
public Person AssignedPerson { get; set; }
}
Те, кто тратит больше времени на кодирование веб-интерфейса, хотят получить более раннюю версию, в которой Person ссылается по своему идентификатору. Они утверждают, что когда, скажем, другому человеку назначен другой человек, лучше просто изменить task.AssignedPersonID
(новый идентификатор легко доступен из их выпадающего списка в пользовательском интерфейсе) и записать в базу данных. Для меня это не отличается от подхода, который мы используем сейчас; это все еще отражает строку базы данных больше, чем фактическая бизнес-модель. Они утверждают, что это больше кода и медленнее, чтобы взять этот PersonID, создать экземпляр соответствующего экземпляра Person, а затем установить task.AssignedPerson
, когда конечный результат - то, что столбец AssignedPersonID в таблице Task - обновляется точно так же .
С объектно-ориентированной точки зрения, какой здесь предпочтительный подход?