mardi 2 février 2016

What design pattern to use for a time-measurement profiler service?

I have a symfony2 application. It abstracts a bunch of external APIs, all of them implementing an ExternalApiInterface.

Each ExternalApiInterface has a lot of methods, e.g. fetchFoo and fetchBar.

Now, I want to write a service that measures the time of each method call of an instance of an ExternalApiInterface.

My current thinking is to implement a StopWatchExternalApiDecorator, that wraps each method call. Yet this approach leads, in my understanding, to code duplication.

I think I am going to use the StopWatch component for the time measurement, yet this feels odd:

class StopWatchExternalApiDecorator implements ExternalApiInterface {
    public function __construct(ExternalApiInterface $api, Stopwatch $stopWatch)
    {
       $this->api = $api;
       $this->stopWatch = $stopWatch;
    }

    public function fetchBar() {
         $this->stopWatch->start('fetchBar');
         $this->api->fetchBar()
         $this->stopWatch->stop('fetchBar');
    }

    public function fetchFoo() {
         $this->stopWatch->start('fetchFoo');
         $this->api->fetchFoo()
         $this->stopWatch->stop('fetchFoo');
    }
}

It seems like I am hurting the DNRY (do not repeat yourself) approach. Am I using the right pattern for this kind of problem, or is there something else more fit? More fit in the sense of: One place to do all the measurement, and no code duplication.

I also dislike of having to touch the decorator in case there will be a new method in the interface. In my mind, that should be independent.

Aucun commentaire:

Enregistrer un commentaire