У меня есть объект, который может иметь кучу статусов. Третья сторона также отправляет обновленный статус для этого объекта. Мне нужен лучший способ проверить, разрешен ли вновь полученный статус для целевого объекта на основе того, является ли текущий статус логически опережающим или нет.
Например, у customer
может быть куча уставов (CREATED, PROCESSED, UPDATED_STAGE1, UPDATED_STAGE2, UPDATED_STAGE3, UPDATED_STAGE4)
и т. д. Все эти статусы являются хронологически следующими этапами для клиента.
Например, если клиент находится в UPDATED_STAGE2, он может иметь новый статус только как UPDATED_STAGE3
или UPDATED_STAGE4
. Если третье лицо присылает статус UPDATED_STAGE1
, то это запрещено.
Как проверить, является ли вновь полученный статус только хронологически следующим статусом? Статус может быть любым следующим статусом. Например, клиент, который сейчас находится в UPDATED_STAGE2
, может получить UPDATED_STAGE4
напрямую, и это нормально. Однако он не может получить статус до UPDATED_STAGE2
.
Это можно сделать с помощью множества условий if, но есть ли лучший способ сделать это?
public void setNewCustomerStatus(newStatus) {
... logic here that checks, the newStatus is only logically next to the current status.
}
Изменить на основе комментариев:
Вы описываете конечный автомат; есть масса способов это реализовать.
Если минимальная сложность достижения одной вещи равна N, то независимо от того, какой метод вы используете, он не сделает ее сложность меньше N, просто сделает ее более элегантной, например, применив некоторые шаблоны проектирования, которые, возможно, лучше поддерживать позже.
Например, если вы хотите поесть утром, ваша просьба состоит в том, что если есть молоко, то вы должны есть хлеб. Если на столе есть стакан молока, то 1. Тебе нужно испечь хлеб 2. Скажи маме, что если есть молоко, я буду есть хлеб, где бы он ни был Таким образом, тебе не избежать приготовления хлеба , а вы просто добавляете объект «Мама» и доверите приготовление хлеба «Дорогой маме», так вы, как главный завтракающий, избавите себя от хлопот
Возвращаясь к вашему вопросу, вы можете полностью извлечь код для оценки состояния, потому что в будущем могут появиться новые состояния. В то время, если добавляется новое состояние, нет необходимости менять основной процесс, достаточно сосредоточиться на коде управления состоянием. Но в этом случае вам все еще нужно if else для достижения этого (вы не можете уменьшить его сложность).
@Dexygen Я ответил на его вопрос: «Это можно сделать с помощью множества условий IF, но есть ли лучший способ сделать это?» Мое предложение состоит в том, чтобы отделить код обработки состояния от основной части, и я объяснил, что, в конце концов, о них все равно придется судить по тому, если еще. Может быть, вы можете написать какие-нибудь причудливые алгоритмы, а затем инкапсулировать их в метод, о котором можно судить по прямому вызову. Но, в конце концов, этому алгоритму может понадобиться больше, если иначе
Связка IF/ELSE, безусловно, является вариантом, но количество необходимых условий будет слишком большим для любого читаемого кода.
Это довольно просто, если вы используете ordinal():
public enum Status {
CREATED, PROCESSED, UPDATED_STAGE1, UPDATED_STAGE2, UPDATED_STAGE3, UPDATED_STAGE4;
public boolean isBefore(Status other) {
return this.ordinal() < other.ordinal();
}
}
порядковый номер хороший способ. Это работает очень хорошо для моего варианта использования. Спасибо за вашу помощь :)
Каким типом представлены эти статусы? У вас есть перечисление? Или это просто струны? Или именованные целочисленные константы?