Этот ответ не очень общий. Я даю предложение на Java, и вы можете посмотреть, сможете ли вы адаптировать его к другим языкам, которые вы используете. Я использую некоторые функции Java.
Также я не могу написать ваш код более красиво, чем то, что вы уже сделали. Я предлагаю применить то, что написал Бьярн Страуструп: код может быть настолько уродливым, насколько это необходимо, до тех пор, пока вы можете скрыть это за красивым интерфейсом. Это позволит вам написать пример кода следующим образом:
CallFrequencyController myCallFrequencyController
= new CallFrequencyController(5, TimeUnit.SECONDS, this::myMethod);
void methodThatGetsCalledManyTimesPerSecond() {
myCallFrequencyController.call();
}
Здесь я скрываю уродливый код:
class CallFrequencyController {
Instant nextCallTime = Instant.now();
final long methodRunIntervalNanos;
final Runnable methodToCall;
public CallFrequencyController(int frequency, TimeUnit frequencyUnit, Runnable methodToCall) {
methodRunIntervalNanos = frequencyUnit.toNanos(frequency);
this.methodToCall = methodToCall;
}
public void call() {
Instant now = Instant.now();
if (now.isBefore(nextCallTime)) {
return;
}
methodToCall.run();
nextCallTime = now.plusNanos(methodRunIntervalNanos);
}
}
Вы можете разработать этот класс один раз и тщательно его протестировать. , а затем вам больше не нужно беспокоиться о том, чтобы забыть обновить время последнего или следующего вызова или написать другие ошибки.
Если вам нужно передать аргумент myMethod
и вернуть результат из него в вашу платформу,вам нужно, чтобы ваш класс был общим. Это еще одно осложнение, но опять же: в основном оно скрыто за красивым интерфейсом. Да, интерфейс универсальный, но это хорошо, и, в частности, код, использующий его, выглядит красиво. Сложность скрыта за этим.