Рефакторите этот фрагмент JavaScript для повышения читаемости и поддерживаемости: "function x(a){var b=a.split(','); if(b.length>1){return b.map(function(s){return s.trim().toLowerCase();}).filter(Boolean);} return []}" — опишите шаги рефакторинга, тесты и критерии завершённости
Рефакторинг — коротко и по делу: новый код, шаги рефакторинга, набор тестов и критерии готовности. 1) Рефакторированный код (читаемый, безопасный, документированный): ```javascript /** * Преобразует CSV-строку в массив ненулевых токенов в нижнем регистре. * Возвращает пустой массив для нестроковых или пустых входов. * * @param {string} input - CSV-строка (разделитель по умолчанию ','). * @returns {string[]} массив токенов в нижнем регистре */ function parseCsvTokens(input) { if (typeof input !== 'string' || input.trim() === '') { return []; } return input .split(',') .map(s => s.trim().toLowerCase()) .filter(Boolean); } module.exports = { parseCsvTokens }; ``` 2) Шаги рефакторинга (почему и что сделано) - Переименование: `x` → `parseCsvTokens` — имя отражает поведение (читаемость). - Валидация входа: явная проверка `typeof input !== 'string'` и `input.trim() === ''` — предотвращает ошибки при `null`/`undefined`. - Использование `const`/`let` не нужно здесь (чистая цепочка), но код оформлен функционально и без мутаций. - Явный комментарий / JSDoc — документирует контракт функции. - Сохранён понятный поток: `split` → `map(trim+lowercase)` → `filter(Boolean)` (удаляет пустые). - Возможное улучшение: добавить аргумент `delimiter` или сделать функцию более общей (по необходимости). 3) Тесты (unit tests, например Jest) — набор кейсов: ```javascript const { parseCsvTokens } = require('./path'); test('normalizes and splits', () => { expect(parseCsvTokens('A, b , ,C')).toEqual(['a','b','c']); }); test('returns empty array for empty string', () => { expect(parseCsvTokens('')).toEqual([]); }); test('returns empty array for whitespace-only', () => { expect(parseCsvTokens(' ')).toEqual([]); }); test('returns empty array for null/undefined', () => { expect(parseCsvTokens(null)).toEqual([]); expect(parseCsvTokens(undefined)).toEqual([]); }); test('single value preserved and lowercased', () => { expect(parseCsvTokens(' X ')).toEqual(['x']); }); test('handles no separators correctly', () => { expect(parseCsvTokens('one')).toEqual(['one']); }); test('ignores extra commas', () => { expect(parseCsvTokens('a,,b, ,c')).toEqual(['a','b','c']); }); ``` 4) Критерии завершённости (Definition of Done) - Код имеет понятное имя и JSDoc; все изменения покрыты тестами. - Юнит-тесты проверяют основные кейсы: нормальные входы, пустые строки/пробелы, `null`/`undefined`, множественные запятые. - Все тесты проходят локально в CI. - Статический анализ/линтер не выдаёт ошибок (например, ESLint без предупреждений). - Поведение обратно совместимо с ожидаемым: для строки с разделителями возвращается массив токенов; для недопустимых входов — пустой массив. - Тестовый охват критичных путей >= 80%\,80\%80% (рекомендуемый ориентир). 5) Дополнительные рекомендации (по необходимости) - Если функция используется в разных контекстах — вынести опцию `delimiter` и/или опцию `normalize` (lowercase). - Добавить интеграционные тесты, если результат передаётся в другие модули. - Рассмотреть обработку Unicode-normalization, если важны сложные символы. Если нужно, могу предложить версию с аргументом `delimiter` и примеры интеграционных тестов.
1) Рефакторированный код (читаемый, безопасный, документированный):
```javascript
/**
* Преобразует CSV-строку в массив ненулевых токенов в нижнем регистре.
* Возвращает пустой массив для нестроковых или пустых входов.
*
* @param {string} input - CSV-строка (разделитель по умолчанию ',').
* @returns {string[]} массив токенов в нижнем регистре
*/
function parseCsvTokens(input) {
if (typeof input !== 'string' || input.trim() === '') {
return [];
}
return input
.split(',')
.map(s => s.trim().toLowerCase())
.filter(Boolean);
}
module.exports = { parseCsvTokens };
```
2) Шаги рефакторинга (почему и что сделано)
- Переименование: `x` → `parseCsvTokens` — имя отражает поведение (читаемость).
- Валидация входа: явная проверка `typeof input !== 'string'` и `input.trim() === ''` — предотвращает ошибки при `null`/`undefined`.
- Использование `const`/`let` не нужно здесь (чистая цепочка), но код оформлен функционально и без мутаций.
- Явный комментарий / JSDoc — документирует контракт функции.
- Сохранён понятный поток: `split` → `map(trim+lowercase)` → `filter(Boolean)` (удаляет пустые).
- Возможное улучшение: добавить аргумент `delimiter` или сделать функцию более общей (по необходимости).
3) Тесты (unit tests, например Jest) — набор кейсов:
```javascript
const { parseCsvTokens } = require('./path');
test('normalizes and splits', () => {
expect(parseCsvTokens('A, b , ,C')).toEqual(['a','b','c']);
});
test('returns empty array for empty string', () => {
expect(parseCsvTokens('')).toEqual([]);
});
test('returns empty array for whitespace-only', () => {
expect(parseCsvTokens(' ')).toEqual([]);
});
test('returns empty array for null/undefined', () => {
expect(parseCsvTokens(null)).toEqual([]);
expect(parseCsvTokens(undefined)).toEqual([]);
});
test('single value preserved and lowercased', () => {
expect(parseCsvTokens(' X ')).toEqual(['x']);
});
test('handles no separators correctly', () => {
expect(parseCsvTokens('one')).toEqual(['one']);
});
test('ignores extra commas', () => {
expect(parseCsvTokens('a,,b, ,c')).toEqual(['a','b','c']);
});
```
4) Критерии завершённости (Definition of Done)
- Код имеет понятное имя и JSDoc; все изменения покрыты тестами.
- Юнит-тесты проверяют основные кейсы: нормальные входы, пустые строки/пробелы, `null`/`undefined`, множественные запятые.
- Все тесты проходят локально в CI.
- Статический анализ/линтер не выдаёт ошибок (например, ESLint без предупреждений).
- Поведение обратно совместимо с ожидаемым: для строки с разделителями возвращается массив токенов; для недопустимых входов — пустой массив.
- Тестовый охват критичных путей >= 80%\,80\%80% (рекомендуемый ориентир).
5) Дополнительные рекомендации (по необходимости)
- Если функция используется в разных контекстах — вынести опцию `delimiter` и/или опцию `normalize` (lowercase).
- Добавить интеграционные тесты, если результат передаётся в другие модули.
- Рассмотреть обработку Unicode-normalization, если важны сложные символы.
Если нужно, могу предложить версию с аргументом `delimiter` и примеры интеграционных тестов.