Я не думаю, что для этого есть эмпирическое правило, но один систематический способ обдумать это - подумать, нужно ли когда-либо передавать значения, представленные этими дополнительными типами, в вашем коде самостоятельно.Если нет, то вам не нужны эти дополнительные типы.Если да, то они могут быть полезны.
Допустим, у вас есть только Stuff
и:
type DataLeftByA = DataLeftByA of Stuff
type DataLeftByB = DataLeftByB of Stuff
type Events =
| AHappened of DataLeftByA
| BHappened of DataLeftByB
Одна вещь, которую вы можете сделать, это написать функцию:
let processDataA (DataLeftByA stuff) = (...)
Эта функция принимает DataLeftByA
, содержащую некоторое количество Stuff
.Однако тип проясняет, что функцию следует использовать только для событий, вызванных A
.Следующее будет ошибкой типа:
let handleEvent = function
| AHappened adata -> processDataA adata
| BHappened bdata -> processDataA bdata // Type error here!
Если вы определили свой Events
как просто события, совпадающие с Stuff
:
type Events =
| AHappened of Stuff
| BHappened of Stuff
Затем данные, которые переносят ваши событиято же самое, но вы теряете возможность определять такую функцию, как processDataA
, потому что нет отдельного типа для данных, переносимых событием A
.Вы можете просто определить processStuff
, но это может быть вызвано как в случае A
, так и B
.
Я думаю, что это единственное, что делает реальное практическое различие между двумя версиями.Итак, эмпирическое правило будет таким: нужно ли вам когда-либо определять функцию, например processDataA
или нет?