Является ли хорошей идеей использовать аспекты как метод удаления защитных проверок из логики приложения?

Вид длинного названия, но это, как правило, вопрос.

Я хочу знать, если вы считаете, что это хорошая идея сделать следующее.

Вместо:

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:

Это похоже на проверку. К вашему сведению, несколько фреймворков уже существуют, проверьте этот вопрос и OVal, например.

Я не знаю о спектаклях, но для меня это не слишком сложная задача: вы сохраняете только логический код. Я люблю работать с этим.

Я предпочел бы подход утверждения Java.

  1. это стандартный подход, так что все (большинство?) Java-программисты поймут его. Автоматизированный инструментарий и т. Д. Также сможет его проанализировать.
  2. вам не нужно ничего развивать самостоятельно. Я знаю, это выглядит тривиально, но эти вещи имеют привычку обостряться.

Если вы не сможете продемонстрировать, что ваш подход явно лучше или делает что-то другое, я бы использовал инструменты и API, которые Java предоставляет в качестве стандарта.

Другие вопросы по тегам