Когда в Dart предпочтительнее использовать var вместо явного указания типа?

«Когда в Dart предпочтительнее использовать var вместо явного указания типа?» — вопрос из категории Dart Core, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Dart я использую var для локальных переменных, когда тип значения очевиден из контекста инициализации. Это делает код чище без потери читаемости.

Идеальные случаи:

  • Инициализация коллекций с явными дженериками или литералами:
    var names = <String>[]; // Вместо List<String> names = [];
    var settings = {'theme': 'dark', 'notifications': true}; // Map<String, dynamic>
    var count = 0; // int
  • При работе с длинными именами типов, особенно в дженериках:
    var complexStream = Stream<Map<String, List<Future<int>>>>.empty(); // Тип очевиден справа

Когда я избегаю var:

  • Если тип неочевиден из правой части выражения. Это ухудшает читаемость для других разработчиков (и для меня самого через месяц).

    // Плохо: Что возвращает processData?
    var result = processData();
    
    // Лучше:
    ProcessResult result = processData();
    // Или даже лучше, если функция типизирована:
    final result = processData(); // final + вывод типа
  • Для публичных API (полей класса, возвращаемых типов методов, параметров). Там явное указание типа — это документация.
  • Для переменных, которые инициализируются позже (не в момент объявления).

Практическое правило: Я предпочитаю использовать final вместо var, если переменная не будет переназначаться. Это даёт те же преимущества краткости, плюс гарантию неизменяемости: final list = <String>[];