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