Как разбить длинные строки кода. (Пример: результаты вызова метода добавлены в список.)


Часто я создавать длинные строки кода, такие как следующие...

shippedItems.AddRange(OrderItem.Fetch(market: this.MARKET, shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE, orderPlacedAfter: serverTime.AddDays(-7), orderPlacedBefore: serverTime.AddHours(-85)));

... которая добавляет результаты вызова метода в существующий список.

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

  • Оставить все на одной линии и обертывание редактора, где он чувствует себя лучше.
  • Положим даже shippedItems.AddRange( на отдельной строке.

Хотя с течением времени я чувствую, что ясность и читаемость кода, который я пишу улучшилось, и будем надеяться, по иным причинам, то пробел-я никогда и не примирилась с тем, как переносить длинные строки.

Я буду голосовать любой ответ, который не включает в качестве решения:

  • более короткие имена переменных.
  • игнорируя именованные параметры (по крайней мере для этого примера).
  • создание переменные, используемые только один раз.


55367
9
c#
задан 14 февраля 2011 в 03:02 Источник Поделиться
Комментарии
7 ответов

Я хотел разбить это что-то вроде этого:

shippedItems.AddRange(
OrderItem.Fetch(market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)));

В зависимости от предыдущего отступа, некоторые линии может течь по "максимальная длина линии", но я думаю, что символов в строке это предложение и есть хорошие времена, чтобы нарушить это правило, поскольку его нарушение приводит к тому, что код будет более читабельным, чем код, который не.

Правила, которые я считаю полезными:


  • Новая линия после открытого парень.

  • Разрывы строк после запятых.

  • Отступ внутренние вызовы метода.

  • Строка параметров в метод, что на новой линии.

  • Перерыв "максимальная длина строки" правила, если это означает, что код более читабельным.

22
ответ дан 14 февраля 2011 в 03:02 Источник Поделиться

В дополнение к @Томас Оуэнс, еще одно правило лично мне нравится, чтобы следовать:


  • Либо поставить все параметры для метода на той же линии, или положить каждый параметр на отдельной строке.

Так что я хотел бы написать код, как показано ниже. Мне нравится это, потому что это делает чтение параметров более последовательным, а не отступ их так далеко.

shippedItems.AddRange(
OrderItem.Fetch(
market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)));

12
ответ дан 14 февраля 2011 в 04:02 Источник Поделиться

Интересно посмотреть на спектр ответов. Я бы другой ответ от любого из них до сих пор:

shippedItems.AddRange(OrderItem.Fetch(
market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)
));

Меня читает больше интуитивно, как "добавить извлечена товары для shippedItems, используя следующий блок параметров, чтобы извлекать".

Один совет от кого-то, кто прошел через тот же дилемма сейчас: не пытайтесь ставить правила на нем. Принимать каждый пример на своей собственной заслуге, и попробовать писать так, как вы хотели бы, чтобы это было написано, если бы Вы были кто-то еще пытается выяснить, что он делает.

Иногда это хорошая идея, чтобы использовать-один раз переменную, чтобы сделать что-то более читаемым. Например, если AddRange выше был второй аргумент, куда бы ты его положил? Даже в этом простом случае плохо читает

shippedItems.AddRange(
OrderItem.Fetch(
market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)
),
2
);

Однако, это читает просто отлично

var orderItems = OrderItem.Fetch(
market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)
);
shippedItems.AddRange(orderItems, 2);

Каждого случая на его собственных заслуг.

8
ответ дан 15 февраля 2011 в 12:02 Источник Поделиться

Это может быть признаком того, что вы должны вынесем принести в новый способ:

....
shippedItems.AddRange( LastWeeksMarketItems() );
....

private OrderItems LastWeeksMarketItems ()
{
return OrderItem.Fetch(market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85));
}

Имя метода дает вам дополнительную ясность о том, что вы пытаетесь добавить.

3
ответ дан 16 февраля 2011 в 04:02 Источник Поделиться

Вот что я бы сделал:

shippedItems.AddRange(
OrderItem.Fetch(market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85))
);

Я чувствую, что просто как со скобками ({}) закрывающие скобки должны быть на отдельной строке при вызове метода занимает несколько строк. Это мне кажется более последовательным.

Кроме того, можно выстроить :с:

market:           this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE

но что это трудно поддерживать.

Другой вариант:

shippedItems.AddRange(OrderItem.Fetch(market: this.MARKET,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85)));

Что используется меньше линий, но уже по горизонтали. Кроме того, на первый взгляд это выглядит как аргументы в AddRange, не принести.

2
ответ дан 14 февраля 2011 в 04:02 Источник Поделиться

Я думаю, что вы неразумно отвергать создание переменная используется только один раз. Принудительные разрывы строк вы, кажется, запрашивая трудно, если не невозможно реализовать в эстетически приемлемый способ автоматического форматирования - и если вы не используете автоматизированных форматирования, вы тратите время.

var state = ORDERITEMSHIPCONFIRMSTATE.NONE;
var start = serverTime.AddDays(-7);
var end = serverTime.AddHours(-85);
var range = OrderItem.Fetch(market: MARKET, shipConfirmState: state, orderPlacedAfter: start, orderPlacedBefore: end);
shippedItems.AddRange(range);

0
ответ дан 19 февраля 2011 в 03:02 Источник Поделиться

Мне очень нравится Mongus понг ответ, но у меня есть несколько вещей, чтобы добавить.


  • Название извлеченный метод должен отражать действительное значение магических чисел (-7 и -85) внутри метода.

  • Сами магические цифры, вероятно, должен быть превращен в именованных констант, для большей ясности.

  • Извлеченный метод следует положить, где она принадлежит. Я хотел бы предложить, используя репозиторий шаблон, но в данном конкретном случае он, вероятно, будет хорошая идея, чтобы положить его рядом с принести метод, внутри OrderItem класс. (В OrderItem класс выглядит как сущности для меня, так это сломать ПСП, но я отвлекся.)

  • Если все случаи использования выборки могут быть заменены такими же методами, принести в конечном счете может быть непубличным.

Что-то вроде этого:

shippedItems.AddRange(OrderItem.FetchLastWeeksOrderItems(MARKET, serverTime));

public class OrderItem
{
public static IEnumerable<OrderItem> FetchLastWeeksOrderItems(
string market, DateTime serverTime)
{
return OrderItem.Fetch(
market: market,
shipConfirmState: ORDERITEMSHIPCONFIRMSTATE.NONE,
orderPlacedAfter: serverTime.AddDays(-7),
orderPlacedBefore: serverTime.AddHours(-85));
}

private static IEnumerable<OrderItem> Fetch( ... )
{
...
}
}

0
ответ дан 21 февраля 2011 в 11:02 Источник Поделиться