@Fsharp_chat

Страница 671 из 772
アレクセイ
19.08.2018
16:47:49
Units of measure - Edit: not currently on the horizon

Плакать хочется

Roman
19.08.2018
18:51:55
https://twitter.com/dnesteruk/status/1031041388861775872?s=09

Units of measure - Edit: not currently on the horizon
Кстати пару раз пытался пользоваться, но не зашло. Не говорю, что не нужно, но где ты их используешь?

Google
アレクセイ
19.08.2018
18:54:49
У меня финансы, доллары марочки

Doge
19.08.2018
18:55:18
Кстати пару раз пытался пользоваться, но не зашло. Не говорю, что не нужно, но где ты их используешь?
При вычислениях, где входные данные приходят в одних единицах, внутри при расчетах используются другие. Чтобы при этом не сойти с ума и не запутаться.

アレクセイ
19.08.2018
18:55:20
Но на самом деле я гораздо силнее хотел бы algebraic types в c#

Roman
19.08.2018
18:55:22
アレクセイ
19.08.2018
18:57:14
В частности могло бы быть, но например для нормального ddd чтобы не интежеры вокруг летали а orderId, fundId либо не просто стринг а cusip

с заменой инту я вывернулся через enum например

А со стрингами пока не знаю как быть

Всё слишком громоздко выходит

Я поэтому не понимаю этот холивар по поводу что лучше c# или f#, мне как программисту на с# совершенно очевидно что с# серьёзно отстает и спорить тут не о чем..

Aleksander
19.08.2018
19:12:48
У меня финансы, доллары марочки
Завел UoM для каждой используемой валюты? Обычно от такого останавливает тот факт, что они иногда меняются)

Google
アレクセイ
19.08.2018
19:13:53
Это и так легко на шарпе сделать
На шарпе всё можно. можно и иммутабельность сделать. Но легко? Мммм

Нет.

Bonart
19.08.2018
19:14:56
Вот DU - да, опа

Option - тот приходится делать как Option<Class, RefOption>. Уже хреновато, но иначе будет оверхед

アレクセイ
19.08.2018
19:17:15
Bonart
19.08.2018
19:18:23
Не оч понял что это
Ты хотел вместо int OrderId. На C# проще всего сделать Id<Order, int>

Без оверхеда по памяти вообще

アレクセイ
19.08.2018
19:19:05
Это не с# )

Bonart
19.08.2018
19:20:03
Это не с# )
В смысле? Чем именно?

アレクセイ
19.08.2018
19:20:50
Что это? Класс, структура? Заголовок какой-то?

В f# я бы написал “type​ CustomerId = CustomerId ​of​ ​int”

И всё.

Bonart
19.08.2018
19:29:30
В f# я бы написал “type​ CustomerId = CustomerId ​of​ ​int”
Что F# лучше - вопросов нет. Но конкретно эта задача и для C# имеет хорошее решение.

アレクセイ
19.08.2018
19:30:14
Структура с одним полем
Не ну то что ты написал не скомпилируется

Конечно можно на всё классов насоздавать

Bonart
19.08.2018
19:30:50
Конечно можно на всё классов насоздавать
Структура Id одна, но обобщенная

Google
アレクセイ
19.08.2018
19:32:47
Я наверное чего-то не понимаю

Где слово struct

Где поле

Где мног фигурных скобочек

Где перегруженные операторы сравнения

Где касты к инту

Где касты из инта

Или мне всегда через точку доступаться?

Doge
19.08.2018
19:34:18
В f# я бы написал “type​ CustomerId = CustomerId ​of​ ​int”
У этого варианта есть проблема, он не обобщается же.

アレクセイ
19.08.2018
19:35:28
Во что? И зачем. Можно в int наверное обобщить ?я не спец в ф#. Так, учусь

Bonart
19.08.2018
19:54:58
Я наверное чего-то не понимаю
Тебе полное определение типа прямо в телегу надо? Зачем? Просил простой способ описать Id для сущности - такой способ для C# есть. Да, структуры описываются многословно, но для обощенной структуры это делается один раз. Во всех прочих местах будет Id<Order, int> и все.

アレクセイ
19.08.2018
20:30:09
Ну вот так вот и «легко». Полное определение на f# я в телегу кинул и ничего.

Doge
19.08.2018
20:33:34
Ну вот так вот и «легко». Полное определение на f# я в телегу кинул и ничего.
Да, но только вариант Id<TEntity, TId> делается один раз и сразу для всех вариантов. Это как раз то, что я имел в виду про обобщение.

Friedrich
20.08.2018
04:11:38
Пытался в игре использовать, км в час вот это все)
Я в игре использую! https://github.com/ForNeVeR/1969/blob/bc8ab0d47e5426df6a60340dbe3c834e853f39bf/MarsBaseBuilder/Measures.fs

アレクセイ
20.08.2018
04:15:12
Как?
enum FundId {}; enum CustomerId {}; Это намного изящнее чем городить классы или структы, зато имеем проверки компилятором и без проблем поднимаем инты из базы обычным кастом. (И обратно укладываем)

Для всеразличных спешл кейсов можно делать так enum CustomerId { BillGates = 1564, VladimirP = 26863 } … If(customer==CustomerId.BillGates) {…}

Со стрингами пока ничего такого не придумал

Ayrat
20.08.2018
04:23:07
Со стрингами пока ничего такого не придумал
Со стрингами тоже очевидно можно вывернуться. Имплисит каст и статические поля. Будет что-то типа Color.Red == "Red" При этом слева не просто строка, а объект

Google
Friedrich
20.08.2018
04:23:55
Я видел такое, и мне чёт не очень нравится.

1) Конструктор бы туда кастомный добавить, а то конструирование через каст выглядит стрёмно 2) Увы, не поддерживаются по-настоящему интересные типы идентификаторов навроде Guid

アレクセイ
20.08.2018
04:26:04
Имхо срам.
О чем и речь. Но это лучше чем непонятные инты по всей логике летающие

F# мне нужен

Friedrich
20.08.2018
04:26:36
(в моём ближайшем интерпрейзе все айдишники в базе всегда делают из гуидов, int / long — скорее исключение)

Roman
20.08.2018
04:29:12
В финансах большая часть айди хранится уже десятки лет. Тогда гуидов не было.

アレクセイ
20.08.2018
04:29:44
Именно так. Причём даже там где есть натуральный ключ.

Да, но только вариант Id<TEntity, TId> делается один раз и сразу для всех вариантов. Это как раз то, что я имел в виду про обобщение.
А теперь представь как будет выглядеть обьявление класса с коллекцией тких Id. Пятиэтажные генерики, синтаксический шум. Всё это я проходил.

Friedrich
20.08.2018
04:31:26
class MyDuck : Id<MyDuck, long> или типа того.

アレクセイ
20.08.2018
04:32:52
А как в классе может получиться коллекция Id? Обычно у класса один Id.
Конечно может. Например метод какой нить принимающий коллекцию. DeleteByIds

Roman
20.08.2018
04:33:42
А как в классе может получиться коллекция Id? Обычно у класса один Id.
Например описание трейда может содержать с десяток адишников

Friedrich
20.08.2018
04:33:56
Множественное наследование что ли? Или что?

У сущности обычно один уникальный (в пределах подобных сущностей) идентификатор :(

Roman
20.08.2018
04:34:34
Типа форейн ключи

Friedrich
20.08.2018
04:34:44
Ну то есть поля?

А они тут при чём?

Google
Roman
20.08.2018
04:35:25
Я так понял под коллекцией имелись ввиду поля

Не праймари ключ

Friedrich
20.08.2018
04:35:43
class MuTrade { SomeEntityId Id1 {get;set} OtherEntityId Id2 {get;set} } Нифига не громоздко, и красиво, и правильно выглядит. Тут всё ок с полями.

Пример про DeleteByIds я понял и согласен, что там определение будет самую малость громоздким, хотя на мой взгляд нормально

А, хм, если смотреть пример с Id<TEntity, TId>, то я не знаю, как правильно объявлять поля-ключи от других сущностей :(

Кажется, никак? Просто тупо int OtherEntityId?

Roman
20.08.2018
04:37:28
С фшарпом проблем нет. Он действительно хорошо решает

На цшарпе проще стринги и инты

Friedrich
20.08.2018
04:38:05
С фшарпом проблем нет. Он действительно хорошо решает
Я, например, у публичных функций всегда выписываю сигнатуры. Поэтому у меня вся громозкость будет видна в сигнатурах.

Roman
20.08.2018
04:38:10
Но error prone

Roman
20.08.2018
04:46:59
Привет!

И тебе привет, бот

Doge
20.08.2018
06:00:03
А теперь представь как будет выглядеть обьявление класса с коллекцией тких Id. Пятиэтажные генерики, синтаксический шум. Всё это я проходил.
Нормально смотрится. В большинстве случаев к тому же можно отказаться от дженерик параметра с типом ключа, т.к. есть много приложений, которые везде просто long используют. И тогда оно по количеству символов вообще от твоего варианта отличаться не будет.

Страница 671 из 772