OK. Итак, вот мой упрощенный сценарий. У нас есть система, которая обрабатывает заказы для ряда клиентов. Мы хотим, чтобы пользователи-сотрудники могли просматривать все заказы, и мы хотим, чтобы пользователь-клиент мог просматривать только те заказы, которые относятся к ним.
При попытке просмотреть определенную запись мы используем следующую функцию в нашем классе OrderSecurity:
Public Function CanViewOrder(order)
If currentUser.MemberOfStaff() Then
CanViewOrder = True
Else
CanViewOrder = (order.ClientId = currentUser.ClientId)
End If
End Function
В моменты, когда мы хотим отобразить список заказов пользователю, мы можем выполнить следующую функцию, определенную в классе OrderService
Public Function GetOrders()
If currentUser.MemberOfStaff() Then
GetOrders = GetAllOrders()
Else
GetOrders = GetAllOrdersForClient(currentUser.ClientId)
End If
End Function
Это нормально для вышеперечисленного, но не очень хорошо, поскольку правила усложняются. Скажем, например, мы добавляем другой тип пользователя, который представляет менее доверенного сотрудника, который может просматривать заказы только из подмножества клиентов. Затем нам нужно добавить логику в функции CanViewOrder и GetOrders (и, возможно, в классы доступа к данным), что, на мой взгляд, нарушает принцип DRY.
Итак, мой вопрос: я здесь упускаю хитрость - есть ли способ объединить бизнес-логику для разрешения просмотра заказов в одном месте, которое могут использовать обе эти функции?
Или я слишком много волнуюсь, и мне нужно просто встать и иметь логику в двух местах?
(В этом конкретном приложении я использую ASP Classic - не ненавидь игрока, ненавидь игру - но мне было бы интересно узнать, как решить эту проблему на любом языке)