Как разделить журнал бизнес-логики и метрик? - PullRequest
5 голосов
/ 28 апреля 2019

Во многих Приложениях нам нужно регистрировать статистические метрики, такие как Hist, Guage и так далее. Это загрязнит бизнес-логику. Например:

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;
}

, который, я надеюсь, я могу записать только логику бизнеса, такую ​​как:

boolean buy(int id) {
  int remain = checkRemain();
  if (remain > 0)
    return true;
  else
    return false;
}

Но я также могу получить показатели.

У меня вопрос: как лучше разделять журнал бизнес-логики и метрик?

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

1 Ответ

3 голосов
/ 28 апреля 2019

Если вы не хотите использовать AOP, вы можете использовать наблюдателя

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

Определить интерфейс наблюдателя

public interface Observer {
    void buyed(int id, int remain);
}

Затем используйте в классе бизнес-логики:

 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;
}

Класс Metrics реализует интерфейс наблюдателя

class Metrics implements Observer {
   void buyed(int id, int remain){
       metrics.increment();
       metrics.hist(remain); 
   }
....
...