- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
// Было
string postCode;
if (person != null)
{
if (HasMedicalRecord(person) && person.Address != null)
{
CheckAddress(person.Address);
if (person.Address.PostCode != null)
postCode = person.Address.PostCode.ToString();
else
postCode = "UNKNOWN";
}
}
// Стало
string postCode = this.With(x => person)
.If(x => HasMedicalRecord(x))]
.With(x => x.Address)
.Do(x => CheckAddress(x))
.With(x => x.PostCode)
.Return(x => x.ToString(), "UNKNOWN");
"как можно использовать более “монадический” синтаксис в C# для того, чтобы __повысить удобочитаемость__ исходного кода"
http://www.gotdotnet.ru/blogs/nesteruk/6975/
впрочем, стало не менее читаемо
Задумка с chainable API хорошая, реализацию не могу оценить. В целом второй код нравится больше из-за меньшего цикломатического числа и "плоской структуры". Сарказм Sh1tM4ker'a по этому поводу мне непонятен.
Все проверки на null он делает только в методах with, такой вот стиль.
Насчет говнокода не согласен. Имхо чем короче и компактнее методы, тем лучше, что в принципе тут и показано.
Whith занимается проверкой на null, If проверяет необходимые условия, Do работает работу, return возвращает значение.
В принципе, в отдельных случаях вполне потребно.
Минусы, из-за которых в отличных от "отдельных случаях" такой метод использовать неудобно, описал автор статьи.
Из запоминающихся про отладку: "Поэтому во многих случаях мой метод работы с подобным интерфейсом такой: сначала я пишу его в “обычном” стиле, потом делаю отладку, и только когда я уверен что код работает я переписываю его в “монадическом” стиле."
Моё субъективное мнение:
Здесь ОК:
Здесь не ОК, лучше по-старинке:
Многострочные лямбды зло. Вынеси в отдельную функцию и здесь тоже будет ок.
Не всегда, по-моему. Зависит от количества строк и сложности структуры. В данном случае просто многострочная лямбда накладывается на многострочную цепочку монад, отсюда бардак. А если нужно какой-нибудь обработчик в две-три строки навесить, то вполне нормально это выглядит в виде лямбды.
ForEach
> Return
Map
DefaultIfEmpty
Велосипедистам нравятся свои велосипеды
Так что вы зря так, насчет велосипеда.
Насчет Map DefaultIfEmpty в статье прямо говорится, что return создан чисто для красоты.
Ты не поверишь, но после With IEnumerable там есть.
With(x => x.Address) - Ienumerable
Вернется либо null либо address
Только у велосипедистов.
Примерно так.
> .If(x => HasMedicalRecord(x))]
> If
Where
Достойно отдельного говнокода, так что примерно
возможно лучше.
И o забыл развернуть из IEnumerable:
SelectOrEmptyIfNull и EnumerableOfSingleOrEmptyIfNull также пишутся как композиция стандартных HOF
C другой стороны неймнинг в посте короткий и читабельный, а стандартный - длииноват.
С третьей стороны, метод ToString(Object o, String whenNull) - практически мастхев, всё-равно вы эту же статику лепите.
Потому я бы писал так:
В посте рассматривается операция с одной записью person, у которой есть одна запись address?
Эту задачу можно решить с помощью стандартного кода, а можно сделать его более удобочитаемым и приятным на вид. Оба кода делают одно и тоже, просто в первом случае создается решение в лоб, во втором человек проявляет некую изобретательность.
Ваше право использовать его способ или нет, но не надо называть его велосипедистом и городить вот эти костыли.
Огород нагородил любитель монадического синтаксиса. Использовать лямбды только чтобы покрыть проверкой одну переменную - глупо.
Даже @LispGovno понимает где есть один person, там могут быть миллионы.
> но не надо называть его велосипедистом и городить вот эти костыли.
Какие я горожу костыли? Где я назвал его велосипедом?
И с чего такая болезненная реакция "не надо называть его велосипедистом"? Вы автор штоле?
2) Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Туше мсье кот.
Я не понимаю Вас.
>Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Сумасшедий?
http://govnokod.ru/12969#comment176506
Где тут костыли, neeedle?!
2) Сам такой, я имел ввиду не код, а одобрение ленивого списка. В задаче идет проверка одного конкретного person'a, вы суете туда IEnumerable. Без мыла в жопу.
Я не использовал IEnumerable, равно как я не писал слова "велосипед". Опять вы спутали person.Address.
Ну сделал он ленивый список из одного элемента. И что? Оверхед:? Да использование лямбд уже оверхед. И написав => вы подписываетесь что вам плевать на оптимальность.
Я лишь сказал что не стоит минусовать человека только за то, что он использует стандартный интерфейс и функционал, вместо самописного и сделал код чуток универсальнее.
Тем более что в нике у него стоит LISP.
Это бессмысленно.
На Box ты хотел сказать?
YAGNI
Принцип «YAGNI» — процесс и принцип проектирования, при котором в качестве основной цели и/или ценности декларируется отказ от избыточной функциональности.
То есть не добавляй функционал к программе, который никому не нужен и не понадобится.
>не добавляй функционал к программе, который никому не нужен
Теперь ему осталось ответить только:
DRY
Don't replicate yourself
И не собирался. Если бы я создавал клонов, то они стали мне конкурентами. Лучше я единолично захвачу мир.