使用aspect作为从应用程序逻辑中删除防御性检查的方法是一个好主意吗?

Sim*_*eon 8 java aop coding-style spring-aop

有点长的头衔,但这通常是个问题.

我想知道您是否认为执行以下操作是个好主意.

代替:

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
}
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西:

@Defensive("isPositive(#itemId, #buyerId)")
public void buyItem(int itemId, int buyerId) {
    // buy logic
}
Run Code Online (Sandbox Code Playgroud)

你认为这是好/可怕/太花哨/太慢?如果你真的认为它很好我想用SpEL来实现它,那么有没有人有更好/更轻/更快的东西?

谢谢,

Joh*_*erg 3

这不一定是坏事,但是您的简单情况可以通过异常语句(而不是我最初提到的断言)很好地解决。

看来您正在引入自己的一组注释,项目中的其他开发人员必须接受并适应它们。然而,一旦引入注释,常规Proxy方法似乎是解决该问题的更好选择。

总结:您所描述的问题可以使用标准java替代方案轻松解决,尽管在更复杂的情况下它可能是合理的(例如,考虑@Secured在spring-security中),特别是如果您正在开发自己的框架