Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена цикла конвейером (Replace Loop with Pipeline).md
2026-02-23 19:52:05 +03:00

36 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20250131092749.png]]
### **Проблема**
Использование циклов для обхода коллекции объектов
```javascript
const names = [];
for (const i of input) {
if (i.job === programmer) {
names.push(i.name);
}
}
```
### **Решение**
Языковые среды обеспечивают для этого лучшую конструкцию — конвейер коллекции
```javascript
const names = input
.filter(i => i.job === programmer)
.map(i => i.name)
```
### **Причины рефакторинга**
Конвейеры коллекций позволяют мне описать обработку как последовательность операций, каждая из которых потребляет и генерирует коллекцию. Наиболее распространенными из этих операций являются отображение (*map*), использующее функции для преобразования каждого элемента входной коллекции, и фильтр (*filter*), в котором используется функция для выбора подмножества входной коллекции для последующих действий в конвейере. Мне гораздо проще следовать логике, если она выражена в виде конвейера — в таком случае я могу читать ее сверху вниз, чтобы увидеть, как объекты проходят через конвейер
### **Недостатки**
- Если при проведении этого рефакторинга вы перестараетесь, придётся прибегнуть к [[Встраивание класса (Inline Class)|встраиванию класса]].
### **Порядок рефакторинга**
1. Создайте новую переменную для коллекции цикла.
2. В нисходящем направлении возьмите каждый фрагмент поведения в цикле и замените его операцией конвейера коллекции в выводе переменной сбора цикла. Выполните тестирование после каждого изменения.
3. Как только все поведение будет убрано из цикла, удалите его
### **Ссылки**
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]