Является ли хорошей идеей использовать аспекты как метод удаления защитных проверок из логики приложения?
Вид длинного названия, но это, как правило, вопрос.
Я хочу знать, если вы считаете, что это хорошая идея сделать следующее.
Вместо:
public void buyItem(int itemId, int buyerId) {
if (itemId <= 0) {
throw new IlleglArgumentException("itemId must be positive");
}
if (buyerId <= 0) {
throw new IlleglArgumentException("buyerId must be positive");
}
// buy logic
}
Я хочу иметь что-то вроде:
@Defensive("isPositive(#itemId, #buyerId)")
public void buyItem(int itemId, int buyerId) {
// buy logic
}
Как вы думаете, это хорошо / ужасно / слишком необычно / слишком медленно? Если вы на самом деле думаете, что это хорошо, я думал об использовании SpEL для его реализации, есть ли у кого-нибудь что-нибудь лучше / легче / быстрее?
Спасибо,
5 ответов
Это не обязательно плохо, однако ваш простой случай вполне может быть решен с помощью утверждений об исключениях ( а не утверждений, которые я изначально упоминал).
Кажется, вы вводите свой собственный набор аннотаций, которые другие разработчики в вашем проекте должны принять и адаптировать к ним. Тем не менее, после того, как вы ввели аннотации, это выглядит как обычный Proxy
подход будет лучшим кандидатом для решения проблемы.
Подводя итог: Проблема, которую вы описали, может быть легко решена с использованием стандартных альтернатив Java, хотя в более сложном случае она может быть оправдана (например, @Secured
в весенней безопасности), особенно если вы разрабатываете свои собственные рамки.
Я думаю, что это
- переустройства
- нарушение инкапсуляции, полагаясь на внешний аспект (который мог или не мог быть там), чтобы поддерживать инварианты объекта
- запутанным
- не эффективный
- не добавляя никакой ценности
Мне нравится использовать класс предварительных условий Guava для таких проверок. Более того, такие проверки являются частью бизнес-логики, ИМХО.
Я думаю, что вы имели в виду аннотации, а не аспекты. Аспекты обычно являются внешними по отношению к коду, который они советуют. В любом случае вы можете выполнить тот тип проверок, который вы выделили в своем сообщении, с помощью JSR 303. Дело в точке:
public void buyItem(@Min(value = 1) int itemId, @Min(value = 1) int buyerId) {
// buy logic
}
В настоящее время существует две хорошо известные реализации JSR 303:
- Hibernate Validator (эталонная реализация)
- Apache Bean Validation
Это похоже на проверку. К вашему сведению, несколько фреймворков уже существуют, проверьте этот вопрос и OVal, например.
Я не знаю о спектаклях, но для меня это не слишком сложная задача: вы сохраняете только логический код. Я люблю работать с этим.
Я предпочел бы подход утверждения Java.
- это стандартный подход, так что все (большинство?) Java-программисты поймут его. Автоматизированный инструментарий и т. Д. Также сможет его проанализировать.
- вам не нужно ничего развивать самостоятельно. Я знаю, это выглядит тривиально, но эти вещи имеют привычку обостряться.
Если вы не сможете продемонстрировать, что ваш подход явно лучше или делает что-то другое, я бы использовал инструменты и API, которые Java предоставляет в качестве стандарта.