@Fsharp_chat

Страница 672 из 772
アレクセイ
20.08.2018
06:08:52
а Customer это что

Doge
20.08.2018
06:09:43
а Customer это что
Тип сущности чей Id мы описываем

アレクセイ
20.08.2018
06:09:53
а в нём нет Id?

Google
アレクセイ
20.08.2018
06:10:36
я запутался и мне не нравится ) какой-то целый партизанский отряд с предателем, там где на F# одна строчка кода.

Doge
20.08.2018
06:24:55
я запутался и мне не нравится ) какой-то целый партизанский отряд с предателем, там где на F# одна строчка кода.
Ну на F# это тоже одной строкой кода описывается. Если нужны другие типы ключа, то можно либо второй дженерик параметр добавить. [<Struct>] type Id<'a> = Id of id: int64

アレクセイ
20.08.2018
06:26:10
я в упор не понимаю, зачем это

тем более если никакого Customer у меня в поддомене нет

а вот айдишник есть

Doge
20.08.2018
06:29:13
я в упор не понимаю, зачем это
Чтобы не описывать этот тип заново для каждого необходимого типа сущности. Чтобы была возможность писать обобщенный код, в котором есть необходимость достать именно значение id. Можно выкрутиться и с твоим вариантом, но там чуть больше телодвижений будет.

тем более если никакого Customer у меня в поддомене нет
Тогда можно будет сделать маркерный тип для этого.

アレクセイ
20.08.2018
06:30:13
ну вот это я и имею в виду, когда говорю что С# получается не очень подходит для DDD

сделать можно всё, спору нет

но тогда и на С++ можно всё сделать

Doge
20.08.2018
06:31:20
Тут речь шла про то, как типобезопасно описывать Id.

アレクセイ
20.08.2018
06:31:57
нене, речь изначально шла о фичах c#

Google
アレクセイ
20.08.2018
06:32:14
которые асимптотически приближаются к f#

но никак не приблизятся )

с айди это лишь один из примеров

Doge
20.08.2018
06:36:42
нене, речь изначально шла о фичах c#
Ну я видимо это пропустил. Я пришел к тому моменту, когда шла речь уже про Id. И, имхо, это как раз тот случай, когда важно, чтобы описанный код обобщался и твой вариант под это не попадает.

アレクセイ
20.08.2018
06:37:49
не понимаю этот момент с обобщением. Мой вариант - попытка заменить летающие кругом примитивные типы int, string, long на что-то осмысленное и запрячь компилер помогать мне

обобщение тут каким боком?

Doge
20.08.2018
06:39:01
не понимаю этот момент с обобщением. Мой вариант - попытка заменить летающие кругом примитивные типы int, string, long на что-то осмысленное и запрячь компилер помогать мне
Ну Id<'a> - это точно такой же вариант с заменой, только он обьявляется один раз и легче позволяет писать код, который будет работать с id любой сущности.

アレクセイ
20.08.2018
06:40:02
да почему именно Id? я ж уже писал что это частный случай. Что делать с приходящими из базы почтовыми индексами например? это не Id

или вид shareClass финансового фонда? это стринг, но я не хотел бы случайно подать туда имя юзера

Doge
20.08.2018
06:40:51
да почему именно Id? я ж уже писал что это частный случай. Что делать с приходящими из базы почтовыми индексами например? это не Id
По-хорошему надо бы иметь библиотеку типа вот такой: https://github.com/fthomas/refined Но я не знаю, есть ли аналог для F#

Doge
20.08.2018
06:41:53
По-хорошему надо бы иметь библиотеку типа вот такой: https://github.com/fthomas/refined Но я не знаю, есть ли аналог для F#
Она чуть общая, но при желании такие предикаты для неё тоже запросто реализовать.

アレクセイ
20.08.2018
06:41:55
В чем проблема? Непонятно, как залать верный тип Id?
в том что тебе надо TEntity какой-то ещё придумать

три класса там где это ненужно

Friedrich
20.08.2018
06:42:27
В чем проблема? Непонятно, как залать верный тип Id?
Кажись, я понял по описанию товарищей выше.

Bonart
20.08.2018
06:42:43
в том что тебе надо TEntity какой-то ещё придумать
IEntity - один интерфейс там, где это нужно

Doge
20.08.2018
06:43:23
в том что тебе надо TEntity какой-то ещё придумать
Ну в большом количестве приложений, что я видел, тип для сущности уже так или иначе присутствует.

Bonart
20.08.2018
06:43:46
Штука в том, что айдишнику обычно не хватает типа сущности, на который он ссылается

Странно воспринимать его указание как недостаток

Косяк C# в том что приходится тип самого айдишника с собой таскать

Google
アレクセイ
20.08.2018
06:45:04
Ну в большом количестве приложений, что я видел, тип для сущности уже так или иначе присутствует.
я ещё в большем количестве приложений видел обычные инты и лонги, и всем норм )

ну, до первого непонятного бага в продакшене

Doge
20.08.2018
06:45:48
я ещё в большем количестве приложений видел обычные инты и лонги, и всем норм )
Ну тут ничто не мешает добавить "маркерный" тип сущности, который будет только в Id<..> использоваться.

アレクセイ
20.08.2018
06:46:11
ну вот это и называтся "костыли"

Doge
20.08.2018
06:46:30
ну вот это и называтся "костыли"
Зато повторяющегося кода будет меньше, чем в твоем варианте.

И способности к обобщению больше.

Bonart
20.08.2018
06:46:37
ну вот это и называтся "костыли"
Костыли - это по типу на каждый Id городить

アレクセイ
20.08.2018
06:46:46
да всё можно. Можно даже зделат ьчтобы кругом летал тип Customer

надо говорить, чем это плохо?

Bonart
20.08.2018
06:47:31
надо говорить, чем это плохо?
Надо, если это только тип-параметр дженерика а не объект с данными

アレクセイ
20.08.2018
06:48:55
Doge
20.08.2018
06:49:16
https://blog.ndepend.com/marker-interface-isnt-pattern-good-idea/
Только это не маркерный интерфейс. Разные паттерны немного.

アレクセイ
20.08.2018
06:49:42
ну товарищ сказал за маркерный тип

либо я что-то не уловил?

почему не аттрибуты тогда уж?

Bonart
20.08.2018
06:50:24
либо я что-то не уловил?
Да, я сказал, что можно и не маркерный. Маркерные типы я не использую, если без них можно обойтись

Doge
20.08.2018
06:50:26
ну товарищ сказал за маркерный тип
Имелось в виду тип, который используется только в качестве дженерик параметра и всё. Больше нигде не используется и не употребляется.

Google
Doge
20.08.2018
06:51:01
ну товарищ сказал за маркерный тип
А маркерный интерфейс - это абсолютно другой паттерн и тут про него никто не говорил

Bonart
20.08.2018
06:51:42
Имелось в виду тип, который используется только в качестве дженерик параметра и всё. Больше нигде не используется и не употребляется.
Я использую собственно тип-сущность как параметр. Если к нему по тем или иным причинам доступа нет - можно и маркерный.

アレクセイ
20.08.2018
06:51:45
наверное нужны примеры кода, иначе опять не понимаю

Bonart
20.08.2018
06:53:21
Id<Customer, int> - идентификатор заказчика в виде целого числа. Данных самого заказчика в нем нет, но где-то (обычно в специальном сервисе) по идентификатору их можно получить.

アレクセイ
20.08.2018
06:53:57
почему это именно тип, а не как обычно Id<ICustomer, int>

Bonart
20.08.2018
06:55:27
Можно и Id<ICustomer, int> - фишка в том, что на тип сущности ограничений нет. Главное, что тип-идентификатор содержит явное указание на то, какую именно сущность он идентифицирует.

При этом в рантайме - это самый обычный int без оверхеда

アレクセイ
20.08.2018
06:56:12
ну это по сути и есть один из видов markerInterface

Bonart
20.08.2018
06:56:30
ну это по сути и есть один из видов markerInterface
Нет. У тебя сущности типов не имеют?

У меня имеют - а значит их типы маркерными не являются по построению

アレクセイ
20.08.2018
06:57:59
почему нет. Какая ответственность у этого типа (или интерфейса)? только обозначить принадлежность чего-то к чему-то. Точно так же можно было написать class Id: Customer {} где customer - тип безничего

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

Vasily
20.08.2018
06:59:17
Коллеги,вы ща так до комонад договоритесь

アレクセイ
20.08.2018
06:59:23
и это... вуаля marker interface

Bonart
20.08.2018
07:01:18
почему нет. Какая ответственность у этого типа (или интерфейса)? только обозначить принадлежность чего-то к чему-то. Точно так же можно было написать class Id: Customer {} где customer - тип безничего
Ответственность очень простая - Id служит не просто числом или Guid, а идентификатором конкретной сущности. Сама сущность тоже имеет тип - маркеры остаются только у тех, кто для своих сущностей типов не создает.

Ivan
20.08.2018
07:01:48
Вот здесь можно посмотреть на NewType, NumType, FloatType. И вообще много чего приятного для функционального стиля на C#. Но все же это костыли. https://github.com/louthy/language-ext

Bonart
20.08.2018
07:01:49
Зачем нужны сущности без типов в ООП - ХЗ

Doge
20.08.2018
07:02:09
только то что его запихали в дженерик не меняет сути происходящего
Принципиально меняет. Проблемы маркерных интерфейсов (если ты, конечно читал статью, которую сюда скинул) принципиально связаны именно с понятием интерфейса и его стандартными способами использования. А мы говорим про отдельно стоящий тип (который в идеале нужно сделать sealed), для которого это всё не актуально.

Google
アレクセイ
20.08.2018
07:03:53
ну вот и получается огород с наследованием, sealed и прочими дровами

не нравится

f# one love ❤️

Bonart
20.08.2018
07:05:03
ну вот и получается огород с наследованием, sealed и прочими дровами
Где ты видишь наследование? Пока только у тебя на каждый Id создается отдельный тип. А типов сущностей якобы нет, хотя Id ссылается именно на сущность.

Doge
20.08.2018
07:05:10
f# one love ❤️
Ага, только это же может спокойно сделать и в F#, язык тут вообще не причем.

アレクセイ
20.08.2018
07:05:36
зачем? зачем это спокойно делать в f# когдатам есть алгебраические типы?

не убедили вы меня, короч )

Bonart
20.08.2018
07:05:56
『Ark』∞
20.08.2018
07:06:09
f# one love ❤️
F# |> I❤️

Doge
20.08.2018
07:07:01
зачем? зачем это спокойно делать в f# когдатам есть алгебраические типы?
Так чем тебе Id, который мы показывали не алгебраический тип?

アレクセイ
20.08.2018
07:07:24
очень шумно и геморно

Doge
20.08.2018
07:07:43
Это тот же самый вариант, что у тебя, только обобщенный.

アレクセイ
20.08.2018
07:07:58
а так-то у микрософта есть такой вариант в архитектурном туториале

Bonart
20.08.2018
07:08:04
очень шумно и геморно
Тише, чем у тебя по типу Id на каждый тип сущности

アレクセイ
20.08.2018
07:08:47
вот официальный костыль от ms: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/enumeration-classes-over-enum-types

чувство прекрасного СТРАДАЕТ

アレクセイ
20.08.2018
07:10:30
господи, почему опять Id

такое ощущение что некоторые через строчку прыгают

речь шла об алгебраических типах

которые в частности могут состоять из одной опции

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