Другие языки программирования и технологии

Структура построения кода

Сразу оговорюсь, метод для примера, меня интересует именно структура построения данного типа кода (switch и тд не предлагайте).

1) Какой из приведенных на фотографиях (на них, чтобы маил не отформатировал отступы) вариантов построения кода вы считаете более "чистым" и понятным? Почему? Если все вартанты неудачные, предложите свой.

2) Если выражение в скобках оператра большое, то где следует продолжить писать его тело (одно выражение): сразу после скобок, перейти на новую строку, добавить скобки?

Например:
if ((text.Contains("a") && text.Length > 8 && text.Length < 16) || vipText == true)
{
return "successful";
}

3) Вопрос аналогичен второму, только касается не условных операторов, а циклов.

Например, будет ли грязной практикой написать в одну строку цикл и его тело:
for (int i = 0; i < 5; i++) tmp++;
Первый вариант наиболее чистый и читаемый, только он нарушает дефолтный шарповский стиль (лично он мне не симпатизирует, пишу сдерживая тошноту) - по мнению автора языка, должно быть оформлено так:
private int SomeMethod(object obj)
{
  if (obj is int)
  {
    return 0;
  }
  if (obj is double)
  {
    return 1;
  }
  if (obj is string)
  {
    return 2;
  }
  return -1;
}

Условные, и операторы цикла - в шарпе принято размещать на отдельной строке (см. руководство от MS), плюс то же самое дебильное правило оборачивать в блок даже единственное выражение, и в результате получаем следующий вид:
for (...)
{
  expression;
}

Майкрософт такой майкрософт... как обычно: "все для удобства, все для людей" :D
BS
Bekbolat Satybaldy.uly
79 467
Лучший ответ
Канат Сулейменов Это "удобство" призвано избежать такого труднообнаруживаемого косяка:
if (condition)
first();
second();
Во первых, в разных языках (даже с похожим синтаксисом) разный code style. Во вторых, в разных фирмах используется разный code style - даже для одного языка. Единственный популярный язык, в котором code style встроен в язык - это Go.

Во вторых, хорошим стилем является ВСЕГДА ставить фигурные скобки - даже если тело оператора состоит из одного return или одного tmp++.

Так что с моей точки зрения все три скриншота плохи, но третий хуже - так как набит совершенно не нужными else.

А вот выносить return на отдельную строчку или писать
if (что-то там) { return 1; }
это уже дело вкуса. Если помещается на одну строку - можно и в одну строку, если не помещается или в теле оператора более одного вложенного оператора - только так:
if (длинное условие) {
return 2;
}
AA
Askar Askar
55 724
Сергей Пестов Не согласен. Никогда не ставлю фигурные скобки для одного вложенного оператора. Это только загромождает код и мешает его читать.
1) Тут зависит от длины команд, на мой вкус. Если они относительно короткие, все влезают примерно в половину ширины экрана, то вар. 1 мне кажется удобнее, только я бы еще табуляцией выровнял схожие части команд в строке, чтобы получилось что-то вроде таблицы - это очень удобно воспринимать и искать в ней нужные позиции. Если команды большие - лучше был бы вариант 2. Вариант 3 для случая, когда телом является return, является избыточным и поэтому хуже.
Вот если в теле другие команды, то, конечно нужно использовать else if, по тому же правилу - короткий код - оформляем в виде компактной таблицы, длинный - вложенными структурами, возможно с пустыми строками.

2) Ну, собственно в п. 1 ответил. Для длинной команды всегда лучше сделать перенос строк, строки, выходящие за границы экрана плохо читаются. Можно даже условие разместить на несколько строк, при наличии структуры - тоже оформить в виде таблицы. Для особо ужасных случаев - хорошая практика вынести часть вычислений логического выражения отдельными операторами в промежуточную переменную или переменные, разделив условия по смыслу (например, проверка типов, потом - диапазон допустимых значений, потом - какая-то бизнес-логика, чтобы при чтении кода не нужно было вникать в условие целиком, а можно было, по-желанию, фокусироваться на его частях.

3) Некоторые считают, что для форматирования нужно строго придерживаться одного подхода, лично мне кажется, что в подобных вопросах это не обязательно - если команда короткая - ее нужно записать в одну строку. Обычно подобные циклы воспринимаются как одна операция, например инициализация массива и т. д., довольно очевидна и не требует комментариев - не вижу смысла увеличивать количество строк.
Никита Никитин
Никита Никитин
82 465
if ((text.Contains("a") && text.Length > 8 && text.Length < 16) || vipText == true)

превышает 80 символов. Хорошо бы разбить:

if ((text.Contains("a") && text.Length > 8 && text.Length < 16)
 || vipText == true)
синтаксис ломы, а семантика -- порядок, правда ниxуя не понятно, что за задача имеет такой хрень