Рефакторите этот фрагмент JavaScript для повышения читаемости и поддерживаемости: "function x(a){var b=a.split(','); if(b.length>1){return b.map(function(s){return s.trim().toLowerCase();}).filter(Boolean);} return []}" — опишите шаги рефакторинга, тесты и критерии завершённости

30 Апр в 10:47
31 +1
0
Ответы
1
Рефакторинг — коротко и по делу: новый код, шаги рефакторинга, набор тестов и критерии готовности.
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` и примеры интеграционных тестов.
30 Апр в 10:54
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир