Re[2]: Какой код проще, лучше и почему
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.04.10 07:57
Оценка:
Здравствуйте, Undying, Вы писали:

U>Вот к примеру алгоритм определения прохождения расписания:



U>
U>


U>Объясните как такие задачи решать в чисто функциональном стиле?


Сходу сказать сложно. Я с такими алгОритмами начинаю с рефакторинга. После трех-четырех фаз рефакторинга код приобретает декларативный вид. Но опять же, должна быть мотивация этм заняться, ради эстетического удовлетворения я на такое не пойду.
Re[12]: Какой код проще, лучше и почему
От: Lloyd Россия  
Дата: 05.04.10 08:21
Оценка:
Здравствуйте, Undying, Вы писали:

L>>Тогда тем более непонятно зачем вводить FirstOrNull, если он не решает тех проблем, которые есть у FirstOrDefault.


U>Не понял ответа. Если разделять ситуации коллекция пуста и первый элемент коллекции null не требуется, то использовать функции FirstOrNull и FirstOrNullable безопасно, в отличии от функции FirstOrDefault.


А в чем отличие поведения FirstOrNull для reference-типов от FirstOrDefault?
Re[3]: Какой код проще, лучше и почему
От: Undying Россия  
Дата: 05.04.10 08:28
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

U>>Объясните как такие задачи решать в чисто функциональном стиле?


I>Сходу сказать сложно. Я с такими алгОритмами начинаю с рефакторинга. После трех-четырех фаз рефакторинга код приобретает декларативный вид. Но опять же, должна быть мотивация этм заняться, ради эстетического удовлетворения я на такое не пойду.


Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние. Если задача по своему условию требует сложного промежуточного состояния, то рефакторинг здесь помочь ничем не может. Вот мне и хотелось бы увидеть, как в чисто функциональном стиле решаются задачи со сложным промежуточным состоянием.
Re[13]: Какой код проще, лучше и почему
От: Undying Россия  
Дата: 05.04.10 09:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А в чем отличие поведения FirstOrNull для reference-типов от FirstOrDefault?


В том что если FirstOrNull подсунуть коллекцию структур компилятор выдаст ошибку, а FirstOrDefault это не просто проглотит, но и в рантайме ошибку мы получим не по месту внесения, а хрен знает где и когда.
Re[8]: Какой код проще, лучше и почему
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.04.10 09:25
Оценка:
Здравствуйте, Undying, Вы писали:

U>Т.е. если у нас есть коллекция int'ов, то ее надо явно преобразовывать в коллекцию Nullable<int>? Это очень удобно?


Обычно в запросе все равно есть проекция, в которой и можно к int? преобразовать заодно.

U>Функция FirstOrDefault в фрамеворке это ошибка дизайна, если бы вместо нее были бы функции FirstOrNull для коллекций классов и FirstOrNullable для коллекций структур, то проблем не было бы в принципе.


Ну так добавь, делов то.
... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
AVK Blog
Re[14]: Какой код проще, лучше и почему
От: Lloyd Россия  
Дата: 05.04.10 09:25
Оценка:
Здравствуйте, Undying, Вы писали:

L>>А в чем отличие поведения FirstOrNull для reference-типов от FirstOrDefault?


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


в чем отличие поведения FirstOrNull для reference-типов от FirstOrDefault?
Re[15]: Какой код проще, лучше и почему
От: Undying Россия  
Дата: 05.04.10 09:30
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>в чем отличие поведения FirstOrNull для reference-типов от FirstOrDefault?


Ни в чем. Для коллекций классов FirstOrDefault использовать можно.
Re[4]: 2AVK: С чем несогласен?
От: Undying Россия  
Дата: 05.04.10 10:20
Оценка:
Здравствуйте, Undying, Вы писали:

U>Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние. Если задача по своему условию требует сложного промежуточного состояния, то рефакторинг здесь помочь ничем не может. Вот мне и хотелось бы увидеть, как в чисто функциональном стиле решаются задачи со сложным промежуточным состоянием.


Ты считаешь, что задач со сложным промежуточным состоянием в природе не существует? Или что в функциональном стиле такие задачи решаются легко?

Если второе, то хотелось бы увидеть пример решения задачи со сложным промежуточным состоянием в функциональном стиле.
Re[4]: Какой код проще, лучше и почему
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.04.10 10:26
Оценка:
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, Ikemefula, Вы писали:


U>>>Объясните как такие задачи решать в чисто функциональном стиле?


I>>Сходу сказать сложно. Я с такими алгОритмами начинаю с рефакторинга. После трех-четырех фаз рефакторинга код приобретает декларативный вид. Но опять же, должна быть мотивация этм заняться, ради эстетического удовлетворения я на такое не пойду.


U>Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние. Если задача по своему условию требует сложного промежуточного состояния, то рефакторинг здесь помочь ничем не может.


Не понял идею.
Re[5]: 2AVK: С чем несогласен?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.04.10 11:00
Оценка:
Здравствуйте, Undying, Вы писали:

U>Ты считаешь, что задач со сложным промежуточным состоянием в природе не существует? Или что в функциональном стиле такие задачи решаются легко?


Я считаю, что в очень многих случаях сложное состояние удается отделить.
А не согласен я со следующим:

Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние.

... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
AVK Blog
Re[5]: Какой код проще, лучше и почему
От: Undying Россия  
Дата: 05.04.10 11:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

U>>Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние. Если задача по своему условию требует сложного промежуточного состояния, то рефакторинг здесь помочь ничем не может.


I>Не понял идею.


Например, по условию задачи нужно хранить следующие промежуточные состояния:

      int certifiedStationIndex = -1; //последняя остановка пройденная по расписанию
      StationIntervalWithIndex unexpectedInterval = null; //остановка пройденная вне очереди (если есть)
      Dictionary<Tuple2<int, DateTime>, bool> undoneArrivalIntervals = new Dictionary<Tuple2<int, DateTime>, bool>(); //остановки, на которые мы в текущий момент уже въехали, но еще из них не выехали


Объясни каким образом рефакторинг поможет избавиться от этих промежуточных состояний?
Re[6]: 2AVK: С чем несогласен?
От: Undying Россия  
Дата: 05.04.10 11:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Я считаю, что в очень многих случаях сложное состояние удается отделить.


А что делать в тех случаях (пусть немногих), в которых сложное состояние отделить не удается?

Пример функционального алгоритма работающего со сложным промежуточным состоянием ты привести можешь?

AVK>А не согласен я со следующим:

AVK>

AVK>Проблема сложных алгоритмов, что они имеют сложное промежуточное состояние.


Можно пример сложного алгоритма без сложного промежуточного состояния?
Re[6]: Какой код проще, лучше и почему
От: Silver_s Ниоткуда  
Дата: 05.04.10 11:59
Оценка:
Здравствуйте, Undying, Вы писали:
U>Объясни каким образом рефакторинг поможет избавиться от этих промежуточных состояний?

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

Например:Тут вот похоже два потока данных rawArrivals, rawDepartures, каждый оборот внутреннего цикла выдергивает и обрабатывает один элемент либо из первого либо из второго потока. Это уже можно вынести, в отдельную функцию возвращающую перечисление currentInterval, и если надо информацию откуда выдернуто.Небольшая но все-таки декомпозиция. Не факт что это сильно улучшит, остального кода я не видел (да и не стал бы разбираться с пол-тысячей строк).
Интересно было бы только время жизни этих данных. И есть ли какая-то топ-функция у который вполне конкретный вход и выход, которая вызывает остальные функции, и которая скрывает какие-то промежуточные данные(время жизни которых не выходит за пределы этой функции).
Re[2]: Какой код проще, лучше и почему
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.04.10 12:23
Оценка: +1
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, Ikemefula, Вы писали:


I>>Просьба вникнуть в код и найти потенциальные ошибки в каждом случае


U>Главная проблема чисто функционального подхода, что на нем непонятно как писать сложные алгоритмы.

U>Вот к примеру алгоритм определения прохождения расписания:
По человечески объясни что код делает, уверен что моментально напишут функциональное решение.
Re[7]: 2AVK: С чем несогласен?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.04.10 15:11
Оценка:
Здравствуйте, Undying, Вы писали:

U>А что делать в тех случаях (пусть немногих), в которых сложное состояние отделить не удается?


Ах, уже немногих. Это неколько контрастирует с исходным заявлением. Что делать? Думать. Серебрянной пули нет.

U>Можно пример сложного алгоритма без сложного промежуточного состояния?


В каком виде пример? Форматтер исходников в ешарпере сгодится?
... << RSDN@Home 1.2.0 alpha 4 rev. 1469 on Windows 7 6.1.7600.0>>
AVK Blog
Re[11]: Какой код проще, лучше и почему
От: Ziaw Россия  
Дата: 05.04.10 17:03
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>
I>GetRouting(selection).DisposeAll();
I>


Все методы во фреймворке для IEnumerable сделаны как:
1. по возможности ленивы
2. не меняющие состояние перечисления или объектов в нем (хотя это сложно запретить полностью и при большом желании поменять таки можно)

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

I>
I>if (GetRouting(selection).AtLeastOne())
I>


I>GetRouting — ленивая коллекция, обработка отдельно от сбора была сделана в тот момент, когда понадобилась проверка.

Это Any() изобретено чтоли?
Re[6]: Какой код проще, лучше и почему
От: Ziaw Россия  
Дата: 05.04.10 17:10
Оценка: 5 (1) +1
Здравствуйте, Ikemefula, Вы писали:

I>почему тогда не так ?


тогда уж

return items.FirstOrDefault(item => criteria.All(spec => spec.IsMetBy(item)));
Re[12]: Какой код проще, лучше и почему
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.04.10 18:21
Оценка:
Здравствуйте, Ziaw, Вы писали:

I>>
I>>if (GetRouting(selection).AtLeastOne())
I>>


I>>GetRouting — ленивая коллекция, обработка отдельно от сбора была сделана в тот момент, когда понадобилась проверка.

Z>Это Any() изобретено чтоли?

Примерно так да, я указал, что этого кода как бы нет, есть немного другой.
Re[12]: Какой код проще, лучше и почему
От: _FRED_ Черногория
Дата: 06.04.10 07:08
Оценка:
Здравствуйте, Ziaw, Вы писали:

I>>GetRouting(selection).DisposeAll();


Z>Все методы во фреймворке для IEnumerable сделаны как:

Z>1. по возможности ленивы
Z>2. не меняющие состояние перечисления или объектов в нем (хотя это сложно запретить полностью и при большом желании поменять таки можно)
Z>Создавая свои экстеншены которые выглядят и используются также как и библиотечные, но имеющие логику противоположную ленивости и иммутабельности вы рискуете быть непонятыми и люди пользующиеся вашими экстеншенами будут создавать больше ошибок. Lloyd правильно заметил, что не стоит смешивать получение данных и операции над ними. По этому поводу писал Липперт(емнип) и была бурная дискуссия в .NET.

ОК, а если тот же DisposeAll не является методом-расширением, то всё ОК?

DisposableHelper.DisposeAll(GetRouting(selection));


Help will always be given at Hogwarts to those who ask for it.
Re[9]: Какой код проще, лучше и почему
От: vdimas Россия  
Дата: 06.04.10 07:55
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Не прикидывайся, ты прекрасно знаешь что и почему было.


Пока что все знают, что не хуже до сих пор в очень многих разделах современного ПО. И смысл рекламировать тот или иной подход вообще, когда рассматриваются частности?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.