Как предоставить «частные» поля классу обслуживания, придерживаясь принципа единой ответственностиC#

Место общения программистов C#
Ответить
Anonymous
 Как предоставить «частные» поля классу обслуживания, придерживаясь принципа единой ответственности

Сообщение Anonymous »

Потенциально это проблема XY, но, насколько я понимаю, SRP (принцип единой ответственности) если у вас есть объект Order, свойства должны находиться в Order, но такие методы, как SaveOrder() или ValidateOrder(), вместо этого должны жить в классе OrderService, где Order передается в качестве параметра в метод SaveOrder(IOrder).
Идея такого подхода заключается в том, что Order содержит только информацию, необходимую для заказа. (идентификатор заказа, цена и т. д.) и отделен от логики его сохранения, за которую отвечает Сервис. (Может случиться так, что один IOrderService сохраняет в SQL, а другой в текстовый файл, например, и в этом случае этот шаблон также необходим для принципа открытости/закрытости).
Если, однако, мы хотим сохранить заказ (или проверить заказ может иметь больше смысла в этом контексте) только один раз за время существования экземпляра, то, похоже, нам нужен флаг isValidated, чтобы жить в заказе, чтобы мы могли прочитать order.IsValidated, чтобы увидеть, нужно ли нам его сохранить или нет.
Пример реализации того, как, по моему мнению, это следует сделать, приведен ниже:

Код: Выделить всё

public interface IOrder
{
int OrderID { get; }
int NumberOfPieces { get; }

bool IsValidated { get; }
}

public interface IValidate
{
void SetValidated();
}

public class Order : IOrder, IValidate
{
public int OrderID { get; private set; }

public int NumberOfPieces { get; private set; }

private bool _isValidated = false;
public bool IsValidated
{
get { return _isValidated; }
private set { _isValidated = value; }
}
public void SetValidated()
{
_isValidated = true;
}
}

public interface IOrderService
{
void Validate(IOrder order);
}

public class OrderService : IOrderService
{
public void Validate(IOrder order)
{
if (order is IValidate v)
{
DoValidateWork(order);
v.SetValidated();
}
}

private bool DoValidateWork(IOrder order)
{
//validation logic
return true;
}
}
Проблема, которую я вижу, заключается в том, что метод SetValidated() технически может быть вызван в любом месте приложения, приведя Order к IValidated, и позволяет другим разработчикам в той же базе кода просто установить для флага isValidated значение true, минуя реализацию OrderService.
Существует ли стандартный способ инкапсуляции флага isValidated, чтобы только OrderService мог его обновлять?
/>Из того, что я читал, вложение классов — это плохая практика, и когда я спрашиваю ИИ, он говорит мне поместить Order/OrderService в его собственную сборку и пометить его как внутренний, что выглядит абсолютно нелепо.
Если у кого-то есть какие-либо советы или идеи по поводу лучших шаблонов (или причин, по которым приведение типов как IValidated — хорошее решение, чтобы успокоить мои опасения по этому поводу), я ценю ваши мысли.
Спасибо всем за чтение.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ngle-respo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»