LP>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении. LP>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, LaPerouse, Вы писали:
LP>>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении. LP>>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.
FR>Вообще-то foo = 1 это тоже функция
Именно.
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, LaPerouse, Вы писали:
LP>>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении. LP>>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.
FR>Вообще-то foo = 1 это тоже функция
Да
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, DarkGray, Вы писали:
DG>т.е. Linq это вредное явление, которое не стоит использовать? DG>идея в linq такая же, каркас оставляем, а мелочевку выносим наружу в виде делегатов.
Нет конечно. Речь шла о _данном_конкретном_случае_. Я специально выделил (может не стоило выделять подчеркиванием, а выделить посильнее). Еще раз повторюсь: все написанное мною в предыдущем сообщении касается данного конкретного случая, это не касается ни какого другого случая (в котором, возможно, такой рефакториг будет играть положительную роль) и уж тем более я не имел ввиду библиотеки, правила построения которых коренным образом отличаются от построения бизнес-приложений.
Вы сами посмотрите, неужели после такого рефакторинга вы бы не поотбивали руки тому человеку, которые сие чудо сделал? Ведь, как правильно написал Влад, очень сложно въехать в смысл полученного кода.
N>ReSharper это давно умеет. Рефакторинг Introduce Parameter, опция 'Select local variables to En-lambda'.
Вначале обрадовался, хотел написать “Вау, супер! ” и в очередной раз порадоваться за ReSharper. Для примера из первого поста ReSharper, действительно, делает такой рефакторинг. Но, посмотрев поподробнее, увидел, что этот функционал сильно ограничен. Причем, причины этих ограничений не понятны. Обсуждаемый тип рефакторинга должен быть доступен везде, где доступен “Extract Method”. На эту тему я писал тут:
В принципе, данный метод рефакторинга почти полностью укладывается в простую последовательность широко используемых методов рефакторинга:
1. Extract method.
2. Ручное объявление переменной типа Func и присвоение ей значения равного методу.
3. Применение к переменной рефакторинга Introduce Parameter.
4. Inline method. http://rsdn.ru/forum/philosophy/3803008.1.aspx
“Extract Method” доступен, а описанный в первом посте рефакторинг нельзя вызвать, поскольку пункт “Introduce Parameter…” задизайблен?
Могу высказать свою догадку о том, что при дизайне этой функциональности пошли от “Introduce Parameter”. А описанный в первом посте тип рефакторинга “Excract piece of code as parameter” ближе к “Extract Method”.
Если со стороны разработчиков ReSharper-а будет заинтересованность, то я распишу более детально свое виденье этого функционала.
За пост спасибо! То, что такое есть, пусть и в урезанном виде, уже хорошо .
Здравствуйте, Alexander Polyakov, Вы писали:
AP>Вначале обрадовался, хотел написать “Вау, супер! ” и в очередной раз порадоваться за ReSharper. Для примера из первого поста ReSharper, действительно, делает такой рефакторинг. Но, посмотрев поподробнее, увидел, что этот функционал сильно ограничен. Причем, причины этих ограничений не понятны. Обсуждаемый тип рефакторинга должен быть доступен везде, где доступен “Extract Method”.
VD>Вот пытаюсь понять смысл получаемого кода, но пока не могу.
Какого рода/вида смысл вы хотите найти в коде? Я и в первоначальном (до рефакторинга) коде не вижу смысла. Куски кода были приведены лишь для демонстрации паттерна рефакторинга. Никакого дополнительного смысла я в эти куски кода не вкладывал.
ST>Единственный разумный рефакторинг, который здесь направшивается — это классический Extract Method:
Я не предлагал использовать "Extract piece of code as parameter" взамен “Extract Method”.
Меня несколько удивило, где вы там узрели, что напрашивается “Extract Method”. По мне так из примера, вообще, не видна потребность в рефакторинге, и уж тем более какой метод рефакторинга надо использовать.
ST>Дав этому методу осмысленное имя, этот рефакторинг упрощает понимание и сопровождение, а название метода даст дополнительный контекст. ST>Можно говорить о применении паттерна "Стратегия", но в таком случае никакой речи не может быть о таких делегатах, как Func<int, long, string> (ведь контекста в этом типе — ноль).
Да, я это тоже отмечал в своей практике. И поэтому написал:
1.
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, LaPerouse, Вы писали:
LP>>foo::Int
DM>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?
Здравствуйте, Alexander Polyakov, Вы писали:
VD>>Вот пытаюсь понять смысл получаемого кода, но пока не могу. AP>Какого рода/вида смысл вы хотите найти в коде? Я и в первоначальном (до рефакторинга) коде не вижу смысла. Куски кода были приведены лишь для демонстрации паттерна рефакторинга. Никакого дополнительного смысла я в эти куски кода не вкладывал.
Ну, так чтобы кто-то поддержал идею он должен понимать зачем все это надо. В общем, предложения надо обосновывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, anton_t, Вы писали:
LP>>>foo::Int
DM>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?
_>Пустое множество в Int. Это в хаскеле так.
Во что, простите?
Int = () -> Int = () -> () -> ..... ?
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, anton_t, Вы писали:
LP>>>>foo::Int
DM>>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?
_>>Пустое множество в Int. Это в хаскеле так.
DM>Во что, простите? DM>Int = () -> Int = () -> () -> ..... ?
В хаскеле любое значение типа Int — это функция ()->Int.
Здравствуйте, anton_t, Вы писали:
_>Здравствуйте, D. Mon, Вы писали:
DM>>Здравствуйте, anton_t, Вы писали: LP>>>>>foo::Int DM>>>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает? _>>>Пустое множество в Int. Это в хаскеле так. DM>>Во что, простите? DM>>Int = () -> Int = () -> () -> ..... ? _>В хаскеле любое значение типа Int — это функция ()->Int.
Есть еще переменные типа Int
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, anton_t, Вы писали:
DM>>>Int = () -> Int = () -> () -> ..... ? _>>В хаскеле любое значение типа Int — это функция ()->Int. L>А какой тип у значения, возвращаемого из этой функции?
foo возвращает Int
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, anton_t, Вы писали: LP>>>>foo::Int DM>>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает? _>>Пустое множество в Int. Это в хаскеле так. DM>Во что, простите? DM>Int = () -> Int = () -> () -> ..... ?
Алгоритм сопоставления переменных и их типов из сигнатуры функции следующий.
Type_array — массив типов из сигнатуры функции, в котором типы идут в том же порядке, что и в записи сигнатуры функции
Var_array = [var_1, var_2, ... var_n, Result], где var_i — переменная номер i в определении функции, Result — результат, возвращаемый функцией. Если определение функции не содержит входных переменных (как в случае foo), то Var_array=[Result]
Тогда Var_array[i] имеет тип Type_array[i]
Социализм — это власть трудящихся и централизованная плановая экономика.