Расскажи про опыт код-ревью

Ответ

Я регулярно участвую в код-ревью как в качестве автора, так и ревьювера. Для меня это не просто формальность, а ключевой инструмент для поддержания качества кода и обмена знаниями в команде Flutter-разработчиков.

На что я обращаю внимание при ревью кода на Dart/Flutter:

  • Производительность и эффективность Flutter:

    • Избегает ли код лишних перестроений (build)? Используются ли const конструкторы где возможно?
    • Правильно ли управляются подписки на Stream'ы или ChangeNotifier'ы (отписка в dispose)?
    • Нет ли print-отладочных операций в продакшн-коде?
  • Архитектура и читаемость:

    • Следует ли код выбранному паттерну (например, BLoC, Provider, Riverpod)? Логика отделена от UI?
    • Названия переменных, методов и виджетов понятны и следуют Dart conventions (lowerCamelCase, UpperCamelCase).
    • Сложная бизнес-логика прокомментирована.
  • Обработка ошибок и edge cases:

    • Есть ли обработка ошибок сетевых запросов (через try/catch или .onError)?
    • Учитываются ли состояния загрузки и пустых данных?

Пример замечания из реального ревью:

Было (потенциальная проблема):

Widget build(BuildContext context) {
  return FutureBuilder<String>(
    future: _fetchData(), // Future создается при каждом build!
    builder: (context, snapshot) { ... },
  );
}

Предложил исправить: Инициализировать Future в initState() или использовать FutureBuilder с ключом, либо, что лучше, вынести логику в Cubit/Bloc.

Я всегда стремлюсь давать конструктивную обратную связь, задавая вопросы ("Как ты думаешь, что произойдет, если...?") и предлагая конкретные альтернативы или ссылки на документацию.

Ответ 18+ 🔞

А, ну вот, опять про код-ревью. Давай, рассказывай, как мы тут друг другу мозги ебём за качество кода. Для меня это, бля, не какая-то хуйня для галочки, а реально важная штука, чтобы вся команда не превратилась в сборище распиздяев, которые пишут говнокод. Обменяться опытом, подтянуть джунов — дело святое.

Так, на что я, сука, смотрю, когда втыкаюсь в чужой Dart/Flutter:

  • Производительность, мать её:

    • Этот код не дрочит лишние перестроения виджетов? const конструкторы, ёпта, где они? Их же нада впендюрить везде, где можно, это ж не просто так придумали!
    • Подписки на стримы или нотифаеры — они закрываются в dispose или будут висеть, как сопли, до скончания времён? Это же классика, доверия ебать ноль новичкам в этом вопросе.
    • И, бля, print-ы, которые в проде будут спамить в консоль — ты чё, охренел? Удали эту дичь, ядрёна вошь!
  • Архитектура и чтобы можно было прочитать:

    • Мы вроде как договорились на BLoC/Provider/Riverpod — так следуй, бля, паттерну! Не мешай логику с UI в одну кучу, как говно в проруби. Отделяй, сука, одно от другого.
    • Имена переменных — это пиздец просто. a, b, temp — это ты для себя пишешь или для людей? Называй понятно, по конвенциям языка, lowerCamelCase для переменных, UpperCamelCase для классов. Э, бошка, думай!
    • Если написал какую-то хитрожопую логику, на которую сам через неделю будешь смотреть как баран на новые ворота — поясни её комментарием. Не заставляй меня гадать, чувак.
  • Ошибки и краевые случаи:

    • Сетевой запрос упал — и что? Приложение крешнется, а пользователь увидит белый экран? try/catch, .onError, состояния ошибки — это must have, а не опция.
    • Данные грузятся, данных нет — эти состояния тоже надо отрисовывать. Нельзя показывать пустой экран и делать вид, что всё окей.

Вот, смотри, реальный пример из жизни, как я одного коллегу поправил:

Было (потенциальная ёбаная проблема):

Widget build(BuildContext context) {
  return FutureBuilder<String>(
    future: _fetchData(), // Future создаётся при КАЖДОМ build, ёпта! Овердохуища перестроений!
    builder: (context, snapshot) { ... },
  );
}

Я ему и говорю: Мужик, ты что, совсем? Этот Future будет запускаться каждый раз, когда виджет перестраивается, хоть от ветра. Инициализируй его в initState, либо используй FutureBuilder с ключом, а в идеале — вынеси всю эту логику в Cubit или Bloc, как взрослые дяди делают. Так и написал.

Я всегда стараюсь не просто тыкать пальцем и орать «фигня», а объяснять, почему так плохо и как сделать лучше. Спрашиваю: «А как думаешь, что будет, если тут прилетит null?». И кидаю ссылки на доки или хорошие статьи. Чтобы человек не просто исправил, а понял, и в следующий раз не наступил на те же грабли.