Как бы вы провели код-ревью чужого кода в React Native?
Процесс код-ревью в React Native-проекте требует системного и многослойного подхода. Он не ограничивается только синтаксисом или логикой компонента — важно учитывать производительность, архитектуру, безопасность, нативные особенности платформ и будущее масштабирование. Приведу детальное описание того, как я бы проводил код-ревью чужого кода в React Native.
1. Общее понимание задачи и контекста
Перед тем как просматривать код, сначала читаю:
-
заголовок и описание PR;
-
связанные задачи (ticket, issue, user story);
-
комментарии, если они есть.
Это позволяет понять, что конкретно должно быть реализовано и какие требования были у задачи (UI, функциональность, производительность, ограничения платформ и т.д.). Без этого сложно оценивать, насколько код решает проблему.
2. Структура проекта и размещение файлов
Проверяю:
-
правильно ли размещены компоненты, хуки, утилиты;
-
не нарушена ли модульная структура (например, components, hooks, services, screens);
-
используются ли общие слои: api, ui, features, entities, shared.
Неправильное размещение кода ведёт к путанице, плохой читаемости и проблемам масштабирования.
3. Архитектура компонентов
-
Компонент решает только одну задачу или делает слишком много?
-
Есть ли разделение на Presentational и Container компоненты?
-
Логика вынесена в хуки или useEffect перегружен?
-
Компонент слишком большой (более 200 строк) — нужно делить.
Также проверяю, не нарушены ли принципы SOLID, особенно Single Responsibility.
4. UI и работа с базовыми компонентами
Проверяю:
-
Использование стандартных компонентов (View, Text, Image, TouchableOpacity) или UI-библиотек.
-
Применение StyleSheet.create (а не inline стилей).
-
Адаптивность: применяется ли Dimensions, useWindowDimensions, flex, percentage?
-
Учет платформенных особенностей (Platform.OS, StatusBar, SafeAreaView).
Наличие хардкода (например, фиксированные height: 800) — сигнал тревоги.
5. Навигация и роутинг
-
Используется ли React Navigation правильно?
-
Навигация реализована декларативно?
-
Передаются ли параметры через route.params, а не через глобальные переменные?
-
Отслеживается ли focus экрана, если требуется?
Также смотрю, не происходят ли лишние ререндеры из-за navigation в props.
6. Состояние и управление данными
-
Правильно ли используется useState, useReducer, useContext или Zustand/Redux?
-
Есть ли избыточное или дублирующее состояние?
-
Не происходит ли утечка данных между экранами?
-
Состояние компонента — локальное или лучше вынести в глобальное?
Неправильное управление состоянием может привести к багам и сложной отладке.
7. Работа с API
Если в PR есть сетевые вызовы:
-
Используется ли fetch, axios, react-query, swr?
-
Разделены ли UI и бизнес-логика API?
-
Есть ли обработка ошибок, loading/success/error состояния?
-
Учитывается ли отмена запросов при размонтировании?
Также проверяю, есть ли повторное использование API-методов или всё пишется в компонентах.
8. Производительность
-
Компоненты мемоизированы (React.memo, useMemo, useCallback)?
-
Избегаются ли лишние ререндеры?
-
FlatList/ScrollView используются по назначению?
-
Применяются ли оптимизации: getItemLayout, initialNumToRender, windowSize?
Производительность особенно важна в списках, видеофидах, анимациях.
9. Типизация
-
Используется ли TypeScript?
-
Типы корректно указаны (вместо any, unknown)?
-
Используются ли интерфейсы и типы компонентов/props?
-
Повторяющиеся типы вынесены в types.ts?
Плохо типизированный код сильно снижает надёжность и усложняет работу в команде.
10. Масштабируемость и переиспользуемость
-
Присутствует ли дублирование компонентов/стилей/логики?
-
Можно ли компонент переиспользовать в других частях приложения?
-
Созданы ли переиспользуемые UI-атомы (например, Button, Card, Input)?
-
Не "захардкожены" ли строки, которые потом будут локализоваться?
Код должен быть гибким для адаптации, локализации и кастомизации.
11. Тестируемость и покрытие
-
Есть ли юнит-тесты на хуки, утилиты?
-
Компоненты покрываются e2e-тестами (detox, Appium)?
-
Если нет — написан ли код так, чтобы его легко было протестировать?
-
Применяются ли моки для API?
Даже если тестов в PR нет, оцениваю тестируемость архитектуры.
12. Читаемость, стиль и форматирование
-
Поддерживается ли единый стиль (eslint, prettier)?
-
Структурированы ли импорты: внешние → внутренние → относительные?
-
Используются ли понятные имена переменных и функций?
-
Разделены ли логические блоки пустыми строками?
Плохая читаемость усложняет ревью и работу в команде.
13. Работа с платформенными модулями
Если код содержит вызовы PermissionsAndroid, Linking, Vibration, Camera, Geolocation:
-
Проверяю правильность использования нативных API
-
Учитываются ли разрешения, ошибки, прерывания
-
Код не крашится при отклонении пользователем разрешения
Также проверяю, не привязаны ли вызовы к платформе, если они не обёрнуты в Platform.OS.
14. Безопасность и уязвимости
-
Используются ли безопасные вызовы (например, _.get для вложенных объектов)?
-
Учитывается ли защита от XSS/инъекций в WebView?
-
Есть ли логика обработки ошибок и fallback UI?
Проверяю также, нет ли утечки токенов, паролей, логов в консоль.
15. Комментарии и документация
-
Присутствуют ли комментарии к сложной логике?
-
Переиспользуемые утилиты или хуки задокументированы?
-
Понятны ли пропсы компонентов, если они сложные?
Избыточные комментарии не нужны, но хорошо написанный JSDoc облегчает чтение кода.
Код-ревью в React Native — это не просто проверка на баги. Это способ совместного улучшения архитектуры, UX и устойчивости всего приложения. Важно давать конструктивную обратную связь, предлагать улучшения и объяснять, почему тот или иной подход лучше.