Что коллеги-разработчики думают об условном операторе?
Мне действительно очень нравится условный оператор в C#. Это делает мою жизнь намного проще в написании такой логики:
public string FormattedFileName
{
get
{
return string.Format("{0}_{1}_{2}_{3}.xls",
DateTime.Now.Month.ToString().Length == 1
? "0" + DateTime.Now.Month.ToString()
: DateTime.Now.Month.ToString(),
DateTime.Now.Day.ToString().Length == 1
? "0" + DateTime.Now.Day.ToString()
: DateTime.Now.Day.ToString(),
DateTime.Now.Year.ToString(),
"DownLoaded_From_Clients");
}
}
Конечно, это означает, что я теряю читабельность кода. В любом случае, мне просто любопытно, что думают другие разработчики по поводу такого подхода к написанию кода. Благодарю. Я одинаково ценю как негативные, так и позитивные комментарии.
17 ответов
Нравится? Используйте это: не
// if (Like it) then (Use it) else (Don't)
Когда вам это нужно, троичный оператор неоценим. Тем не менее, я думаю, что часто есть лучшие способы выразить себя. В приведенном вами примере почему бы не использовать строку формата, которая будет делать именно то, что вы хотите: "{0:00}_{1:00}_{2}_{3}.xls"
, позволяющий значительно упростить ваш код?
У вас есть пример злоупотребления условным оператором,
Это можно выразить гораздо более четко следующим образом:
public string FormattedFileName
{
get {
return DateTime.Now.ToString("MM_dd_yyyy") +
"_DownLoaded_From_Clients.xls";
}
}
Я считаю условный оператор весьма полезным и часто его использую. При правильном использовании он может помочь упростить код, сделав его более кратким.
В целом, я буду избегать объединения нескольких условных выражений в одном и том же выражении, оно быстро становится очень запутанным, что приводит к тому, что код не может быть поддержан.
Я также нахожу?? Очень полезны и довольно часто находят троицы, которые легко можно заменить на??.
Например:
a == null? "empty" : a
можно заменить на:
a ?? "empty"
Если вы хотите сделать его более читабельным, вы всегда можете выделить вызовы в вызовы getCurrentMonth(), getCurrentYear, getCurrentDay....
Комиксов парень говорит. "Худшее использование троичного оператора когда-либо."
Читабельность может быть достигнута за счет использования отступов, пробелов и, как сказал Дейв, комментариев.
Мое личное эмпирическое правило таково: если совершенно очевидно, что делает троичный, тогда все в порядке. Если он втиснут в одну строку только для того, чтобы кодер мог использовать троицу, тогда это должен быть оператор if в скобках.
Я использую его только для простых операторов if, максимум два. Больше, чем это, и я бы лучше написал это далеко, чем чтобы выглядело так, как вы написали. Опять же, я стараюсь не иметь более двух уровней вложенных операторов if, во-первых, так что они никогда не появляются.
Мне действительно не нравится, как ты это использовал. Я использую его, когда легко помещаю его в одну строку вместо использования многострочного оператора if.
Я за использование условного оператора, но он тебе здесь не нужен...
return string.Format("{0}_{1}_{2}_{3}.xls",
DateTime.Now.Month.ToString("00"),
DateTime.Now.Day.ToString("00"),
DateTime.Now.Year,
"DownLoaded_From_Clients");
Я люблю третичный оператор. Это проблема, только когда вы не знакомы с обозначениями. Временами трудно найти документацию об одиноком операторе, но если бы она использовалась больше в документации и книгах, я считаю, что она бы приобрела гораздо большую популярность.
Мне совсем не нравится троичный оператор - он не очень читабелен, и я становлюсь очень раздражительным, когда исправляю ошибки и нахожу подобные вещи.
При взгляде на "функциональный" мир, где вы не можете "делать" вещи условно, условный оператор встречается очень часто. Так или иначе, у меня сложилось впечатление, что функциональная парадигма набирает интерес, потому что она убирает временный поток управления, вызванный заявлениями "если (это) делает другое". Это упрощает определение того, что вы имеете в виду, вместо того, чтобы указывать компьютеру, что делать.
Тем не менее, читаемость является одной из проблем в языках, которые не полностью поддерживают это.
Отладка - это другое: например, в C++ нельзя поставить точку останова только для одной из ветвей.
Почему бы не сделать что-то более подобное?
public string FormattedFileName
{
get
{
return string.Format(
"{0}_{1}_{2}_{3}.xls",
DateTime.Now.Month.ToString().Length == 1 ?
"0" + DateTime.Now.Month.ToString() :
DateTime.Now.Month.ToString(),
DateTime.Now.Day.ToString().Length == 1 ?
"0" + DateTime.Now.Day.ToString() :
DateTime.Now.Day.ToString(),
DateTime.Now.Year.ToString(),
"DownLoaded_From_Clients");
}
}
Заметьте, я вообще не менял код, только форматирование. Как уже отмечалось, вам не нужно использовать условный оператор здесь, но небольшая осторожность с отступом может значительно улучшить читаемость. Мне нравится условный оператор, но если вы запустите весь свой код в плотном блоке без отступов, он будет нечитаемым независимо от того, какие операторы вы используете.
Прокомментируйте свой код, если вы беспокоитесь о читабельности, иначе я не вижу причин не использовать его.
Несколько скобок помогают читабельности.
Попробуйте добавить их, чтобы уточнить, что именно делает ваш оператор чередования, и у вас все будет хорошо.:)
Он называется троичным оператором (в конце концов, мы не называем двоичный код вторичным кодом), и его уже спрашивали: