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

Ответ

В 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>[];

Ответ 18+ 🔞

А, блядь, Dart и его var! Ну, смотри, тут всё просто, как палка. Я эту штуку юзаю для локальных переменных, когда сходу понятно, какого хрена там внутри. Код становится чище, а читаемость не страдает — красота, ёпта.

Идеальные случаи, когда руки сами тянутся к var:

  • Когда коллекции инициализируешь с явными дженериками или литералами. Тут и думать не надо, всё на поверхности.
    var names = <String>[]; // Ну ясно же, List<String>, зачем городить?
    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` с выводом типа, красота:
    final result = processData(); // final + вывод типа — идеально.
  • Для публичного API — полей класса, возвращаемых типов, параметров. Это ж документация, ёпта, а не тайное послание. Тут надо быть явным, как пощёчина.
  • Для переменных, которые объявляешь сейчас, а инициализируешь потом. Тут var — это просто распиздяйство.

Моё железное правило, которое редко подводит: Если переменная не будет меняться, я жму final вместо var. Та же краткость, но плюс гарантия, что никто эту хуйню случайно не перепишет. final list = <String>[]; — и все довольны, волнение ебать на нуле.