Re[10]: Еще один паттерн рефакторинга
От: FR  
Дата: 13.05.10 09:22
Оценка:
Здравствуйте, LaPerouse, Вы писали:


LP>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении.

LP>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.

Вообще-то foo = 1 это тоже функция
Re[11]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 09:31
Оценка:
Здравствуйте, FR, Вы писали:

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



LP>>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении.

LP>>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.

FR>Вообще-то foo = 1 это тоже функция


Именно.
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[11]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 09:32
Оценка:
Здравствуйте, FR, Вы писали:

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



LP>>Спор был как раз о том, являются ли "первоклассные функции" необходимым условием. Каждый остался при своем мнении.

LP>>Я не буду спорить на эту тему, потому что я и так уже развел флейм. Выскажу только свое мнение. Если бы они являлись необходимым условием, то любая функциональная программа обязана была бы использовать их. Даже foo = 1 был бы нефункциональным.

FR>Вообще-то foo = 1 это тоже функция


Да
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[3]: Еще один паттерн рефакторинга
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 13.05.10 11:56
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>т.е. Linq это вредное явление, которое не стоит использовать?

DG>идея в linq такая же, каркас оставляем, а мелочевку выносим наружу в виде делегатов.

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

Вы сами посмотрите, неужели после такого рефакторинга вы бы не поотбивали руки тому человеку, которые сие чудо сделал? Ведь, как правильно написал Влад, очень сложно въехать в смысл полученного кода.
Re[2]: Еще один паттерн рефакторинга
От: Lloyd Россия  
Дата: 13.05.10 11:59
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>Вот пытаюсь понять смысл получаемого кода, но пока не могу.


Это закаррированый $ из хаскеля.
Re[11]: Еще один паттерн рефакторинга
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 13.05.10 12:08
Оценка:
Здравствуйте, FR, Вы писали:

FR>Вообще-то foo = 1 это тоже функция


И каков ее тип?
Re[12]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 12:40
Оценка: +1
Здравствуйте, D. Mon, Вы писали:

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


FR>>Вообще-то foo = 1 это тоже функция


DM>И каков ее тип?


foo::Int
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[2]: Еще один паттерн рефакторинга
От: Alexander Polyakov  
Дата: 13.05.10 15:17
Оценка:
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-а будет заинтересованность, то я распишу более детально свое виденье этого функционала.

За пост спасибо! То, что такое есть, пусть и в урезанном виде, уже хорошо .
Re[3]: Еще один паттерн рефакторинга
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.05.10 15:33
Оценка: 8 (2)
Здравствуйте, Alexander Polyakov, Вы писали:

AP>Вначале обрадовался, хотел написать “Вау, супер! ” и в очередной раз порадоваться за ReSharper. Для примера из первого поста ReSharper, действительно, делает такой рефакторинг. Но, посмотрев поподробнее, увидел, что этот функционал сильно ограничен. Причем, причины этих ограничений не понятны. Обсуждаемый тип рефакторинга должен быть доступен везде, где доступен “Extract Method”.


Видимо, сейчас он сделан только для выражений. Написал предложение по расширению тут: http://youtrack.jetbrains.net/issue/RSRP-179533
Re[2]: Еще один паттерн рефакторинга
От: Alexander Polyakov  
Дата: 13.05.10 15:38
Оценка:
VD>Вот пытаюсь понять смысл получаемого кода, но пока не могу.
Какого рода/вида смысл вы хотите найти в коде? Я и в первоначальном (до рефакторинга) коде не вижу смысла. Куски кода были приведены лишь для демонстрации паттерна рефакторинга. Никакого дополнительного смысла я в эти куски кода не вкладывал.
Re[2]: Еще один паттерн рефакторинга
От: Alexander Polyakov  
Дата: 13.05.10 16:07
Оценка:
ST>Единственный разумный рефакторинг, который здесь направшивается — это классический Extract Method:
Я не предлагал использовать "Extract piece of code as parameter" взамен “Extract Method”.

Меня несколько удивило, где вы там узрели, что напрашивается “Extract Method”. По мне так из примера, вообще, не видна потребность в рефакторинге, и уж тем более какой метод рефакторинга надо использовать.

ST>Дав этому методу осмысленное имя, этот рефакторинг упрощает понимание и сопровождение, а название метода даст дополнительный контекст.

ST>Можно говорить о применении паттерна "Стратегия", но в таком случае никакой речи не может быть о таких делегатах, как Func<int, long, string> (ведь контекста в этом типе — ноль).
Да, я это тоже отмечал в своей практике. И поэтому написал:
1.

Опционально, вместо Func/Action можно вводить именованный делегат.
http://rsdn.ru/forum/philosophy/3803008.1.aspx

(это следовало написать в первом посте, но, к сожалению, в этом форме нельзя править посты)

2.

В дополнение к описанному методу рефакотринга, еще хочется Convert Delegate to Interface.
http://rsdn.ru/forum/philosophy/3803003.1.aspx

Re[13]: Еще один паттерн рефакторинга
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 13.05.10 16:20
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>foo::Int


В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?
Re[14]: Еще один паттерн рефакторинга
От: anton_t Россия  
Дата: 13.05.10 16:35
Оценка:
Здравствуйте, D. Mon, Вы писали:

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


LP>>foo::Int


DM>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?


Пустое множество в Int. Это в хаскеле так.
Re[3]: Еще один паттерн рефакторинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.05.10 16:52
Оценка:
Здравствуйте, Alexander Polyakov, Вы писали:

VD>>Вот пытаюсь понять смысл получаемого кода, но пока не могу.

AP>Какого рода/вида смысл вы хотите найти в коде? Я и в первоначальном (до рефакторинга) коде не вижу смысла. Куски кода были приведены лишь для демонстрации паттерна рефакторинга. Никакого дополнительного смысла я в эти куски кода не вкладывал.

Ну, так чтобы кто-то поддержал идею он должен понимать зачем все это надо. В общем, предложения надо обосновывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Еще один паттерн рефакторинга
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 13.05.10 17:31
Оценка:
Здравствуйте, anton_t, Вы писали:

LP>>>foo::Int


DM>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?


_>Пустое множество в Int. Это в хаскеле так.


Во что, простите?
Int = () -> Int = () -> () -> ..... ?
Re[16]: Еще один паттерн рефакторинга
От: anton_t Россия  
Дата: 13.05.10 18:43
Оценка: -1
Здравствуйте, D. Mon, Вы писали:

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


LP>>>>foo::Int


DM>>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?


_>>Пустое множество в Int. Это в хаскеле так.


DM>Во что, простите?

DM>Int = () -> Int = () -> () -> ..... ?

В хаскеле любое значение типа Int — это функция ()->Int.
Re[17]: Еще один паттерн рефакторинга
От: Lloyd Россия  
Дата: 13.05.10 19:12
Оценка:
Здравствуйте, anton_t, Вы писали:

DM>>Int = () -> Int = () -> () -> ..... ?


_>В хаскеле любое значение типа Int — это функция ()->Int.


А какой тип у значения, возвращаемого из этой функции?
Re[17]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 21:37
Оценка:
Здравствуйте, anton_t, Вы писали:

_>Здравствуйте, D. Mon, Вы писали:


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

LP>>>>>foo::Int
DM>>>>В какой системе типов Int — функция? Что у нее домен, что — кодомен? Что во что она отображает?
_>>>Пустое множество в Int. Это в хаскеле так.
DM>>Во что, простите?
DM>>Int = () -> Int = () -> () -> ..... ?
_>В хаскеле любое значение типа Int — это функция ()->Int.

Есть еще переменные типа Int
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[18]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 21:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


DM>>>Int = () -> Int = () -> () -> ..... ?

_>>В хаскеле любое значение типа Int — это функция ()->Int.
L>А какой тип у значения, возвращаемого из этой функции?

foo возвращает Int
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[16]: Еще один паттерн рефакторинга
От: LaPerouse  
Дата: 13.05.10 21:59
Оценка:
Здравствуйте, 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]
Социализм — это власть трудящихся и централизованная плановая экономика.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.