Все тесты сразу написать просто невозможно, ибо нет интерфейса\класса который тестируется, а в его отсутствие код тупо не скомпилится.
Для этого достаточно интерфейса.
Во-первых, тоже не всегда можно без рефакторинга, так как программист в порыве страсти может написать что-то что в принципе не тестируется, либо тестируется сложно, например статический коннекшин к бд.
Мы рассматриваем ситуацию когда алгоритм известен. Например вычисление выражений с приоритетами.
Исключения дает умолчание: при отсутствии роверки ошибка автоматически перебрасывается на уровень выше. В случае если большая часть вызовов не нуждается в особенной обработке это дает экономию и невозможность просто проглотить ошибку.
А можно немножко расшифровать предлагаемый подход.
Вот допустим у нас есть класс AuthorizationService который где то там использует метод GetUser.
Этот метод GetUser должен быть на интерфейсе, допустим, IUserRepository у которого две реализвации EntityFrameWorkUserRepository и XmlFileUserRepository.
С точки зрения существующего C# какие монады
Какие монады или Exception должен декларировать IUserReporsitory?
Как примерно должен выглядеть код обработки ошибок? В AuthorizationService и репозиориях? — т.е. как транслировать ошибки более высокого уровня в более низкого уровня.
При возникновении ошибок как будет выглядеть лог? (В случае Exception мы получаем stack trace).
Еще интересно было бы узнать, как это предлагается сделать в языке мечты автора.
Эта система называется в Windows "Microsoft Store". Достаточно перейти по ссылке и там есть все. Если у кого-то не получается этим воспользоваться то самим терминалом он не сможет пользоваться просто потому, что это техническая программа.
LINQ is monad. It is very carefully designed by Erik Meijer so that it is monad.
Eric Lippert also mentioned:
The LINQ syntax is designed specifically to make operations on the sequence monad feel natural, but in fact the implementation is more general; what C# calls "SelectMany" is a slightly modified form of the "Bind" operation on an arbitrary monad.
Если вы не написали IDE, которая на ходу переводит все идентификаторы и стандартной и сторонних билиотек JS/TS в snake, вероятно, нам надо читать раздел смешение стилей?
А вообще, вы можете сравнить концептуально $mol c каким-то близким фреймворком — он действительно несет что-то новое? Вот автор постоянно постит статьи типа "всего за полчаса я сделал аналог экселя" — там действительно есть какие-то высокоуровневые абстракции которых нет у других или это что-то еще?
И еще. Во фронтенде это принято постоянные префиксы вот такие? Вместо "мама мыла раму" "$mol_мама $mol_рыла $mol_маму"
Извините, я не фронтендер. Перехват хоткеев будет работать только в том случае если производитель браузера имеет такие же взгляды на хоткеи как и производитель приложения?
Выполнение LINQ-запроса легко делегируется другой части системы, что в ORM-аспекте и сделано.
Тут я имею ввиду уровень абстракции на котором определен интерфейс канала (КМК это то же самое что и "порт" в рамках hexagonal architecture)
А в чём профит?
Я встречал два варианта:
Допустим у вас есть какой-то модуль, который может хранить свои данные и в SQL и в плоских файлах. Если сделать "слой query" легко подменяемым (фактически — репозиторий) то можно легко заменять его реализации другими полностью — там где был сложный LINQ с джоинами будет, например вызитывание какого-нибудь смещения в файле. Чтобы по подменить реализации не придется поддерживать linq поверх этих файлов.
Допустим вы разрабатывали какой-то модуль на одной субд, и портировали на другую. В другой субд оказался такой оптимизатор, что некоторые запросы пришлось разбивать на несколько. Например в одной быстрее джоин 5 таблиц, а во второй вычитка данных из первых двух, а потом запрос к остальным трем.
Как будет выглядеть трюк с хуками в данном случае? Будет ли он типобезопасным?
Нет "слоя" query.
Наверное, я использовал неправильный термин. Имелся ввиду "Query extensions"
Query extensions can be placed everywhere. Their intention is to replace read abstractions (Repositories) in software design.
Логически он есть так как у вас есть типа "статический репозиторий" где собраны типовые запросы. Я не вижу механизма который воспрепятствовал бы обращению из бизнес кода к linq напрямую. Вопрос заключается в том, считается ли хорошей практикой из бизнес кода ходить в linq мимо этих репозиториев?
Для этого достаточно интерфейса.
Мы рассматриваем ситуацию когда алгоритм известен. Например вычисление выражений с приоритетами.
Требуется больше итераций и кода на выброс, чем если сначала написать все тесты потом весь код или наоборот.
Лайвкодинг — он разновидность кодинга. Так что он похож на то что делается на работе.
Например, в C# 8
Исключения дает умолчание: при отсутствии роверки ошибка автоматически перебрасывается на уровень выше. В случае если большая часть вызовов не нуждается в особенной обработке это дает экономию и невозможность просто проглотить ошибку.
Если мне не надо дифференцировать, у меня есть Exception
А как потом происходит их обработка? Например, через несколько уровней?
А можно немножко расшифровать предлагаемый подход.
Вот допустим у нас есть класс AuthorizationService который где то там использует метод GetUser.
Этот метод GetUser должен быть на интерфейсе, допустим, IUserRepository у которого две реализвации EntityFrameWorkUserRepository и XmlFileUserRepository.
С точки зрения существующего C# какие монады
Еще интересно было бы узнать, как это предлагается сделать в языке мечты автора.
Эта система называется в Windows "Microsoft Store". Достаточно перейти по ссылке и там есть все. Если у кого-то не получается этим воспользоваться то самим терминалом он не сможет пользоваться просто потому, что это техническая программа.
Собирали на венде — в символах виндовые пути
Наверное, наоборот, какой из mol а какой нет. Какой из нестандартной но не вашей библиотеки, наверное, не позволяет.
https://weblogs.asp.net/dixin/category-theory-via-csharp-7-monad-and-linq-to-monads
As Brian Beckman said in this Channel 9 video:
Eric Lippert also mentioned:
Если вы не написали IDE, которая на ходу переводит все идентификаторы и стандартной и сторонних билиотек JS/TS в snake, вероятно, нам надо читать раздел смешение стилей?
А вообще, вы можете сравнить концептуально $mol c каким-то близким фреймворком — он действительно несет что-то новое? Вот автор постоянно постит статьи типа "всего за полчаса я сделал аналог экселя" — там действительно есть какие-то высокоуровневые абстракции которых нет у других или это что-то еще?
И еще. Во фронтенде это принято постоянные префиксы вот такие? Вместо "мама мыла раму" "$mol_мама $mol_рыла $mol_маму"
Можно писать
Да, попробуйте сами на https://sharplab.io/
А так:
Извините, я не фронтендер. Перехват хоткеев будет работать только в том случае если производитель браузера имеет такие же взгляды на хоткеи как и производитель приложения?
nin-jin сравнивал разные подходы в вебе https://habr.com/ru/post/514144/ там, правда, нет про оверрайд Ctrl+F
Тут я имею ввиду уровень абстракции на котором определен интерфейс канала (КМК это то же самое что и "порт" в рамках hexagonal architecture)
Я встречал два варианта:
Допустим у вас есть какой-то модуль, который может хранить свои данные и в SQL и в плоских файлах. Если сделать "слой query" легко подменяемым (фактически — репозиторий) то можно легко заменять его реализации другими полностью — там где был сложный LINQ с джоинами будет, например вызитывание какого-нибудь смещения в файле. Чтобы по подменить реализации не придется поддерживать linq поверх этих файлов.
Допустим вы разрабатывали какой-то модуль на одной субд, и портировали на другую. В другой субд оказался такой оптимизатор, что некоторые запросы пришлось разбивать на несколько. Например в одной быстрее джоин 5 таблиц, а во второй вычитка данных из первых двух, а потом запрос к остальным трем.
Как будет выглядеть трюк с хуками в данном случае? Будет ли он типобезопасным?
Наверное, я использовал неправильный термин. Имелся ввиду "Query extensions"
Логически он есть так как у вас есть типа "статический репозиторий" где собраны типовые запросы. Я не вижу механизма который воспрепятствовал бы обращению из бизнес кода к linq напрямую. Вопрос заключается в том, считается ли хорошей практикой из бизнес кода ходить в linq мимо этих репозиториев?