Roman
которые достаточно гибкие, учитывая паршл аппликейшн
Roman
Я посмотрел доклад про Dependency rejection от Марка Симанна или как его там. На его примере выглядит вполне неплохо, хотя пример очень скромен в объеме
gsomix
которые достаточно гибкие, учитывая паршл аппликейшн
Ну да, у тебя все кишки вылезут в сигнатуры функций, потом ты их будешь прятать через частичное применение.
gsomix
Я посмотрел доклад про Dependency rejection от Марка Симанна или как его там. На его примере выглядит вполне неплохо, хотя пример очень скромен в объеме
Но у него же про другое. У тебя просто DI на частичном применении, а у него про разделение чистого кода без зависимостей и всего остального.
Roman
Ну да, у тебя все кишки вылезут в сигнатуры функций, потом ты их будешь прятать через частичное применение.
Верно. Но тут есть бонус — у тебя работает навигация по коду, и все заисимости отслеживаются в компайл тайме.
gsomix
Верно. Но тут есть бонус — у тебя работает навигация по коду, и все заисимости отслеживаются в компайл тайме.
Дак ты можешь того же эффекта добиться с помощью DI через инжект руками в конструкторе объекта.
gsomix
:)
Roman
Но у него же про другое. У тебя просто DI на частичном применении, а у него про разделение чистого кода без зависимостей и всего остального.
У него и про то, и про другое. Но сквозь все это проходит Dependency rejection. Про разделение чистого от нечистого он уже во второй части начал, когда не смог на хаскель портировать
Roman
Дак ты можешь того же эффекта добиться с помощью DI через инжект руками в конструкторе объекта.
Ну вот реальный опыт показывает, что не всегда. Когда начинаются сумасшедшие дженерики и иерархия наследования
Roman
я-то и не наследую. Оно блять до меня уже так унаследовано, что мне только щепотку базилика добавить остается
Vasily
К сожалению, наследование такой общепринятый паттерн в сишарпе
Vasily
И используют его странно
gsomix
Нет.
У него суть в том, что DI -- это не функционально (даже через час исное применение). Он показывает это на примере Haskell, а потом переходит к Deoendency Rejection.
gsomix
Ну, короче, детали реализации не очень интересные. Есть разные способы управления зависимостями, и, кажется, просто протаскивать их через аргументы функции -- один из самых неудобных методов.
Roman
Глобально о том, что ООП не подходит для сегодняшних задач. Локально об управлении зависимостями в сишарпе и фшарпе
Roman
я возможно не однозначно выразился
Vasily
Ну я бы сказал, что подходы, применимые в сишарп,не слишком применимы в фшарп
Roman
Я не к тому, что ООП устарело и его пора на свалку и ФП ололо будущее. Я к тому, что организовывать логику поведения через объекты неправильно, и что объекты нужны для другого
Vasily
В с# берут одну сущность и начинают на неё накручивать всякого
Vasily
Отсюда di и прочее
Roman
Почему через модули ML, например, правильно, а через объекты -- нет?
Ну я выше объяснял, почему. Но это, конечно, все еще только мое мнение
gsomix
А про настоящие first-class модули в ML.
Roman
Пушто логически сервис — это блок функций. А технически — объект. Из-за такого несоответствия идеи и реализации всегда возникают проблемы
Vasily
Технически это тоже функция
Vasily
С набором стейтов
Roman
А про настоящие first-class модули в ML.
Там нет псевдо-состояния. Там чистые функции используют чистые функции в идеале
Roman
Технически это тоже функция
как это? public class MyService же, с конструктором, временем жизни и всем остальным
Roman
Я на самом деле разобраться хочу, а не просто поспорить ради спора
Vasily
Класс это способ группировки в общем-то
Vasily
Т.е. я группирую набор функций по определенному признаку
Ayrat
А давайте в качестве бреда предположим что класс это стейт + набор функций его мутирующих (+ сайд эффекты). И чтобы каждый раз это не рассказывать, можно сказать слово класс!
Ayrat
ничего плохого в классах я кстати не вижу. Пользуюсь ими. Гораздо реже чем когда писал на C#, но пользуюсь
Vasily
Но потом мне начинает хотеться добавить стейт и получается то, что ваше Ayrat написал
Bonart
С функциями проще, но кое-что на классах получается лучше
gsomix
Там нет псевдо-состояния. Там чистые функции используют чистые функции в идеале
Нет. Суть в параметризации. И модули ML, и объекты ты можешь параметризовать. Это делает их пригодными для задач DI.
gsomix
Модули в F# не параметризуются.
gsomix
Короче, довольно странно, что все хейтят ООП, когда в F# — это основной способ делать нормальные абстракции.
gsomix
Как раз за счет того, что объекты параметризуются.
gsomix
Можно даже мутабельный стейт и наследование не делать.
Bonart
Это как всегда - хейтят почему-то инструмент, а не кривизну собственных рук
gsomix
+
Roman
я не хейтил ООП ни разу сейчас, есличо
Bonart
я не хейтил ООП ни разу сейчас, есличо
Зато про DI написал много прочувствованных слов :)
Ayrat
Короче, довольно странно, что все хейтят ООП, когда в F# — это основной способ делать нормальные абстракции.
Я за себя скажу (хоть ты и не обращался ко мне лично) что я хейчу бездумное ООП. Равно как я хейчу бездумное ФП. Мне лично кажется вырвиглазным дот-фри нотация в её экстремуме. Я лично именно потому и полюбил F# потому что он позволяет говнокодить при необходимости. А работа обычно без говнокода не обходится Вместо того чтобы думать какую бы абстракцию навернуть в хаскеле чтобы на консольку распечатать (я утрирую, но всё же), я просто печатаю в консольку
Roman
Да. Я не исключаю, что DI активно абьюзится на моем проекте, но что бы там кто ни говорил — DI фреймворки это сложная штука, в первую очередь из-за богатства функционала. И у меня есть подозрение, что они стали такими сложными, пушто люди с помощью объектов решают то, что разумнее решать с помощью функций/параметризуемых модулей и тд
gsomix
Это дело привычки, наверное?
gsomix
И правильного использования.
Roman
вот я и хочу разобраться
Roman
прежде, чем выступать с докладом про фшарп)
Anonymous
А давайте в качестве бреда предположим что класс это стейт + набор функций его мутирующих (+ сайд эффекты). И чтобы каждый раз это не рассказывать, можно сказать слово класс!
если мы находимся в терминологических понятиях современного ООП имени Гради Буча и ко, то в этом определении надо поменять: 1. слово класс заменить на объект и тогда: "Объект имеет состояние, обладает некоторым хорошо определенным поведением и уникальной идентичностью." 2. А класс соответсвенно это: " ... структура и поведение схожих объектов определяет общий для них класс; термины "экземпляр класса" и "объект" взаимозаменяемы." Так говорит учебник и тот кто его написал :) и это можно принять даже не в качестве бреда
Vasily
Понеслось говно по трубам...
Anonymous
и если опираться на эти определения то довольно заметная часть кода современного энтерпрайза под определение объекта не подходит
Ayrat
Понеслось говно по трубам...
да. Нам надо бота, который бы показывал сколько дней не холиварили за ООП/ФП. Как таблички на производстве - "дней без травм - 5"
Ayrat
@Dolfik идея для следующего бота!!
gsomix
Хорошее получилось обсуждение.
gsomix
Спасибо.
Nikolay
@fvnever я тут упоролся
Nikolay
И написал через DynamicMethod и ILGenerator
Nikolay
Похоже теперь тормозит вызов DynamicMethod :D
Ayrat
Похоже теперь тормозит вызов DynamicMethod :D
а ты профилировал или на глазок?
Ayrat
в студии есть профилятор встроенный хороший
Ayrat
в ентерпрайзной
Nikolay
Expression похоже кидает всё в кучу