контекст
В Чистом коде , на странице 35, написано
Это подразумевает, что блоки внутри операторов if, операторов else, операторов while и т. Д. Должны быть длиной в одну строку. Вероятно, эта строка должна быть вызовом функции. Это не только уменьшает объем включаемой функции, но также добавляет документальное значение, поскольку функция, вызываемая внутри блока, может иметь приятное описательное имя.
Я полностью согласен, это имеет большой смысл.
Позже, на странице 40, говорится об аргументах функции
Идеальное число аргументов для функции равно нулю (niladic). Далее следует одно (монадическое), за которым следует два (диадическое). По возможности следует избегать трех аргументов (триадных). Более трех (полиадических) требует особого обоснования, и их не следует использовать в любом случае. Аргументы жесткие. Они берут много концептуальной силы.
Я полностью согласен, это имеет большой смысл.
вопрос
Однако, довольно часто я создаю список из другого списка, и мне придется жить с одним из двух зол.
Либо я использую две строки в блоке , одну для создания вещи, одну для добавления ее к результату:
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
Flurp flurp = CreateFlurp(badaBoom);
flurps.Add(flurp);
}
return flurps;
}
Или я добавляю аргумент в функцию для списка, в который будет добавлена вещь, что делает ее «на один аргумент хуже».
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Вопрос
Есть ли (не) преимущества, которых я не вижу, которые делают одно из них предпочтительным в целом? Или есть такие преимущества в определенных ситуациях; в таком случае, что я должен искать при принятии решения?
f(g(x))
против вашего руководства по стилю, ну, я не могу исправить ваше руководство по стилю. Я имею в виду, ты тоже не разбиваешься sqrt(x*x + y*y)
на четыре строки? И это три (!) Вложенных подвыражения на двух (!) Внутренних уровнях вложенности (задыхаясь!). Ваша цель должна быть удобочитаемость , а не операторы одного оператора. Если вы хотите позже, у меня есть идеальный язык для вас: Ассемблер.
mov
инструкции x86 и одну jmp toStart
в конце. Кто-то на самом деле сделал компилятор, который делает именно это: D
rlwimi
инструкции на КПП. (Это означает «Поворот левой вставки слова немедленной маски».) Эта команда приняла не менее пяти операндов (два регистра и три непосредственных значения) и выполнила следующие операции: содержимое одного регистра было повернуто с помощью немедленного сдвига, маска была созданный с одним прогоном из 1 бита, который контролировался двумя другими непосредственными операндами, и биты, которые соответствовали 1 биту в этой маске в другом операнде регистра, были заменены соответствующими битами повернутого регистра. Очень крутая инструкция :-)
flurps.Add(CreateFlurp(badaBoom));
?