36 lines
2.7 KiB
Markdown
36 lines
2.7 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[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]] |