﻿# 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

Если цепочка вызовов повторяется более двух раз, то возможно следует провести рефакторинг кода\.

Рассмотрим пример:

```cpp
Some->getFoo()->doIt1();
Some->getFoo()->doIt2();
Some->getFoo()->doIt3();
```

Если функция 'getFoo\(\)' работают медленно или если этот код находится внутри цикла, то тогда код стоит переписать\. Например, можно создать временный указатель: 

```cpp
Foo* a = Some->getFoo();
a->doIt1();
a->doIt2();
a->doIt3();
```

Конечно, так написать можно не всегда\. И тем более, не всегда такой рефакторинг даст выигрыш в производительности\. Слишком много различных вариантов существует, чтобы давать общие рекомендации\.

Однако, наличие цепочек вызовов как правило говорит о неаккуратном коде\. Для [улучшения такого кода](https://sourcemaking.com/refactoring/smells/message-chains) можно использовать несколько вариантов рефакторинга:

1. [Hide Delegate](https://sourcemaking.com/refactoring/hide-delegate)
1. [Extract Method](https://sourcemaking.com/refactoring/extract-method)
1. [Move Method](https://sourcemaking.com/refactoring/move-method)