Отгремели холивары. Герои починяют копья и готовятся к будущим битвам. Ну, а я выскажусь.
На мой взгляд, Илья выступил в пользу повсеместного использования неявной типизации в 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~~…
Да, вот так их! Так этих varvarов!
НравитсяНравится
Как-то поупускал тут я кучу всего 🙂 Впрочем, все это уже не раз обсуждено в приватах. Тем не менее, подмечу: когда никому в команде var’ы не мешают, то и предмета холивара нет 🙂 Как вот лично мне: доводов использовать их ровно два — мне они приятнее на вид, и никто не против. Точка.
Если же кому станет с ними плохо, то единоразовое обсуждение, решение, настройка реформата, реформат всего солюшена, и нет проблемы 🙂
НравитсяНравится
Совершенно верно, когда у всех членов команды один взгляд на явность типизации — холивара нет. Холивар возникает там, где нет стремления найти компромисс. Что-то подсказывает мне, что, доведись нам работать над одним проектом, мы с лёгкостью нашли бы и общий язык, и способы обеспечить каждому комфортные условия работы.
Моя же позиция формировалась в условиях, когда с противоположной стороны не было стремления искать компромиссы и способы. Причём соотношение сторон было три к одному, и этот один не желал ассимилироваться и соблюдать правила, принятые как на проекте, так и в организации в целом.
Явное указание типа — это дополнительная семантика кода, дополнительная очевидность. Мне (и моей текущей команде) она жизненно необходима, а тебе (и твоей команде), видимо, мешает.
А вообще да, обсуждали, и не раз )
НравитсяНравится
Ага, лично я без типов код вижу лучше 🙂 Вернее, заслуга тут не саамих типов, а визуальная компактность. Вполне может быть, что просто еще не сталкивался с такими ситуациями, в которых, как вам, оно жизненно необходимо. Если столкнусь, пересмотрю свое мнение 🙂
Так же как к разбиению на очень короткие методы и линиям-разделителям привык за пару недель.
Хочется еще Type members layout настроить, отладить, и внедрить. На второстепенном проекте свнутренними утилитами все хорошо, нравится. А в основной проект пока не решаюсь.
НравитсяНравится
PS: А оказывается, Newsify сам потом в фоне додолбил гугл и вошел тут как надо 🙂
НравитсяНравится