Проверка кода — иногда утомительный процесс, но я считаю, что нам нужно уделять этому больше времени. Возможно, для вас это возможность научиться или поделиться какими-то знаниями.
Я перечислил некоторые моменты, которые считаю необходимыми для проверки в процессе ревью кода в проектах Android.
Утечки памяти
Представьте себе следующий случай: приложение красивое, но в то же время медленное, навигация между экранами с каждым разом становится все медленнее.
Некоторые моменты, которые необходимо проверить во время проверки кода:
- Есть ли какие-либо Context retention на этот новый кусок кода?
- Имеется ли какой-либо связанный с RxAndroid код? Если да, проверьте, утилизируются ли RxCalls в конце области жизненного цикла (ViewModel/Fragment/Activity).
- Если в коде есть coroutines, проверьте, правильно ли запускается Job из области видимости ViewModel.
- Является ли код реализацией, использующей CountDownTimer, AsyncTask или какой-либо видео/аудио плеер? Если да, то код должен освобождать ресурс памяти, связанный с предотвращением утечки.
- Если это новый фрагмент с использованием ViewBinding, то код должен освободить привязку в методе onDestroyView.
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
Глубокие макеты
Иногда у нас есть ViewGroup, которая имеет другую ViewGroup в качестве дочерней.
Хорошим предложением всегда является использование в качестве ViewGroup ConstraintLayouts, чтобы сохранить более плоские макеты. Это поможет избежать перерисовки, которая вызывает проблемы с производительностью.
<LinearLayout> <FrameLayout> <RelativeLayout> <ConstraintLayout> <View /> <View /> <View /> <View /> </ConstraintLayout> </RelativeLayout> </FrameLayout> </LinearLayout>
В документации по Android есть несколько советов по уменьшению размера.
Аннотации ресурсов
Каждый ресурс в мире Android имеет идентификатор, который представляет собой тип Integer. Как убедиться, что наше значение Integer представляет собой действительный идентификатор ресурса? В этом вопросе нам помогут аннотации.
Например:
fun showMessage(context: Context, val idRes: Int) { Toast.makeText(context, idRes, Toast.SHORT_LENGHT).show() }
В приведенном выше коде рецензент мог бы предложить: «Как вы думаете, как использовать аннотации? Что-то вроде этого:» (покажите пример):
fun showMessage(context: Context, @StringRes val idRes: Int) { Toast.makeText(context, idRes, Toast.SHORT_LENGHT).show() }
Другие примеры аннотаций: здесь.
Похожие компоненты
Очень важно уделять время обзорам кода. Постарайтесь думать так, как думал автор, отражая его выбор, задавая вопросы, чтобы понять код.
Появляется новый код. Подождите: «Этот код делает то же самое, что мы уже имеем в этом компоненте». Комментарии, подобные этому, необходимы, потому что великая вещь — повторное использование того, что уже есть в нашей кодовой базе. Обратите внимание, когда компоненты выглядят примерно так:
- Компонент X меняет цвет луны на красный 🔴;
- Компонент Z меняет цвет полной луны на синий 🔵;
- Компонент А превращает луну в зеленую 🍏.
Почему бы не сделать компонент для изменения цвета любой луны? Он может получать цвет в качестве аргумента. Не слишком ли много работы?
Зоны опасного кода
Если у вас чувствительный код — мне нравится выражение опасная зона, которое лучше описывает эту ситуацию. Опасный код — это код, на который рецензент смотрит и дает такую реакцию, как: «Этот код не имеет никакого смысла».
В этом случае не стоит осуждать автора. Поговорите с ним, чтобы понять, что стоит за этим кодом. Этот разговор может стать возможностью узнать что-то новое.
Нарушение архитектуры
Архитектура программного обеспечения — это протокол связи, определенный между частями программного обеспечения.
Обзор кода — очень эффективный инструмент для выявления таких проблем, как нарушение архитектуры. Добавление комментариев, подобных этим, полезно в таких сценариях:
- «Друг, твоя ViewModel обращается к репозиториям. У нас есть UseCase между ними. Пожалуйста, взгляни на файл MainViewModel, это отличный пример».
- «Почему ты используешь ссылку на Adapter внутри твоей ViewModel? Адаптер — это компонент RecyclerView. Было бы лучше поместить это во Fragment и держать подальше от нашей ViewModel».
Маленькие детали делают разницу
- Неиспользуемый импорт;
- Не используются ресурсы, такие как drawables, strings, colors…
- Закомментированный код;
- Не отформатированный код;
- Имена переменных, имена методов, имена файлов, …
- Код, не соответствующий руководству по стилю. Например, Kotlin определяет четко сформулированное руководство по стилю. Это очень помогает любому разработчику быстро найти любой программный компонент в существующей кодовой базе.
Заключение
Инструменты статического анализа полезны в процессе ревью кода, но они не эффективны на 100%. Критический анализ разработчиков незаменим, если ваша команда стремится к качеству кода.