V807. Decreased performance. Consider creating a pointer/reference to avoid using the same expression repeatedly.
Анализатор обнаружил код, который потенциально можно оптимизировать. В коде присутствуют однотипные цепочки вызовов (message chains) для доступа, к какому-то объекту.
Под цепочкой вызовов понимаются следующие конструкции:
- Get(1)->m_point.x
- X.Foo().y
- next->next->Foo()->Z
Если цепочка вызовов повторяется более двух раз, то возможно следует провести рефакторинг кода.
Рассмотрим пример:
Some->getFoo()->doIt1();
Some->getFoo()->doIt2();
Some->getFoo()->doIt3();
Если функция 'getFoo()' работают медленно или если этот код находится внутри цикла, то тогда код стоит переписать. Например, можно создать временный указатель:
Foo* a = Some->getFoo();
a->doIt1();
a->doIt2();
a->doIt3();
Конечно, так написать можно не всегда. И тем более, не всегда такой рефакторинг даст выигрыш в производительности. Слишком много различных вариантов существует, чтобы давать общие рекомендации.
Однако, наличие цепочек вызовов как правило говорит о неаккуратном коде. Для улучшения такого кода можно использовать несколько вариантов рефакторинга: