如何分离业务逻辑和指标日志?

Cod*_*Boy 5 java spring design-patterns

在许多应用程序中,我们需要记录统计数据指标,例如历史记录,指标等。这将污染业务逻辑。例如:

boolean buy(int id) {
  metrics.increament(); // for qps maybe.. 
  int remain = checkRemain();
  metrics.hist(remain); // log remain amount..
  if (remain > 0)
    return true;
  else
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我希望我只能写下biz逻辑,例如:

boolean buy(int id) {
  int remain = checkRemain();
  if (remain > 0)
    return true;
  else
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是我也可以获得指标。

我的问题是:分离业务逻辑和指标日志的最佳实践是什么?

我知道面向方面的编程可以解决这个问题,我还有其他选择吗?

Cla*_*sin 4

如果你不想使用AOP,你可以实现一个观察者

https://en.wikipedia.org/wiki/Observer_pattern

定义观察者接口

public interface Observer {
    void buyed(int id, int remain);
}
Run Code Online (Sandbox Code Playgroud)

然后在业务逻辑类中使用:

 private List<Observer> observers = new ArrayList<>();
 public void addObserver(Observer observer) {
    this.observers.add(observer);
 }

 boolean buy(int id){    
    int remain = checkRemain();
    for (Observer observer : this.observers) {
        observer.buyed(id, remain);
    }
    if (remain > 0){  
      return true;
    } else
     return false;
}
Run Code Online (Sandbox Code Playgroud)

Metrics类实现观察者接口

class Metrics implements Observer {
   void buyed(int id, int remain){
       metrics.increment();
       metrics.hist(remain); 
   }
....
Run Code Online (Sandbox Code Playgroud)