Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Проблема не в стиле, а в функции CheckAddress - можно проверку на null перенести в нее, и она должна возвращать bool. Тогда оба варианта станут гораздо более читаемыми.
Задумка с chainable API хорошая, реализацию не могу оценить. В целом второй код нравится больше из-за меньшего цикломатического числа и "плоской структуры". Сарказм Sh1tM4ker'a по этому поводу мне непонятен.
Узнал автора статьи про реализацию монады maybe на C#.
Все проверки на null он делает только в методах with, такой вот стиль.
Насчет говнокода не согласен. Имхо чем короче и компактнее методы, тем лучше, что в принципе тут и показано.
Whith занимается проверкой на null, If проверяет необходимые условия, Do работает работу, return возвращает значение.
Пока писал коммент про то, что читаемость не повысилась, привык к этому стилю и наметал глаз. Теперь выцепляет только нужное.
В принципе, в отдельных случаях вполне потребно.
Минусы, из-за которых в отличных от "отдельных случаях" такой метод использовать неудобно, описал автор статьи.
Из запоминающихся про отладку: "Поэтому во многих случаях мой метод работы с подобным интерфейсом такой: сначала я пишу его в “обычном” стиле, потом делаю отладку, и только когда я уверен что код работает я переписываю его в “монадическом” стиле."
> Многострочные лямбды зло.
Не всегда, по-моему. Зависит от количества строк и сложности структуры. В данном случае просто многострочная лямбда накладывается на многострочную цепочку монад, отсюда бардак. А если нужно какой-нибудь обработчик в две-три строки навесить, то вполне нормально это выглядит в виде лямбды.
> Вернется либо null либо address
Только у велосипедистов.
public static IEnumerable<TResult> With<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator)
where TResult : class where TInput : class
{
if (o == null) return Enumerable.Empty<TResult>();
return Enumerable.Repeat(evaluator(o), 1);
}
Не знаю кто гумна минусует, но здравое зерно в использовании стандартного ленивого спиcка (IEnumerable) есть.
C другой стороны неймнинг в посте короткий и читабельный, а стандартный - длииноват.
С третьей стороны, метод ToString(Object o, String whenNull) - практически мастхев, всё-равно вы эту же статику лепите.
Потому я бы писал так:
if ( person != null
&& person.Address != null
&& HasMedicalRecord(person)
){
CheckAddress(person.Address);
return ToString(person.Address.PostCode,"UNKNOWN");
}
Какой IEnumerable, вы чего городите огород?
В посте рассматривается операция с одной записью person, у которой есть одна запись address?
Эту задачу можно решить с помощью стандартного кода, а можно сделать его более удобочитаемым и приятным на вид. Оба кода делают одно и тоже, просто в первом случае создается решение в лоб, во втором человек проявляет некую изобретательность.
Ваше право использовать его способ или нет, но не надо называть его велосипедистом и городить вот эти костыли.
>Какой IEnumerable, вы чего городите огород?
Огород нагородил любитель монадического синтаксиса. Использовать лямбды только чтобы покрыть проверкой одну переменную - глупо.
Даже @LispGovno понимает где есть один person, там могут быть миллионы.
> но не надо называть его велосипедистом и городить вот эти костыли.
Какие я горожу костыли? Где я назвал его велосипедом?
И с чего такая болезненная реакция "не надо называть его велосипедистом"? Вы автор штоле?
1) Да все это понимают. Вы значение слова "пример" понимаете?
2) Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Туше мсье кот.
>Вы значение слова "пример" понимаете?
Я не понимаю Вас.
>Обычный костыли. Самые настоящие костыли. Вы подстраиваете задачу под код, а не код под задачу.
Сумасшедий? http://govnokod.ru/12969#comment176506
Где тут костыли, neeedle?!
1) Ну видимо и не поймешь.
2) Сам такой, я имел ввиду не код, а одобрение ленивого списка. В задаче идет проверка одного конкретного person'a, вы суете туда IEnumerable. Без мыла в жопу.
>вы суете туда IEnumerable
Я не использовал IEnumerable, равно как я не писал слова "велосипед". Опять вы спутали person.Address.
Ну сделал он ленивый список из одного элемента. И что? Оверхед:? Да использование лямбд уже оверхед. И написав => вы подписываетесь что вам плевать на оптимальность.
Я лишь сказал что не стоит минусовать человека только за то, что он использует стандартный интерфейс и функционал, вместо самописного и сделал код чуток универсальнее.
Тем более что в нике у него стоит LISP.
CheckAddress меня смущает, подозреваю, что он кидает исключение в случае невалидного адреса. Как-то не очень вписывается в контекстный способ "мочаливой" обработки ошибок.
Что это ты в меня кисом тычишь? А когда вдруг в модуле проекта понадобится функционал Box, а он обязательно понадобится в большом проекте, то ты во всем проекте Оптин на Бокс будешь заменять?
Принцип «YAGNI» — процесс и принцип проектирования, при котором в качестве основной цели и/или ценности декларируется отказ от избыточной функциональности.
То есть не добавляй функционал к программе, который никому не нужен и не понадобится.
>декларируется отказ от избыточной функциональности.
>не добавляй функционал к программе, который никому не нужен Теперь ему осталось ответить только:
DRY
Я повторился на тот случай, если он не способен понять. Don't replicate yourself
И не собирался. Если бы я создавал клонов, то они стали мне конкурентами. Лучше я единолично захвачу мир.
впрочем, стало не менее читаемо
Задумка с 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
И не собирался. Если бы я создавал клонов, то они стали мне конкурентами. Лучше я единолично захвачу мир.