Кое-что о неявной типизации

Отгремели холивары. Герои починяют копья и готовятся к будущим битвам. Ну, а я выскажусь.
На мой взгляд, Илья выступил в пользу повсеместного использования неявной типизации в C# очень мощно и сурово, но абсолютно неубедительно.
Во всяком случае, с моей точки зрения.

использование var принуждает вас более грамотно называть сами переменные.
Это прекрасное теоретическое рассуждение, которое, увы, не выдерживает проверки практикой. Нет. Не принуждает, к сожалению. На практике сентенции вида «var data = somewhere.GetResult()» встречаются с удручающей регулярностью, причём автором метода с неинформативным названием почему-то оказывается именно сторонник неявной типизации. А разбирать такой код потом вынужден кто-то другой, а как же иначе.

использование var принуждает к более качественному API
И снова: на практике, увы, не принуждает. Использование неявной типизации никак не помешает ленивому разрабочику назвать метод абы как: он сумеет его использовать, пока помнит, что этот метод делает. И память об этом, разумеется, нигде не документируется.

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

using (var model = new Entities())
{
    var query = model.TestTable; // Таблица из Entity Framework

    if (args.Any())
    {
        query = query.Where(t => t.Title == args[0]); // здесь видна проблема
    }

    query.OrderBy(t => t.Id);

    foreach (TestTable current in query)
    {
        Console.WriteLine("{0}: {1}", current.Id, current.Title);
    }
}

Этот код даже не скомпилируется (какая уж тут оптимальность!), пока тип переменной query не будет изменён с var на IQueryable<TestTable> или что-нибудь подобное. Да и вообще, предположение, что компилятор умнее программиста, кажется мне несколько… неудачным.

использование var принуждает к инициализации переменных при их объявлении. В общем случае, инициализация переменных при определении является хорошим тоном, а в нашем случае, компилятор обязательно требует такую инициализация при определении переменной через var;
Принуждать к хорошему тону, по идее, должен ведущий разработчик, либо (в крайнем случае) инструмент типа StyleCop, настроенный вышеупомянутым разработчиком. Но это точно не функция компилятора. Который, кстати, в большинстве случаев упадёт при использовании непроинициализированной переменной, даже если она явно типизирована.

использование var приводит к уменьшению «шума» в коде. Существует множество случаев, когда объявленные неявно переменные уменьшают количество текста, который приходится читать разработчику и который он мог бы пропустить. Если мы не используем var, то определение переменной через выражение new или cast требует указание типа дважды. Когда мы имеем дела с обобщениями (generics), то такое положение дел приведет к появлению большого количества излишнего, чрезмерного кода (redundant code). Еще одним подобным примером может стать переменная итерации в foreach для типа наподобие «Dictionary<TKey,TValue>»;
Последняя сентенция — это, пожалуй, единственное, к чему стоит прислушаться. Внутри foreach указание обобщённых типов может оказаться чрезмерным — правда, только в том случае, если тип перебираемой коллекции виден из контекста. То есть,

Dictionary listItems = Repository.GetListItems();
foreach(var item in listItems) { 
    Console.WriteLn(item.Value);
    // Мы видим тип item, а также item.Key и item.Value, 
    // так как тип коллекции задан явно и очевидно
}

var data = Repository.GetListItems();
foreach(var item in data) { 
    Console.WriteLn(item.Value);
    // Нам не виден тип data, мы только знаем, что это коллекция (наверное),
    // поэтому свойство Value представляет для нас загадку:
    // то ли это значение из словаря, то ли загадочное свойство,
    // врукопашную написанное адептом Ордена Мистических Математиков
}

использование var позволяет уменьшить использование директивы using.
Это вообще ерунда. Кому они мешают? Лежат себе в заголовочной части файла и никому не мозолят глаза. Странный аргумент, как будто никакого другого веского не нашлось. Wait, oh shi~~…

5 thoughts on “Кое-что о неявной типизации

  1. Как-то поупускал тут я кучу всего 🙂 Впрочем, все это уже не раз обсуждено в приватах. Тем не менее, подмечу: когда никому в команде var’ы не мешают, то и предмета холивара нет 🙂 Как вот лично мне: доводов использовать их ровно два — мне они приятнее на вид, и никто не против. Точка.
    Если же кому станет с ними плохо, то единоразовое обсуждение, решение, настройка реформата, реформат всего солюшена, и нет проблемы 🙂

    Нравится

    • Совершенно верно, когда у всех членов команды один взгляд на явность типизации — холивара нет. Холивар возникает там, где нет стремления найти компромисс. Что-то подсказывает мне, что, доведись нам работать над одним проектом, мы с лёгкостью нашли бы и общий язык, и способы обеспечить каждому комфортные условия работы.
      Моя же позиция формировалась в условиях, когда с противоположной стороны не было стремления искать компромиссы и способы. Причём соотношение сторон было три к одному, и этот один не желал ассимилироваться и соблюдать правила, принятые как на проекте, так и в организации в целом.
      Явное указание типа — это дополнительная семантика кода, дополнительная очевидность. Мне (и моей текущей команде) она жизненно необходима, а тебе (и твоей команде), видимо, мешает.
      А вообще да, обсуждали, и не раз )

      Нравится

      • Ага, лично я без типов код вижу лучше 🙂 Вернее, заслуга тут не саамих типов, а визуальная компактность. Вполне может быть, что просто еще не сталкивался с такими ситуациями, в которых, как вам, оно жизненно необходимо. Если столкнусь, пересмотрю свое мнение 🙂

        Так же как к разбиению на очень короткие методы и линиям-разделителям привык за пару недель.

        Хочется еще Type members layout настроить, отладить, и внедрить. На второстепенном проекте свнутренними утилитами все хорошо, нравится. А в основной проект пока не решаюсь.

        Нравится

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s