Лучшие практики / Альтернативы для обработки строк с акцентом на читаемость


Как личный привычка, я вообще предпочитаю использовать строку заменить и формат методы, наряду со строкой "узоры", вместо конкатенации строк и другие методы в большинстве языков, которыми я пользуюсь (обычно C# и JavaScript).

Например, если я хочу, чтобы генерировать URL с параметрами (c#), я использую:

string url = "page.aspx?id={id}&ref={ref}";
return url.Replace("{id}", id)
          .Replace("{referrer}", referrer);

// could also be expressed as
return "page.aspx?id={id}&ref={ref}".Replace("{id}", id)
                                    .Replace("{referrer}", referrer);

Вместо:

return "page.aspx?id=" + id + "&ref=" & referrer;

Или:

// StringBuilder is typically more efficient than string concatenation
StringBuiler sbUrl = new StringBuilder();
sbUrl.Append("page.aspx?");
sbUrl.AppendFormat("id={0}", id);
sbUrl.AppendFormat("ref={0}", referrer);
return sbUrl.ToString();

Я делаю то же самое в JavaScript:

function generateUrl(p1, p2) {
    return "page.aspx?1={0}&2={1}".replace("{0}", p1)
                                  .replace("{1}", p2);
}

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

// this would typically be stored in an XML or other configuration file as a "pattern"
string body = @"Dear {name}:<br />
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam blandit risus, quis imperdiet nibh congue quis.</p>
                <p>Pellentesque ullamcorper malesuada ante, ac auctor felis feugiat id. Etiam id eros convallis nisi feugiat tincidunt. Phasellus fringilla erat eu tortor egestas volutpat. Vestibulum in odio lorem, quis fringilla sapien.</p>
                <p>Sincerely,</p>
                <p class='sig'>{from-name}</p>";

return body.Replace("{name}", name).Replace("{from-name}", fName);

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

Мысли?



5220
7
задан 11 сентября 2011 в 09:09 Источник Поделиться
Комментарии
5 ответов

В C#, вы могли бы использовать встроенный в строку.Формате вместо:

string parameterizedUrl = "page.aspx?id={0}&ref={1}";
return string.Format(parameterizedUrl, id, referrer);

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

4
ответ дан 11 сентября 2011 в 09:09 Источник Поделиться

Я склоняюсь к строки формата.

Вы можете не встретить того, чтобы сделать локализацию, но некоторые инструменты понимания формате строк, который делает жизнь легче для переводчиков. Это гораздо более обычный c#.

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

2
ответ дан 11 сентября 2011 в 10:09 Источник Поделиться

Лично я бы пошел со строкой.Формат() подход, но я думаю, что вы должны использовать тот метод, который является более читаемым. Пытаясь скостить несколько микросекунд здесь и там не стоит снижению читаемости кода и/или ясности для других людей, читающих ваш код.

2
ответ дан 12 сентября 2011 в 05:09 Источник Поделиться

Я бы вместо этого использовать строку формата. Любой опытный программист не найдете ничего, трудно читать, когда с помощью строки форматирования. Хотя если у вас есть несколько аргументов для кратного аргумента (например, локализация строк), это может быть запутанным, со своими порядками или сколько он требует, но они должны быть достаточно документирована в любом случае. Жаль, что функции форматирования не так много, как в Python. Если вы не хотите использовать этот подход, по каким-то причинам, тогда, боюсь, вы питание к неправильной толпой по неправильным причинам ИМХО.

Кроме того, я знаю, вы сказали, что вы не хотите использовать это, но через строку.Функция concat() , скорее всего, будет самым быстрым и наиболее эффективным из этих подходов. Ничего не разобрать и не существует никаких промежуточных строк, вам нужно работать. Вы получите ваш заполните строки в одном кадре. Теперь я должен признать, это не самая красивая из синтаксисов и я тоже на время, но есть способы, чтобы сделать его немного более привлекательным. Но, по крайней мере, аргументы должны быть немедленно идентифицирована как они, как правило, не строковые константы, но и переменные (которые выделены по-разному в любой нормальной IDE).

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

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

например,

static string EmailText(string toName, string fromName)
{
return @"Dear " + toName + @":<br />
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam blandit risus, quis imperdiet nibh congue quis.</p>
<p>Pellentesque ullamcorper malesuada ante, ac auctor felis feugiat id. Etiam id eros convallis nisi feugiat tincidunt. Phasellus fringilla erat eu tortor egestas volutpat. Vestibulum in odio lorem, quis fringilla sapien.</p>
<p>Sincerely,</p>
<p class='sig'>" + fromName + @"</p>";
}

// then when you need it:
return EmailText(toName: "Bob", fromName: "Bill"); // named parameters optional but useful

2
ответ дан 12 сентября 2011 в 07:09 Источник Поделиться

Производительность-мудрый, вы уже так быстро, как вы можете получить без конкатенации строк или массив работы, как вы собираетесь получить, не используя их. (Как вы можете видеть здесь: http://jsperf.com/string-test5)

1
ответ дан 12 сентября 2011 в 03:09 Источник Поделиться