- 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/
someone 07.05.2013 10:25 # +8
tirinox 07.05.2013 12:36 # −2
vse_govno 07.05.2013 13:35 # 0
Lure Of Chaos 07.05.2013 15:58 # 0
впрочем, стало не менее читаемо
scriptin 07.05.2013 16:11 # +3
Задумка с chainable API хорошая, реализацию не могу оценить. В целом второй код нравится больше из-за меньшего цикломатического числа и "плоской структуры". Сарказм Sh1tM4ker'a по этому поводу мне непонятен.
Steex 07.05.2013 22:41 # 0
neeedle 08.05.2013 07:40 # +2
Все проверки на null он делает только в методах with, такой вот стиль.
Насчет говнокода не согласен. Имхо чем короче и компактнее методы, тем лучше, что в принципе тут и показано.
Whith занимается проверкой на null, If проверяет необходимые условия, Do работает работу, return возвращает значение.
Sh1tM4ker 08.05.2013 10:43 # 0
В принципе, в отдельных случаях вполне потребно.
Минусы, из-за которых в отличных от "отдельных случаях" такой метод использовать неудобно, описал автор статьи.
Из запоминающихся про отладку: "Поэтому во многих случаях мой метод работы с подобным интерфейсом такой: сначала я пишу его в “обычном” стиле, потом делаю отладку, и только когда я уверен что код работает я переписываю его в “монадическом” стиле."
Моё субъективное мнение:
Здесь ОК:
Здесь не ОК, лучше по-старинке:
LispGovno 08.05.2013 11:30 # 0
Многострочные лямбды зло. Вынеси в отдельную функцию и здесь тоже будет ок.
Steex 08.05.2013 12:11 # 0
Не всегда, по-моему. Зависит от количества строк и сложности структуры. В данном случае просто многострочная лямбда накладывается на многострочную цепочку монад, отсюда бардак. А если нужно какой-нибудь обработчик в две-три строки навесить, то вполне нормально это выглядит в виде лямбды.
LispGovno 08.05.2013 08:29 # +1
ForEach
> Return
Map
DefaultIfEmpty
Велосипедистам нравятся свои велосипеды
neeedle 08.05.2013 10:03 # 0
Так что вы зря так, насчет велосипеда.
Насчет Map DefaultIfEmpty в статье прямо говорится, что return создан чисто для красоты.
LispGovno 08.05.2013 11:28 # 0
Ты не поверишь, но после With IEnumerable там есть.
neeedle 08.05.2013 12:08 # 0
LispGovno 08.05.2013 12:25 # −1
With(x => x.Address) - Ienumerable
neeedle 08.05.2013 12:30 # 0
Вернется либо null либо address
LispGovno 08.05.2013 13:01 # 0
Только у велосипедистов.
Примерно так.
LispGovno 08.05.2013 13:03 # −1
> .If(x => HasMedicalRecord(x))]
> If
Where
LispGovno 08.05.2013 13:08 # −1
Достойно отдельного говнокода, так что примерно
возможно лучше.
И o забыл развернуть из IEnumerable:
LispGovno 08.05.2013 13:09 # −1
LispGovno 08.05.2013 13:39 # 0
SelectOrEmptyIfNull и EnumerableOfSingleOrEmptyIfNull также пишутся как композиция стандартных HOF
3.14159265 08.05.2013 14:45 # +2
C другой стороны неймнинг в посте короткий и читабельный, а стандартный - длииноват.
С третьей стороны, метод ToString(Object o, String whenNull) - практически мастхев, всё-равно вы эту же статику лепите.
Потому я бы писал так:
neeedle 08.05.2013 19:37 # 0
В посте рассматривается операция с одной записью person, у которой есть одна запись address?
Эту задачу можно решить с помощью стандартного кода, а можно сделать его более удобочитаемым и приятным на вид. Оба кода делают одно и тоже, просто в первом случае создается решение в лоб, во втором человек проявляет некую изобретательность.
Ваше право использовать его способ или нет, но не надо называть его велосипедистом и городить вот эти костыли.
3.14159265 08.05.2013 20:18 # +1
Огород нагородил любитель монадического синтаксиса. Использовать лямбды только чтобы покрыть проверкой одну переменную - глупо.
Даже @LispGovno понимает где есть один person, там могут быть миллионы.
> но не надо называть его велосипедистом и городить вот эти костыли.
Какие я горожу костыли? Где я назвал его велосипедом?
И с чего такая болезненная реакция "не надо называть его велосипедистом"? Вы автор штоле?
neeedle 08.05.2013 20:31 # 0
2) Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Туше мсье кот.
3.14159265 08.05.2013 20:41 # 0
Я не понимаю Вас.
>Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Сумасшедий?
http://govnokod.ru/12969#comment176506
Где тут костыли, neeedle?!
neeedle 09.05.2013 07:21 # 0
2) Сам такой, я имел ввиду не код, а одобрение ленивого списка. В задаче идет проверка одного конкретного person'a, вы суете туда IEnumerable. Без мыла в жопу.
3.14159265 10.05.2013 15:32 # +3
Я не использовал IEnumerable, равно как я не писал слова "велосипед". Опять вы спутали person.Address.
Ну сделал он ленивый список из одного элемента. И что? Оверхед:? Да использование лямбд уже оверхед. И написав => вы подписываетесь что вам плевать на оптимальность.
Я лишь сказал что не стоит минусовать человека только за то, что он использует стандартный интерфейс и функционал, вместо самописного и сделал код чуток универсальнее.
Тем более что в нике у него стоит LISP.
neeedle 10.05.2013 17:03 # 0
Это бессмысленно.
roman-kashitsyn 09.05.2013 13:19 # +3
LispGovno 09.05.2013 21:17 # 0
На Box ты хотел сказать?
roman-kashitsyn 09.05.2013 22:22 # 0
LispGovno 09.05.2013 22:40 # 0
scriptin 09.05.2013 23:46 # 0
LispGovno 10.05.2013 11:48 # −3
roman-kashitsyn 10.05.2013 12:10 # +1
LispGovno 10.05.2013 13:31 # 0
scriptin 10.05.2013 14:25 # +1
YAGNI
LispGovno 10.05.2013 15:06 # −2
Принцип «YAGNI» — процесс и принцип проектирования, при котором в качестве основной цели и/или ценности декларируется отказ от избыточной функциональности.
То есть не добавляй функционал к программе, который никому не нужен и не понадобится.
3.14159265 10.05.2013 15:14 # +2
>не добавляй функционал к программе, который никому не нужен
Теперь ему осталось ответить только:
DRY
LispGovno 10.05.2013 15:34 # 0
Don't replicate yourself
И не собирался. Если бы я создавал клонов, то они стали мне конкурентами. Лучше я единолично захвачу мир.