Я хочу задать вопрос о том, как Вы приблизились бы к простой объектно-ориентированной проблеме проектирования. У меня есть несколько моих собственных идей о том, что лучший способ заняться этим сценарием, но я интересовался бы слушанием некоторых мнений от сообщества Переполнения стека. Ссылки на соответствующие статьи онлайн также ценятся. Я использую C#, но вопросом не является конкретный язык.
Предположим, что я пишу приложение видеомагазина, база данных которого имеет a Person
таблица, с PersonId
, Name
, DateOfBirth
и Address
поля. Это также имеет a Staff
таблица, которая имеет ссылку на a PersonId
, и a Customer
таблица, которая также связывается с PersonId
.
Простой объект ориентировался, подход должен будет сказать это a Customer
"" Person
и поэтому создайте классы немного как это:
class Person {
public int PersonId { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
class Customer : Person {
public int CustomerId { get; set; }
public DateTime JoinedDate { get; set; }
}
class Staff : Person {
public int StaffId { get; set; }
public string JobTitle { get; set; }
}
Теперь мы можем записать, что функция говорит, чтобы послать электронные письма всем клиентам:
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
Эта система хорошо работает, пока у нас нет кого-то, кто и клиент и член штата. Предположение, что мы действительно не хотим наш everyone
список, чтобы иметь того же человека в дважды, однажды как a Customer
и однажды как a Staff
, сделайте мы делаем произвольный выбор между:
class StaffCustomer : Customer { ...
и
class StaffCustomer : Staff { ...
Очевидно только первый из этих двух не повредился бы SendEmailToCustomers
функция.
Таким образом, что Вы сделали бы?
Person
класс имеет дополнительные ссылки на a StaffDetails
и CustomerDetails
класс? Person
, плюс дополнительный StaffDetails
и CustomerDetails
? IPerson
, IStaff
, ICustomer
) и создайте три класса, которые реализовали соответствующие интерфейсы? Возьмите другой совершенно другой подход: проблема с классом StaffCustomer заключается в том, что ваш сотрудник может начать как обычный сотрудник, а позже стать клиентом, поэтому вам придется удалить их как сотрудников и создайте новый экземпляр класса StaffCustomer. Возможно, простое логическое значение isCustomer в классе Staff позволит нашему списку всех (предположительно составленному из получения всех клиентов и всего персонала из соответствующих таблиц) не получать сотрудника, поскольку он будет знать, что он уже включен в качестве клиента.