Объектно-ориентированные Лучшие практики - Наследование v Интерфейсы Состава v

Я хочу задать вопрос о том, как Вы приблизились бы к простой объектно-ориентированной проблеме проектирования. У меня есть несколько моих собственных идей о том, что лучший способ заняться этим сценарием, но я интересовался бы слушанием некоторых мнений от сообщества Переполнения стека. Ссылки на соответствующие статьи онлайн также ценятся. Я использую 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 класс?
  • Создайте новый класс, который содержал a Person, плюс дополнительный StaffDetails и CustomerDetails?
  • Сделайте все интерфейсом (например. IPerson, IStaff, ICustomer) и создайте три класса, которые реализовали соответствующие интерфейсы?
  • Проявить другой совершенно другой подход?
39
задан tvanfosson 19 October 2008 в 16:49
поделиться

1 ответ

Возьмите другой совершенно другой подход: проблема с классом StaffCustomer заключается в том, что ваш сотрудник может начать как обычный сотрудник, а позже стать клиентом, поэтому вам придется удалить их как сотрудников и создайте новый экземпляр класса StaffCustomer. Возможно, простое логическое значение isCustomer в классе Staff позволит нашему списку всех (предположительно составленному из получения всех клиентов и всего персонала из соответствующих таблиц) не получать сотрудника, поскольку он будет знать, что он уже включен в качестве клиента.

1
ответ дан 27 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: