Я собираюсь использовать ваш класс AirlineBooking
в качестве примера, потому что многие люди, похоже, запутались из-за примера Chicken
.
Некоторое введение:
Принцип единой ответственности гласит, что объект должен иметь одиночную ответственность и что он должен заниматься только теми вещами, которые соответствуют этой ответственности. Например, TaxCalculator
должен только отвечать за расчет налога, а не, например, за конвертацию валюты - это работа CurrencyConverter
.
Часто это действительно хорошая идея , так как это означает, что ваше приложение структурировано на куски кода, каждое из которых несет единую ответственность, облегчая понимание и безопасное изменение. Другой способ выразить это в том, что у класса или модуля должна быть одна-единственная причина для изменения, например «Изменился способ расчета налога» или «Изменился способ преобразования валюты».
Вопросы, которые вам нужно задать себе:
- За что отвечает
AirlineBooking
?
- Является ли обновление бронирования авиабилетов частью этой ответственности?
Например, в этом случае я бы сказал, что ответственность AirlineBooking
заключается в «инкапсуляции бронирования авиакомпании», и что обновление бронирования авиакомпании фактически является обязанностью системы бронирования, а не AirlineBooking
.
Альтернативно, другой способ думать об этом заключается в том, что если я добавлю Update
метод к AirlineBooking
, это будет означать, что:
- Если система бронирования переключается на использование веб-службы, а не хранимой процедуры, то класс
AirlineBooking
необходимо изменить.
- Если изменяется инкапсуляция бронирования авиакомпании (возможно, можно приостановить бронирование или теперь записано название авиакомпании), то
AirlineBooking
необходимо изменить.
т.е. AirlineBooking
теперь имеет много разных причин для изменения, и поэтому он не должен отвечать за "Обновление"
Короче, я бы, наверное, сделал это:
public class AirlineBooking
{
public int BookingId {get;set;}
/* Other properties */
}
public class BookingSystem
{
public void UpdateBooking(AirlineBooking booking, int id)
{
// Call your SP here.
}
}
Причина, по которой вы должны задать себе эти вопросы, заключается в том, что это зависит от того, для чего AirlineBooking
используется в вашем приложении.
Например, если AirlineBooking
«осведомлен» (т. Е. Имеет ссылку на) систему бронирования, то вы можете добавить «вспомогательный» метод, например:
public class AirlineBooking
{
public void Update(int id)
{
this.bookingSystem.UpdateBooking(this, id);
}
}